Houdini 19.0 キャラクタ

Character Rig Tree View

On this page

概要

Rig Treeビューは、キャラクタコンポーネントを階層で表示し、OBJリグとSOPリグのどちらとも互換性があります。 走査の挙動がオブジェクトリグとSOPリグで若干異なります。

OBJリグ

これは、オブジェクトノードで構成されたリグです。 OBJリグを表示すると、Rig Treeビュー内の各アイテムはリグ内の各オブジェクトノードに呼応します。

オブジェクトノードを含んだサブネットを選択すると、オブジェクトノードの子ネットワークが各ノードの入力と出力に基づいて走査されます。 例えば、subnet1の中にgeo1geo2の2個の子ノードが含まれていて、geo1の出力がgeo2に接続されていたとします。 subnet1を選択すると、Rig Treeビューでは、geo1geo2の親となった単純な階層を表示します。

SOPリグ

これは、ポイントとそれらのポイントを結んだプリミティブの形式でSOPノードの出力によって生成されたリグです。 SOPリグを表示すると、Rig Treeビュー内の各アイテムはポイントを表現します。

SOPノードを選択すると、そのジオメトリが読み込まれ、ポイントとそれらのポイントを結んだプリミティブから階層が生成されます。

挙動のカスタマイズ

Rig Treeビューは、ノードを走査する度に、そのノードのType Definition内に“rigtreeconfig”という名前の構成セクションが含まれていないかどうかをチェックします。 これが見つからなかった場合、Rig Treeビューは選択とドラッグアンドドロップの動作に対してデフォルトの挙動をします。

このrigtreeconfigは、ユーザ側で利用可能なPythonモジュールで、名前を付けたメソッドにクラスインスタンスを登録することで独自の挙動を実装することができます。 独自の挙動を実装したメソッドが見つかれば、デフォルトの挙動は実行されなくなります。

詳細は、以下のサブセクションで説明しています。

"""状況に応じて必要なメソッドを使ってクラスを作成します。"""
class RigTreeConfig:
    def __init__(self,widget):
        self._widget = widget

    """ 独自のRigTreeメソッドを実装します。
        すべてのメソッドは任意で、そのメソッドを実装しなければデフォルトの挙動が使われます。

        def select(self,kwargs):
        def get_selection(self,kwargs):
        def default_output(self,kwargs):
        def drag_drop(self,kwargs):
        def rename(self,kwargs):
        def available_actions(self,kwargs):
        def delete(self,kwargs):
    """

"""rigtreeconfigモジュールのエントリーポイント。親のRigTreeViewウィジェットをこの関数の引数として与えます。"""
def rigtreeconfig(widget):
    return RigTreeConfig(widget)

登録

rigtreeconfigグローバル関数を定義します。

rigtreeconfig関数は、Rig Treeペインが現行ノードを更新する際にコールされます。 widget引数には、親のRig TreeビューPythonウィジェットの参照を指定します。 widgetをクラスのデータメンバーとして保持することで、kwargs引数に欲しい情報を指定しなくてもウィジェットからたくさんの情報にアクセスすることができます。

rigtreeconfig関数は、カスタムクラスのインスタンスを返すようにするか、または、kinefx.ui.rigtreeconfig内のどれかのビルトインクラスのインスタンスを返すようにしてください。

from kinefx.ui.rigtreeconfig import GroupRigTreeConfig
def rigtreeconfig(widget):
    return GroupRigTreeConfig(widget=widget)

デフォルトの出力

このメソッドは、SOPリグのみに関係します。特に複数の出力または入力を持つSOPリグがそうです。

このメソッドは、Rig Treeビューを開いた時にコールされ、どのジオメトリからRig Treeビューを構築するのかを定義します。 そのデフォルトの出力は、ウィジェットのヘッダ上のドロップダウンメニューのインデックスで設定します。

def default_output(self,kwargs):
    """
    インデックスを返すには、`default_output`という名前の値に整数を設定します。
    `show_dropdown`を`False`に設定することで、ドロップダウンメニューを非表示にすることもできます。
    """
    kwargs["default_output"] = 1
    kwargs["show_dropdown"] = True

ツリービューの選択

デフォルトでは、ツリービューを選択すると以下の挙動になります:

  • OBJリグの場合、Rig Treeビュー内のアイテムを選択すると、ネットワークビュー内のそのオブジェクトノードが選択されます。

  • SOPリグの場合、Rig Treeビュー内のアイテムを選択すると、シーンビューア内のそのポイントが選択されます。

この選択の挙動をカスタマイズするには、クラスの中にselectメソッドを入れてください。

def select(self, kwargs):
    """選択の挙動をカスタマイズする。

    これは、選択イベント(サブツリー内のすべてのアイテムを選択、すべての選択の解除、単一アイテムの選択)が発生する度にコールされます。

    - `selection`は選択されたすべてのアイテムのリストです。
    - `selected`は選択されたばかりのアイテムのリストです。オブジェクトノードネットワークの場合、各リストエレメントはそのノードのフルパスです。
      SOPネットワークの場合、存在すればそのポイントに関連付けられている名前です(存在しなければ、デフォルトが使用されます)。
    - `deselected`は選択解除されたばかりのアイテムのリストです。

    """
    # 'selection'を使って何か処理をします。
    print(kwargs['selection'])

Note

ハンドラーが実際にRig TreeビューのUI選択に干渉しないようにする必要があります。 つまり、ハンドラーがRig TreeビューのUI内で選択されたアイテムを変更しないようにする必要があります。

Rig Treeビューのドラッグアンドドロップ

単一アイテムのドラッグアンドドロップに対応しています。 各タイプのリグのデフォルトの挙動は以下の通りです:

  • OBJリグの場合、ドラッグアンドドロップによってオブジェクトノード間の接続を変更することができます。

  • SOPリグの場合、デフォルトではドラッグアンドドロップは何も処理しません。

ドラッグアンドドロップの独自の挙動を定義するには、クラス内にdrag_dropメソッドを定義します。

def drag_drop(self,kwargs):
    """UI内でアイテムがドラッグアンドドロップされる度にコールされます。

    リグを再び走査するように(つまり何かの変更があったことを)UIに知らせるにはTrueを返します。
    再び走査する必要がないならFalseを返します。

    - `item`はドラッグアンドドロップされるデータです。
    - `old_parent_item`はドラッグされる前の`item`の親アイテムを表現したデータです。
      ここで言う親とは、オブジェクトノードの親ではなくてRig Treeビューでの親を意味しています。
      アイテムがトップレベルにあった場合は、これはNoneになります。
    - `new_parent_item`はドロップした後の`item`の親アイテムを表現したデータです。
      `item`がトップレベルに移動した場合は、これはNoneになります。

    """
    return False

アクション

アクションは、ユーザが右クリックで開かれるコンテキストメニューから“ノードアクション”オプションを選択してアクセス可能なカスタム関数です。 デフォルトでは、利用可能なアクションはありません。

リグに対して独自のアクションを定義するには、ノードのType Definitionのrigtreeconfigセクション内にavailable_actions関数を定義します:

def available_actions(self,kwargs):
    """右クリックでコンテキストメニューが開かれる度にコールされます。

    - `selection`を使用することで、現行選択に基づいて利用可能なノードアクションを動的に選択することができます。

    """
    # 選択内容に応じて異なるアクションを返すのか、または、同じアクションを返すのか選ぶことができます。

    return {
        'action_1': lambda: "ここで何かを処理します",
        'action_2': lambda: "ここで他の何かを処理します",
    }

名前の変更

OBJリグの場合、デフォルトでは、名前を変更するとそれに関連付いているオブジェクトノードの名前が変更されます。

SOPリグの場合、名前変更によるデフォルトの挙動がないので、独自に名前変更用の関数を定義する必要があります。

名前変更による独自の挙動を定義するには、rigtreeconfig内にrename関数を定義します:

# rigtreeconfigの中

def rename(self,kwargs):
    """Rig Treeビューを再び走査するように指示するにはTrueを返します。

    変更があっても再び走査される事を保証しない場合にはFalseを返します。例: 何か失敗してrenameで何も変更を発生させたくない場合。

    パラメータ:
    - `item`: 名前が変更されるアイテムを表現します。ここには、ノードパス(OBJリグの場合)または番号(SOPリグの場合)を指定することができます。
    - `old_name`: これまで表示されていた名前。
    - `new_name`: ユーザが要求した新しい名前。

    NOTE:
        renameイベントは、`old_name`と`new_name`が同じ場合でも発動されます。

    """
    # ここで名前変更による何かの処理をします...
    return True

削除

削除によるデフォルトの挙動がないので、独自の削除用の関数を定義する必要があります。

削除による独自の挙動を定義するには、rigtreeconfig内にdelete関数を定義します:

# rigtreeconfigの中

def delete(self,kwargs):
    """Rig Treeビューを再び走査するように指示するにはTrueを返します。

    変更があっても再び走査される事を保証しない場合にはFalseを返します。例: 何か失敗してdeleteで何も変更を発生させたくない場合。

    パラメータ:
    - `selection`は選択されたすべてのアイテムのリストです。

    """
    # ここで何かしらの削除の処理をします... 例えば、ポイントを削除したり、オブジェクトノードを削除します。
    return True

API

アイテムは“アイテムID”によって個別に識別されます。 SOPリグの場合、このアイテムIDはポイントインデックス(つまり整数)です。 OBJリグの場合、このアイテムIDはオブジェクトノードのフルパス(例えば、“/obj/myrig/shoulder1”)です。

selectItem(self, item_id, select_if_true, enable_handler=True)bool

Rig Treeウィジェット内のitem_idに相当するアイテムを選択または選択解除します。 合致したアイテムが見つかればTrueを返します。 見つからなければFalseを返します。 enable_handlerFalseに設定すると、デフォルトまたはユーザ定義の選択ハンドラー(つまり、rigtreeconfig内のselect)は発動されなくなります。

selectedItems(self)list

選択されたアイテムのIDのリストを返します。

clearSelection(self, enable_handler=True)

Rig Treeビューの現行選択をクリアします。 enable_handlerselectItemと同じ様に動作します。

getCurrentNodePath()str or None

現行リグを表現したノードのフルパスを取得します。 現在何もノードが走査されていなければ、Noneを返します。

setNode(node)

nodeで表現されたリグを走査します。 nodeがRig Treeウィジェットで表示されている現行ノードだった場合は、再び走査されることはありません。

resetCurrentNode()

現行ノードを再び走査します。

キャラクタ

KineFXのキャラクタ

SOPベースのリグを使ったジオメトリレベルのプロシージャルリギングとアニメーション。

オブジェクトレベルのキャラクタ

ボーンベースのリグを使ったオブジェクトレベルのリギングとアニメーション。

ペイン