On this page
この機能はまだ開発中です。現在の機能は未完成で変更される予定であり、 ドキュメントが手薄だったり、なかったりします。 これを使用するときは、そのことに我慢してください。

概要

KineFXリギングおよびアニメーションフレームワークでは、キャラクタのスケルトンは、ジオメトリレベルでポリゴンラインで繋がったポイントで表現されます。 このジョイントベースのシステムでは、SOPノードを使用してキャラクタのジョイント階層を作成および編集し、そこからキャラクタのスケルトンとスキンを作成および操作することで、プロシージャルにキャラクタを構築することができます。 そして、このキャラクタがリグロジックに渡されて、そのキャラクタリグの挙動が決定します。

Houdini20より前のバージョンでは、キャラクタのリグロジックは(Rig Pose SOPなどの)リグビヘイビア系ノードに存在し、評価もそれらのノード上でされていました。 これは、ネットワークでリグの挙動を決定する部分に達すると、ネットワーク上のまさにその場所でこの機能を評価しなければならないこと意味しました。 つまり、リグロジックとリグ評価の両方が、ネットワーク上の同じ場所に結び付けられていたわけです。

以下の例は、Houdini20より前のバージョンのシンプルなリギングセットアップです。 チューブジオメトリを変形させています。 リグの入力は、チューブジオメトリ、スケルトン、ジオメトリ上のキャプチャウェイトを作成することでセットアップされています。 Rig Pose SOPでは、スケルトンのポーズを操作(スケルトンを変形)し、キーフレームを設定してアニメーションを追加することができます。 その後、そのRig Pose SOPはそのスケルトンの変形とアニメーションを評価し、この評価の結果がBone Deform SOPに渡され、そこでもう1つの評価が実行されてジオメトリが変形されます。

Houdini20より前のバージョンのKineFXリグの評価

この方法にはいくつかの問題があります:

  • スケルトン上のジオメトリを変形させるために、評価ステップが2回あります。1つはRig Pose SOP、もう1つはBone Deform SOPで、この2つの間には評価の依存関係があります。

  • リグロジックとリグ評価が結び付けられています。Rig Pose SOPでスケルトンのポーズを変更する度に、その変更が評価されます。

  • アニメーション(Rig Pose SOP上)と変形の結果(Bone Deform SOP上)を、別々のノードで確認する必要があります。

APEX (All-Purpose EXecution)

Houdini20からAPEX(All-Purpose EXecution:多目的な実行)が導入されました。 これはHoudiniの新しいグラフ評価フレームワークで、グラフを構築および実行し、その結果を取得します。 KineFXリギングフレームワークでは、リグロジックの表現にAPEXグラフが使用されます。

APEXでは、グラフはロジックのピースであり、評価時に特定のタスクを実行します。 APEXグラフを構築して、より複雑な機能を実行することもできます。 例えば、キャラクタ全体の挙動を決めたり、スケルトンのFK階層を組み上げたり、ジオメトリ変形のロジックを組むことが可能です。

APEXによるリギングでも、変形させる入力要素を組み立てて準備する手順に変わりはなく、 ジオメトリ、スケルトン、ジオメトリ上のキャプチャウェイトを作成します。 ただ変わったのは、APEXグラフでリグロジックを表現するようになったことです。

Houdini20より前のバージョン

Houdini20

リグ入力の組み立てと準備 スケルトンの構築キャプチャウェイトの作成 Houdini20より前のバージョンと同じ
リグロジック リグビヘイビア系ノード

(Rig Pose SOPIK Chains SOPFull Body IK SOPなど)

APEXグラフ

APEXは、SOP下のレイヤーに居座り、どのネットワークコンテキストにも縛られていません。 Python API、他のAPEXグラフ、SOPを使用して、APEXグラフを構築、操作、実行することができます。 将来的には、APEXグラフにアクセスしてそれを利用できる他のコンテキストが登場する可能性があります。

Note

VOPやVEXを使い慣れたユーザにとって、APEXはVEXより上位で、SOPより下位の、中レベルのビジュアルプログラミングフレームワークです。 VOPで使える型は、VEXが理解できる型に制限されています。 APEXは実質的には(拡張可能なタイプシステムを介して)より多くの型に対応したプロシージャルなVOPです。

遅延評価

SOPコンテキストでは、APEXグラフはジオメトリのピースになっています。 APEXグラフで表現されるリグロジックは、SOPネットワーク内で構築され、そのAPEXグラフがSOPノードからSOPノードへ渡されると、ロジックの一部がAPEXグラフに追加、変更されていきます。 APEXグラフの構築が完了すると、(APEX Invoke Graph SOPまたはPython SOPを使用して)あなたが選択したネットワーク上の場所で、または、ビューポートで特定のアクションを介して、リグロジックが評価されます。

このリグロジックの 遅延評価 という考え方により、リグロジックピースをプロシージャルに構築し、それらのピースを組み立てることができます。 リグを何度も評価したり計算する必要がないため、パフォーマンスが大幅に向上します。 ネットワークがRig Pose SOPなどのリグビヘイビア系ノードに到達する度に評価が実行されるわけではなく、いつ、どこでリグロジックを評価するかを選択することができるのも遅延評価の特長です。 APEXでは、グラフの評価は常に遅延されます。 グラフロジックを構築し終えたら、ネットワーク内の下流のどこかでそのグラフを評価することになります。

以下のAPEXワークフローの例では、すべてのリグロジックはAPEX Edit Graph SOPbone_deform_rigにあります。 このリグロジックはネットワークのどの部分でも評価されず、リグのセットアップ工程(リグ入力の組み立てとリグロジックの定義)とリグ評価が明確に区別されています。

アニメーション向けのAPEXリグセットアップ

APEXでのリギング

APEXリギングワークフローでは、手動でグラフを作成するか、または、リグコンポーネントを使用して、リグロジックを構築することができます。 下図の例では、紫色のノードがアニメーションの準備としてリグロジックを構築し、キャラクタを作成し、シーンを組み立てます。

キャラクタの作成とアニメーションシーンの組み立ての詳細については、パックキャラクタフォーマットおよびアニメーションワークフローを参照してください。

APEXリギングワークフロー

グラフの構築

APEXグラフは、入力パラメータの形式でデータを取り込み、そのデータに対して演算を実行し、データを出力として取得できるようにします。 グラフ内では、ジオメトリと他のタイプを一緒に制御することができます。 例えば、スケルトンジョイントのトランスフォームに対して、数値演算や行列演算を1つのグラフ内で行なうことができます。

APEXグラフでの数値演算とジオメトリ

Note

APEXグラフが出力できるデータのタイプは、そのAPEXグラフが実行されているコンテキストによってのみ制限されます。 APEXグラフをSOPで実行する場合、そのAPEXグラフはジオメトリ、さらには、そのジオメトリ上の辞書アトリビュートに格納可能などんなデータも出力することができます。 APEXグラフをPythonで実行する場合、そのAPEXグラフはPythonの型にキャスト(型変換)可能なデータを出力することができます。

APEXネットワークビューを使用してグラフを視覚化および構築することができ、そのグラフをAPEX Edit Graph SOPに直接書き込むことができます。 グラフの構築を開始するには、以下を実行します:

  1. ネットワークエディタ内のジオメトリレベルで、APEX Edit Graph SOPを作成します。

  2. APEX Edit Graph SOPを選択した状態で、APEXネットワークビューを開きたいペインの上部にある New Tabアイコンをクリックし、 New Pane Tab Type ▸ Animation ▸ APEX Network View を選択します。

そのAPEX Edit Graph SOPに格納されているグラフがAPEXネットワークビューに表示されます。

グラフ構造はジオメトリとして表現され、そのグラフ内のノードはビューポートではポイントとして表現され、ノード間の接続はそれらのポイント間のラインとして表現されます。 以下の例では、グラフノードとその接続の位置とカラーがそのままビューポート内のポイントおよびエッジに関連付けられています。

APEXネットワークビューのグラフ
ビューポートに表現されたAPEXグラフ

グラフノードの位置やカラーが変化すると、ビューポートのジオメトリに反映されます。

APEXネットワークビューのグラフ
ビューポートに表現されたAPEXグラフ

グラフとジオメトリのコンポーネントには、次のような相関関係があります:

グラフ(APEXネットワークビューで視覚化)

ジオメトリ(ビューポートで視覚化)

ノード

ポイント

ワイヤー

ラインプリミティブ

接続したノードの入出力ポート

頂点

inputノードの入力パラメータ

ジオメトリ上に格納されたパラメータ

グラフノード、サブグラフ、サブネット

グラフノードは特定の演算を実行し、そのグラフノードはAPEX関数Verb(動詞)、サブグラフ、サブネットのどれかで表現することができます。

APEX関数

APEX関数は、入力ポートに接続されているものに対して特定の演算を実行します。

Verb

VerbはOPノードの基本演算部分です。 これは、キャッシュ化、入力の読み込み、パラメータの評価といったノードに関係する他の処理を含んでいません。 例えば、Joint Deform SOPbonedeform VerbのHDAラッパーなので、APEXグラフ内ではJoint Deformを使用できませんが、bonedeformは使用できます。

サブグラフ

サブグラフはロックされたグラフで、HDAと同様に、サブグラフを修正すれば、そのサブグラフのすべてのインスタンスが修正されます。 サブグラフの例を挙げると、SmoothIKノードがそうです。

サブグラフは、.bgeoジオメトリファイル形式で サブグラフライブリラリ として保存します。 そのサブグラフライブラリは、以下の構造を持ちます:

  • 単一のアンパックAPEXグラフで、そのサブグラフ名はname Detail アトリビュートで定義されています。

    または

  • いくつかのパックジオメトリプリミティブで、それぞれのパックプリミティブにAPEXグラフが含まれています。 パックプリミティブ毎に、そのサブグラフ名がトップレベルのname Primitive アトリビュートで定義されています。

サブグラフの.bgeoファイルは、@/apexgraphディレクトリから読み込まれます。 @HOUDINI_PATH内のディレクトリに展開されます。

サブネット

サブネットは、複数のグラフノードを単一ノード内にカプセル化したコンテナです。 これによって、サブネット内部に含まれているグラフが簡素化され可読性が良くなります。 同じ中身を持つサブネットをいくつも作成した場合、それらのサブネットの1つを更新しても他のサブネットには影響しません。

To...Do this

アンパックグラフをサブグラフライブラリファイルに保存する。

アンパックAPEXグラフをサブグラフライブラリファイルに保存する時、そのグラフ上に必ずname Detailアトリビュートを作成してください。 APEXネットワークビューで作成されているサブグラフノードは、このnameアトリビュートで定義されます。

アンパックグラフをサブグラフライブラリに保存する
  1. Attribute Create SOPを使用してnameアトリビュートを作成します:

    • Namenameに設定します。

    • ClassDetail に設定します。

    • TypeString に設定します。

    • String パラメータには、サブグラフに付けたい名前を指定します。これがAPEXネットワークビューアの⇥ Tabメニューでサブグラフを検索する時に表示される名前です。

  2. ROP Geometry Output SOPを使用して、サブグラフをサブグラフライブラリファイルに保存します:

    • Output File パラメータに、そのサブグラフライブラリ(.bgeo)ファイルのパスとファイル名を設定します。 このサブグラフライブラリファイルは、必ずHOUDINI_PATH内のapexgraphディレクトリ(例えば、$HIP/apexgraph/test.bgeo)に保存してください。

    • Save to Disk をクリックします。

その保存されたサブグラフを読み込むには:

  1. Pythonシェルを開き( Windows ▸ Python Shell )、以下のコマンドを叩きます:

    import apex
    apex.Registry().reloadSubgraphs()
    
  2. ネットワークエディタ内でAPEX Edit Graph SOPを選択するか、または新しくAPEX Edit Graph SOPを配置します。 これで、APEXネットワークビュー内で⇥ Tabメニューを使用してそのサブグラフが検索できるようになります。

パックグラフをサブグラフライブラリファイルに保存する。

Pack Folder SOPを使用して、グラフをパックフォルダ構造に追加します。 このPack Folder SOPは、グラフ毎にname Primitiveアトリビュートを作成します:

パックグラフをサブグラフライブラリに保存する
  1. Pack Folder SOPで:

    • Pack Output トグルを有効にして、接続されたサブグラフをパック化します。

    • 既にパックされているサブグラフにさらにパックレベルが追加されないように、 Only Pack Unpacked トグルを有効にします。

    • Pack Folder SOPに入力が接続されると、 自動的に Name パラメータに値が入力されます。このPack Folder SOPの入力の順番が Name パラメータにリストされている順番に呼応しています。

      Name パラメータには、各サブグラフに付けたい名前を設定します。 これは、APEXネットワークビューの⇥ Tabメニューでそのサブグラフを検索する時に表示される名前となります。 Type パラメータを空っぽのままにすると、そのサブグラフノード名には何も拡張が追加されません。

  2. ROP Geometry Output SOPを使用して、サブグラフをサブグラフライブラリファイルに保存します:

    • Output File パラメータに、そのサブグラフライブラリ(.bgeo)ファイルのパスとファイル名を設定します。 このサブグラフライブラリファイルは、必ずHOUDINI_PATH内のapexgraphディレクトリ(例えば、$HIP/apexgraph/test.bgeo)に保存してください。

    • Save to Disk をクリックします。

その保存されたサブグラフを読み込むには:

  1. Pythonシェルを開き( Windows ▸ Python Shell )、以下のコマンドを叩きます:

    import apex
    apex.Registry().reloadSubgraphs()
    
  2. ネットワークエディタ内でAPEX Edit Graph SOPを選択するか、または新しくAPEX Edit Graph SOPを配置します。 これで、APEXネットワークビュー内で⇥ Tabメニューを使用してそのサブグラフが検索できるようになります。

すべてのサブグラフインスタンスを更新する

サブグラフに変更を加えた後は、以下の操作によって、すべてのサブグラフインスタンスが更新されます:

  1. サブグラフをサブグラフライブラリ(.bgeo)ファイルに保存します。ROP Geometry Output SOPで、 Save to Disk をクリックします。

  2. Pythonシェルを開き( Windows ▸ Python Shell )、以下のコマンドを叩きます:

    import apex
    apex.Registry().reloadSubgraphs()
    

サブネットを作成する

  1. APEXネットワークビュー内でサブネットに格納したいグラフノードをボックス選択します。

  2. 選択されたノードをクリックして、 ▸ Collapse to Subnet を選択します。

サブネットのポート名を変更する

サブネットの中に入って、inputノードまたはoutputノードのポート名を変更します。ポート名をクリックすることで、そのポートの名前を変更することができます。

ポート

APEXネットワークビューでは、ノードの ポート 間にワイヤーを作成することで、それらのノードを接続することができます。 ポート値は、ポート接続、ノードパラメータウィンドウで設定された値、特定のデフォルト値のどれかで決まります。

ノードパラメータウィンドウは、ポートの値を編集するのに使用します。 ノードパラメータウィンドウを開くには、グラフノードを選択して P を押します。

ポート

接続されたポート

接続からの値は、ノードパラメータウィンドウで設定された値を上書きします。

未接続なポート

未接続なポート値は、ノードパラメータウィンドウで設定された値、それに呼応するSOP Verbノード、APEX内部で設定されたデフォルト値のどれかで決まります。

ノードパラメータウィンドウ

ノードパラメータウィンドウで表示されたポートのうち、その値フィールドの背景が黒いポートは、Geometry Spreadsheet内のparms辞書Pointアトリビュートに存在します。 以下の場合にポートがparms辞書Pointアトリビュートに出現します:

  • ノードパラメータウィンドウでポート値を直接設定した場合。

  • (例えば、APEX Edit Graph SOPImport SOP Nodes ボタンを使用して)SOPノードをAPEXグラフにインポートし、(パラメータエディタで)そのSOPノードにデフォルトでないSOPパラメータ値が指定された場合。

ノードパラメータウィンドウで表示されたポートのうち、その値フィールドの背景が灰色のポートは、parms辞書Pointアトリビュートには存在しません。 これらのポート値は、以下に基づいて設定されます:

  • SOP Verbノードの場合、そのポートには、そのSOP Verbノードのデフォルトパラメータ値が設定されます。

  • 非SOP Verbノードの場合、そのポートは、APEX内部で定義されているデフォルト値に初期化されます。

Note

ノードパラメータウィンドウに表示されている値は、必ずしもそのポートで使用される値とは限りません。 ポートがGeometry Spreadsheet内のparms辞書Pointアトリビュートに存在しなかった場合、ノードパラメータウィンドウのそれに呼応する値は使用されません。

異なるポートカラーは、そのポートの異なるデータタイプを表しています。 また、ポートには、 Variadic Port(可変長ポート)In-Place Port(インプレースポート) の2つの特別なタイプが存在します:

Variadic Port(可変長ポート)

可変長ポートには複数の接続を作成することができ、ノード上に サブポート が作成されます。 いくつかのノード上に存在するnextポートがこの可変長ポートの例です。 他にも特定のノード上に別の可変長ポートがあります。例えば、Addノードのbポート、GetPointTransformsノードやSetPointTransformsノードのtransformsポートがそうです。

可変長ポートの接続

In-Place Port(インプレースポート)

インプレースポートの値は、コピーを作成せずに更新されます。インプレースポートは正方形のマークで識別できます。

インプレースポート

基本的なグラフ操作

このセクションのサンプルでは、以下の基本的な構造を見ていきます:

  • グラフロジックを作成する方法

  • グラフを評価(実行)する方法

以下のサンプルファイルでは、このセクションの基本的なグラフオペレーションを実行するAPEXグラフの作成方法を説明しています。

APEXGraphExamples

2つの値を加算する

以下の例では、2つの値を加算するグラフの作成方法を紹介しています。 データをグラフに入力し、そのグラフの出力を表示する基本的なワークフローについて説明します。

グラフロジックを作成する

2つの値(ab)を加算するロジックを作成します。

  1. ネットワークエディタ内のジオメトリレベルで、APEX Edit Graph SOPを作成します。

  2. APEX Edit Graph SOPを選択したまま、APEX Network Viewを開きます。APEXネットワークビューでは、APEX Edit Graph SOPにグラフを直接書き込むことができます。

  3. APEXネットワークビュー内で、簡単な数値演算を実行するグラフを作成します:

    • グラフ入力ノードとグラフ出力ノードを追加します:

      • 入力パラメータを受け取るノードを追加します。TABを押してTabメニューを開き、 Input を選択します。するとinputノードがグラフに追加されます。

      • Tabメニューで Output を選択してグラフ出力ノードを追加します。

    • 単純な加算演算を実行するAdd<Float>ノードを追加します。

    • それらのノードを以下のように接続します:

      addノードのbは可変長ポートなので、複数の接続が可能であり、b<x>という名前のサブポートが作成されます。

      APEXネットワークビューでノードを接続

この時点では、グラフの入力は定義されておらず、グラフは評価も計算もされていないため、何の出力も結果もありません。 グラフは、ジオメトリとして表現されたロジックの一部(ピース)でしかありません。

入力を定義する

加算演算の入力のabを定義します。 数値入力は辞書形式で格納する必要があるため、基本的に辞書が入力データのコンテナとなります。 辞書にはキー/値のペアを格納し、この場合だとabがキーです。 Attribute Adjust Dictionary SOPを使用して、入力パラメータの辞書を作成します。

ネットワークエディタ内のジオメトリレベルで、Attribute Adjust Dictionary SOPを追加して、abの値を設定します:

  1. Set Values セクションで、 Number of Entries の横にあるをクリックし、2個のエントリを作成します。

  2. 1つ目のエントリを以下のように設定します:

    • Key :a

    • Type : Float (float値を加算します)

    • Value :値をaに割り当てます。

  3. 2つ目のエントリを以下のように設定します:

    • Key :b

    • Type : Float

    • Value :値をbに割り当てます。

デフォルトでは、 Attribute NameparmsAttribute ClassDetail に設定されているため、parmsという名前のDetailアトリビュートが作成されます。 この新しいparmsアトリビュートはGeometry Spreadsheetで確認することができます:

  1. Geometry Spreadsheetを開きたいペインの上部にある New Tabアイコンをクリックし、 New Pane Tab Type ▸ Inspectors ▸ Geometry Spreadsheet を選択します。

  2. 上部のツールバーから Detailを選択します。

グラフロジックを評価する

これでグラフロジックとグラフ入力が定義されました。 グラフを呼び出す(評価する)には、APEX Invoke Graph SOPを使用します。 ネットワークエディタ内のジオメトリレベルで、APEX Invoke Graph SOPを追加します。

  1. 追加したノードを接続します:

    • APEX Invoke Graph SOPの1番目の入力はAPEXグラフを受け取ります。ネットワークエディタで、(APEXグラフを含んでいる)APEX Edit Graph SOPの出力をAPEX Invoke Graph SOPの1番目の入力に接続します。

    • APEX Invoke Graph SOPの2番目の入力は、入力として使用したいデータを受け取ります。辞書形式の数値でも、通常のジオメトリでも構いません。Attribute Adjust Dictionary SOPの出力をAPEX Invoke Graph SOPの2番目の入力に接続します。

    グラフを使用して2つの数値を加算する
  2. APEX Invoke Graph SOPで、入力を指定します:

    • Input Bindings に横にあるをクリックして、入力を追加します。

    • デフォルトでは、 Dictionary To Bind がオンで、parmsに設定されています。既にAttribute Adjust Dictionary SOPを使用してparmsという名前の入力を辞書として定義しているので、これは既に望ましい設定になっています。

  3. APEX Invoke Graph SOPで、取得する出力を指定します:

    ここでは(ジオメトリではなく)数値を取得したいので、 Output Dictionary Bindings の横にあるをクリックして、取得したい出力を指定します。出力は辞書形式で格納されます。

    • Apex Outputs Group は、グラフ内の出力ノードの名前です。ここではoutputです。

    • Output Attrib には、出力される辞書の名前(output_parms)を設定します。

この新しいoutput_parms辞書に計算結果が格納されます。 Geometry Spreadsheetの上部のツールバーから Detailを選択することで、これを確認することができます。 output_parms辞書では、result(グラフのoutputノードのポート名)キーの値にa + bが設定されています。

APEX Invoke Graph SOPはAPEXグラフのロジックを評価(計算)し、その結果を返します。 Attribute Adjust Dictionary SOPでabの値を変更すると、そのAPEX Invoke Graph SOPで計算された出力の辞書が新しい合計値に更新されます。

2つの結果を取得する

これから、前の例のグラフロジックを使用し、元の結果に対して別の演算を実行して2つの結果を取得したいと思います。

グラフロジックを作成する

前のグラフに、その結果の合計値を除算するノードを追加します。そして除算演算の結果を出力するようにします。

  1. APEXネットワークビューで、Divide<Float>ノードを追加します。以下のようにノードを接続します(この例では赤のノードが新たに追加したノードです)。この例では、divideノードとoutputノードのサブポート名を変更しています。divideノードのbポートは可変長入力です。

    Note

    サブポート名はその名前の上でクリックすることで名前を変更することができます。

    2つの結果を出力するグラフロジック

    これでoutputノードには2つの値が出来ました。

  2. divideノードで値を設定します。

    • divideノードを選択し、Pを押してノードパラメータウィンドウを表示します。

    • divideは、abで除算します。ノードパラメータウィンドウで、aの値を1.0などに設定します。denominatorは前の加算演算からの値なので、そのままにします。

    Note

    接続からの値は、ノードパラメータウィンドウ内で設定された値を常に上書きします。 この例では、denominatorの値は、divideノードパラメータウィンドウで値を設定しても、add演算の結果で上書きされます。

グラフロジックを評価する

グラフ入力は変わっていないため、Attribute Adjust Dictionary SOPでは何も変更する必要はありません。

グラフ出力に関しては、APEX Invoke Graph SOPは前と同じようにグラフのoutputノードから取得します。 違いは、1つの結果(add_resultの2つの入力の合計値)だけでなく、2つ目の結果(add_divide_resultの除算結果)も取得することです。 SOPで、両方の結果が1つの辞書に格納されます。

Geometry Spreadsheetで、グラフのoutputノードから取得された値を確認します:

  1. ネットワークエディタでAPEX Invoke Graph SOPを選択します。

  2. Geometry Spreadsheetで、上部のツールバーから Detailを選択します。

  3. outputノードから次の2つの値が取得されています:

    • add_result:グラフ入力のabの合計値

    • add_divide_result:<Divideノードのポートa> / <グラフ入力のabの合計値>

Note

出力される辞書には、APEX Invoke Graph SOPの Apex Outputs Group パラメータで指定したグラフ出力ノードの すべて の結果が含まれます。

部分評価

以下の例では、 部分評価 という考え方を紹介します。 要求された出力のみを取得し、その出力のみを計算して、残りのグラフロジックは無視します。

グラフロジックを作成する

前の例の加算と除算のグラフから開始します。もう1つ出力ノードを追加し、元の出力ノードと違う名前を付けます。

  1. 2つ目の出力ノード(Subnet Outputs)を追加し、その名前をoutput2に変更します。

  2. Multiply<Float>ノードを追加します。

  3. 以下のようにノードを接続します(この例では赤のノードが新たに追加したノードです):

    グラフロジックの部分評価
  4. multiplyノードで値を設定します。

    • multiplyノードを選択し、Pを押してノードパラメータウィンドウを表示します。

    • ノードパラメータウィンドウで、aの値を2.0などに設定します。b0は前の除算演算からの値なので、そのままにします。

グラフロジックを評価する

取得された結果を確認します:

  1. ネットワークエディタでAPEX Invoke Graph SOPを選択します。

  2. Geometry Spreadsheetで、上部のツールバーから Detailを選択します。

前の例と同じように、元のoutputノードから同じoutput_parms辞書が取得されています(取得される値はadd_resultadd_divide_result)。 もう一方の出力ノードを指定しても、APEX Invoke Graph SOPはその指定した出力ノードの値だけが取得されます。

Note

この場合では、グラフロジックに対して部分評価が実行されます。 outputの値のみが要求されているため、outputノードの値を計算するロジックだけが実行されます。 output2の値を計算するロジックは無視されます。

新しい出力ノードのoutput2からも値を取得するには:

  1. APEX Invoke Graph SOPで、 Output Dictionary Bindings の横にあるをクリックし、取得する出力ノードをもう1つ追加します。

  2. 新しい Output Dictionary Bindings エントリで:

    • Apex Outputs Groupoutput2に設定します。ドロップダウンボックスからoutput2を選択することができます。

    • Output Attrib には、出力される辞書の名前(output2_parms)を設定します。

取得された値を確認します:

  1. ネットワークエディタで、APEX Invoke Graph SOPを選択します。

  2. Geometry Spreadsheetで、上部のツールバーから Detailを選択します。

2個の出力ノードのoutputoutput2からの値が計算され、取得され、それらの結果がoutput_parmsoutput2_parmsという2つの辞書に格納されています。

数値演算に基づいてジオメトリを変更する

以下の例では、加算演算の結果に基づいてボックスジオメトリのサイズを変更する方法を説明します。

グラフロジックを作成する

  1. 2つの数値を加算するグラフから始めます。

    2つの数値を加算するグラフロジック
  2. ボックスジオメトリ(sop::boxノード)を追加します。Add演算のresultはボックスジオメトリのscaleに接続されているので、そのAdd演算の合計値がボックスのサイズに影響します。

    ボックスジオメトリのサイズに影響する数値演算

グラフロジックを評価する

今回は、単なる数値ではなくジオメトリを取得します。ボックスを表示するには、outputノードでボックスジオメトリを取得する必要があります:

  1. APEX Invoke Graph SOPで、 Bind Output Geometry をオンにし、その値をoutput:geo(<出力ノードの名前>:<出力ノードのジオメトリ>)に設定します。

APEX Invoke Graph SOPのDisplayフラグをオンにします。ビューポートにボックスが表示されます。

ジオメトリから情報を取得して使用する

ジオメトリから情報を取得し、その情報を使用して追加で演算を実行することができます。 以下の例では、ボックスジオメトリのコーナーに球を配置します。 入力パラメータを変更すると、ボックスと球体の両方のサイズが変化します。

グラフロジックを作成する

  1. 前の例のボックスジオメトリのグラフから開始します。

  2. 下図の赤いノードを追加します。このグラフロジックでは、球はボックスジオメトリ内の特定のコーナーに配置され、その球とボックスが1ジオメトリとしてマージされて出力されます。

    ボックスジオメトリから情報を取得し、追加の演算を実行

ノード

説明

box_point

box_point PointAttribValueノードは、ボックス上のポイントの1つ(コーナー)の位置を設定します。box_pointsphereノードのトランスフォームであるtに接続しているため、ボックス上の指定したポイントの位置に球の中心が来ます。

ポイントの位置を設定するには:

  • box_pointノードを選択し、Pを押してノードパラメータウィンドウを表示します。

  • attribnamePに設定します。

  • elemnum には、球を配置したいボックス上のポイント番号を設定します。

multiply

multiplyノードはsphereノードのscaleに接続しているため、そのmultiplyの結果が球のサイズに影響します。この例では、ボックスに取り付ける球は小さい方が見やすいため、multiplya1.0より低い値に設定します。

aの値を設定するには、multiplyノードを選択し、Pを押してノードパラメータウィンドウを表示します。

merge_box_sphere

boxノードとsphereノードのgeo出力をmerge_box_sphere MergedPackedノードに接続し、ボックスと球を1つのジオメトリとして結合します。

merge_box_sphereノードの出力をoutputノードに接続し、結合されたボックスと球のジオメトリを取得できるようにします。

グラフロジックを評価する

ボックスと球を一緒に表示するには、outputノードからボックスと球が結合されたジオメトリを取得する必要があります:

  1. APEX Invoke Graph SOPで、 Bind Output Geometry をオンにし、その値をoutput:box_sphere_geo(<出力ノードの名前>:<出力ノードの結合されたジオメトリ>)に設定します。

  2. APEX Invoke Graph SOPのDisplayフラグをオンにし、ビューポートにボックスと球を表示します。

    Attribute Adjust Dictionary SOPを選択し、パラメータエディタにグラフ入力パラメータのabを表示します。 ただし、APEX Invoke Graph SOPのDisplayフラグはオンのままにします。 Attribute Adjust Dictionary SOPでabの値を調整すると、ビューポートでボックスと球のサイズが変わります。

    ボックスのポイント上に留まる球

Animateステート用のグラフ

Animateステート は、シーン内に複数のキャラクタを表示することができる新しいビューアステートです。 キャラクタに対してFKやIKなどのポージングを実行したり、キャラクタのコントロールを操作したり、キャラクタ間に拘束を作成することができます。 Animateステートは、APEXグラフを解釈し、そのAPEXグラフを評価し、その評価された出力をビューポートに表示します。

Animateステートで評価できるグラフを構築するには、通常のグラフの構築方法に加えて、特定の規則に従う必要があります。 このセクションでは、コントロールや拘束の作成、ジョイント階層の定義、ジオメトリ変形の実行など、Animateステートで使用される特定の機能のためのグラフロジックの構築方法をいくつか紹介します。

Note

アニメータがAnimateステートで操作可能なコントロールやジオメトリを持ったAPEXグラフを区別するために、そのようなAPEXグラフには リグ または リググラフ という用語を使用することにします。 グラフ という用語だと、より汎用的で、Animateステートでのインタラクション要素以上の目的を含んでいます。

注意すべき重要な点は、Animateステートで表示できるのは、パックされたキャラクタ要素だけだということです。 リググラフを構築し終えたら、Animateステートでリググラフを取得してそれを表示できるようするために、そのリググラフをパックフォルダ構造に追加する必要があります。 Animateステートで評価できるようにキャラクタデータを準備する方法については、パックキャラクタフォーマットを参照してください。

以下のサンプルファイルでは、APEXグラフを使用してAnimateステート用の機能を構築する方法を説明しています。

APEXGraphExamples

コントロール

コントロールとは、Animateステートでユーザがアニメーションを操作できるものです。 以下の例では、特別なAPEXノードであるTransformObjectを紹介します。 TransformObjectは、要素間のトランスフォーム階層の定義など、要素のトランスフォームの挙動を管理します。 また、アニメーションさせやすくするために、定義された回転順序を使って移動、回転、スケールといったトランスフォームコンポーネント入力を処理します。 TransformObjectノードをグラフに配置し、そのパラメータを プロモート させると、そのTransformObject要素はAnimateステートによってピックアップされてコントロールに変わります。 その結果、そのTransformObject要素は、ユーザが操作できるものとして表示されます。

リグロジックを作成する

  1. ネットワークエディタのジオメトリレベルで、APEX Edit Graph SOPを作成します。

  2. APEX Edit Graph SOPを選択したまま、APEX Network Viewを開きます。APEXネットワークビューでは、APEX Edit Graph SOPにグラフを直接書き込むことができます。

  3. APEXネットワークビュー内で、ジオメトリのコントールを追加するグラフを作成します:

    • グラフ入力ノードとグラフ出力ノードを追加します:

      • 入力パラメータを受け取るノードを追加します。TABを押してTabメニューを開き、 Input を選択します。するとinputノードがグラフに追加されます。

      • Tabメニューで Output を選択してグラフ出力ノードを追加します。

    • ジオメトリを動かすノードを追加します:

      ノード

      説明

      torus

      あれこれ動かすトーラスジオメトリ。

      TransformObject

      階層トランスフォームの挙動の定義と管理をします。 Animateステートでトランスフォームを制御可能にするには、TransformObjectノード上の制御したい入力パラメータをinputノードに接続することで、その入力パラメータをプロモートさせる必要があります。 TransformObjectノード上のパラメータがプロモートされると、そのTransformObject要素がコントロールに変わり、ユーザがAnimateステートで操作できるようになります。

      この例では、移動(t)と回転(r)のパラメータがプロモートされているので、ユーザは、Animateステートでコントールの移動コンポーネントと回転コンポーネントにアクセスすることができます。

      transform_geo

      トーラスの位置を変更します。

      コントロールを使用してジオメトリを動かすリグロジック

Animateステートを使用してリグロジックを評価する

ビューポートでは、グラフそのものがジオメトリとして表現されます:

ジオメトリとしてのAPEXグラフ

グラフの 出力 を確認するには、Animateステートに入る必要があります。 Animateステートは、自動的にグラフを解釈して、その評価された出力を表示します。 また、Animateステートは、プロモートされたすべてのパラメータ(この例では移動と回転のパラメータ)のコントロールを作成し、それらのコントロールを操作できるようにします。

Animateステートに入るには:

  1. 以下のようにノードネットワークを接続します。

    Animateステートに入るためのネットワーク

    Pack Folder SOPは、リグをパックフォルダ構造にパックします。 Animateステートには、パックされたキャラクタ要素のみが表示されます。

  2. Pack Folder SOPでは、入力がSOPに接続されると、自動的に Name パラメータに値が入力されます。入力の Typerigに指定します。rigは、入力にリグロジックが含まれていることをAnimateステートに伝える特別な拡張子です。

  3. APEX Scene Animate SOPを選択し、左側のツールバー上の Animateをクリック、または、ビューポート内でEnterを押します。

以下の動画は、Animateステートに入っています。 トーラスの中央にある白いドットがコントロールです。 移動と回転のパラメータがプロモートされているので、そのコントロールをクリックすると、その移動および回転のハンドルが表示されます。

Animateステートでコントロールを操作

Animateステートでコントロールを操作すると、プロモートされたパラメータが変更され、それらのパラメータがグラフロジックの入力として使用されます。 コントロールをドラッグする度に、更新されたパラメータでグラフが評価されます。

親子階層

以下の例では、親子ノード階層を作成します。

リグロジックを作成する

  1. 前の例のトーラスのコントロールリグから開始します。

  2. 子コントロールを追加します(この例では赤のノードが新たに追加したノードです):

    親子コントロール階層の作成

    ノード

    説明

    child

    2つ目のTransformObjectノードをグラフに追加し、trのパラメータをプロモートします。これで、親コントロールと子コントロールの2つのコントロールができました。

    parent入力やparentlocal入力に何か接続されているTransformObjectノードは、親子階層では子になります。 親子階層を作成するには、次のように接続します:

    • 親TransformObjectのxform出力を子TransformObjectのparent入力に接続します。

    • 親TransformObjectのlocalxform出力を子TransformObjectのparentlocal入力に接続します。

    child_starting_position

    親コントロールと子コントロールが直接重なり合わないようにchild TransformObjectノードに対してオフセットを作成します。子コントロールのトランスフォームを変更するには:

    1. transform::Buildを選択してPを押してノードパラメータウィンドウを開きます。

    2. 移動パラメータtのXコンポーネントに1.0などの値を設定します。

    child_starting_positionノードの出力をchildノードのrestlocal入力に接続します。 このrestlocalは、親コントロールを基準に子コントロールの開始位置を定義します。つまり、親コントロールに対するオフセットです。

Animateステートを使用してリグロジックを評価する

コントロールの親子階層を確認するために、Animateステートに入ります:

  1. ノードネットワークを上記のコントロールの例のように接続します。

  2. APEX Scene Animate SOPを選択し、左側のツールバー上の Animateをクリック、または、ビューポート内でEnterを押します。

以下の動画は、Animateステートに入っています。左側の白いドットが親コントロールです。右側の白いドットが子コントロールです。

Animateステートでの親子コントロール

トーラスの位置は子コントロールによって駆動されているため、子コントロールにトーラスの中心が来ています。

子コントロールによって駆動されるジオメトリの位置

拘束

以下の例では、拘束を作成することで、親子関係を切る方法を紹介します。

リグロジックを作成する

  1. 前の例からの親子リグから開始します。

  2. 2つ目の子コントロールを追加します(赤のノードが新たに追加したノードです):

    2つ目の子コントロールを作成

    ノード

    説明

    child2

    trのパラメータをプロモートして、2つ目の子コントロールを作成します。

    child2_start_position

    新しい子コントロールのオフセットを作成します。

    1. child2_start_positionを選択してPを押してノードパラメータウィンドウを開きます。

    2. 移動パラメータtのXコンポーネントに(前の例で作成した)1つ目の子コントロールとは異なる値を設定します。

    以下のAnimateステートを示した動画では、左側のコントロールが親、中央のコントロールが1つ目の子コントロール、右側のコントロールが2つ目の子コントロールです。どちらの子コントロールも親に従っています。

    親コントロールに従う両方の子コントロール
  3. (下図の青のノードのように)transform::Buildノードを追加し、そのノード名をdriverに変更します。 driverノードの出力をchild2ノードのxform入力に接続して、child2ノードのコントロールをdriverノードに拘束します。 TransformObjectのxform入力はワールド空間トランスフォームであり、他のすべての入力を上書きします。 xformに何かを接続すると、拘束のように動作します。

    • driverノードを選択してPを押してノードパラメータウィンドウを開きます。

    • 移動パラメータtのXコンポーネントを設定します。

    2つ目の子コントロールを拘束

    Note

    TransformObjectノードが階層の子として接続されていて、何かがxformに接続されると、そのTransformObjectノードはその親に従わなくなり、xform入力の位置に拘束されるようになります。

Animateステートを使用してリグロジックを評価する

以下の動画では、中央の子コントロールは拘束されておらず、親(左側のコントロール)に従っています。 一方、右側の子コントロールは親子階層にありますが、親に従っていません。 拘束の入力(xform)がその位置をxform位置に拘束しているからです。

拘束されたコントロール(右側のコントロール)は親に従わない

Note

TransformObjectノードが階層の子であり、拘束されている(そのxform入力に何かが接続されている)場合、そのlocalxform出力は、TransformObjectノードが親子化されていない場合とはまったく異なる値を持つことになります。 ローカル空間は親の動きを“逆アニメーションさせて”、コントロールをその拘束された位置に留めます。

移動、回転、スケールのいずれか1つのみを拘束し、その他のトランスフォームコンポーネントは維持したい場合は、1つのトランスフォームコンポーネントを拘束するを参照してください。

ジオメトリの変形

APEX以前のジオメトリの変形では、別々に分かれた一連の評価ステップが必要となり、ボーン変形の前にスケルトン変形を評価しなければなりませんでした。 以下の例では、チューブジオメトリを変形させています。 Rig Pose SOPがスケルトンを変形し、スケルトンの変形の評価結果がBone Deform SOPのボーン変形に渡されています。

APEX以前の別々に分かれた評価ステップ

APEXでは、同一工程で、変形する入力要素を組み立て、準備をします(以下の青のノード)が、 APEX前のセットアップにおけるRig Pose SOPとBone Deform SOPのロジックは、今では1つの場所、ここではbone_deform_rigノード内のAPEXグラフにまとめられています。 そのbone_deform_rigノードは、リグロジックを構築し、そのcreate_characterノードはアニメーション準備としてキャラクタ要素を組み立てます(詳細は、キャラクタデータの組み立てを参照してください):

APEXボーン変形ネットワーク

リグロジックを作成する

以下は、APEX Edit Graph SOPであるbone_deform_rig内のリグロジックです:

APEXボーン変形リグロジック

KineFX (APEX前)

APEXグラフの機能

説明

Rig Pose SOP

FK階層(緑のノード)、トランスフォームによるアニメーションスケルトン(オレンジ色のノード)

3つのTransformObjectノードが、joint_0joint_1の親とし、joint_1joint_2の親とする、3ジョイントのFK階層を確立しています。

TransformObjectノードのrestlocalトランスフォームがスケルトンのジョイントの位置に合うように更新します:

  1. APEX Edit Graph SOPのbone_deform_rigで、パラメータの Rigging Scripts セクションにある Update Rest Transforms From Skeleton をクリックします。このスクリプトを正しく実行させるには、TransformObjectのノード名がスケルトンのジョイント名と一致している必要があります。

  2. ダイアログが開いたら、Skeleton SOPを選択して Accept をクリックします。TransformObjectノードの restlocal パラメータが更新されます(グラフノードを選択し、 P を押してノードパラメータウィンドウを表示します)。

joint_0joint_1joint_2 TransformObjectノードのxformワールドトランスフォームがSetPointTransformsノードに接続され、スケルトンのジョイントが更新されます。SetPointTransformsノードのポート名がスケルトンのジョイント名に一致するように更新する必要があります。 ポート名をクリックすることで、その名前を変更することができます。

Note

この例では、スケルトンのジョイント名をpoint_0point_1point_2(スケルトン作成時のデフォルト名)からjoint_0joint_1joint_2に変更しました。 Skeleton SOPでジョイントの名前を変更するには:

  1. Skeleton SOPを選択し、ビューアステートに入ります(ビューポートでEnterを押します)。

  2. ビューアステートツールバーで、 ModeModify に設定します(またはビューポート上でFを押します)。

  3. スケルトンの各ポイントをクリックし、ビューアステートツールバーの Name フィールドでジョイントの名前を変更します。

SetPointTransformsノードの出力は、アニメーションスケルトンで、それがsop::bonedeformノードに渡されます。

Bone Deform SOP

ボーン変形(紫色のノード)

KinefXワークフローでのBone Deform SOPの3つの入力は、sop::bonedeform APEXグラフノードの最初の3つの入力に呼応しています。

以下のテーブルには、SetPointTransformsノードとValueノードに関する詳細を載せています。

ノード

説明

SetPointTransformsノード

SetPointTransformsはスケルトンデフォーマです。 トランスフォームを受け取り、それをスケルトンのジョイントに適用します。 これは特殊なノードで、可変長入力であるtransformsからのサブポートの命名が重要になります。 サブポート名は、入力スケルトン(SetPointTransformsノードのgeo入力)のジョイント名にマッピングされます。 例えば、サブポートの1つがjoint_0という名前の場合、joint_0サブポートに渡されるトランスフォームに加えられた変更は、スケルトン上のjoint_0を更新します。

SetPointTransformsのサブポートの名前は、そのポート名をクリックすることで、スケルトンのジョイント名(Skeleton SOPからのジョイント名)と同じになるように変更することができます。

SetPointTransformsのjoint_0ポートに渡されるトランスフォームの更新は、スケルトンのjoint_0の位置に影響します

Valueノード

Value<Geometry>ノードは、静止スケルトンのコピーを作成し、このコピーをSetPointTransformsに接続します。 静止スケルトンのコピーを作成する必要がある理由は、SetPointTransformsノードは、接続されたジオメトリをその場で変更を行なうからです。 もし静止スケルトンをSetPointTransformsノードに接続してしまうと、そのSetPointTransformsノードはその静止スケルトンに対して変更を加えてしまいます。 その結果、静止スケルトンは静止スケルトンではなくなり、アニメーションスケルトンになります。

静止スケルトンは、ジオメトリ変形を実行するための参照として使用されます。 静止スケルトンとアニメーションスケルトンのトランスフォームの差を計算し、この差を使用して、ジオメトリの変形方法を決定します。 SetPointTransformsノードに接続する前に静止スケルトンのコピーを作成しなかった場合、SetPointTransformsノードはその静止スケルトンを更新してしまいます。 その結果、静止スケルトンとアニメーションスケルトンが同じになり、差分のないトランスフォームがジオメトリ変形に適用されることになります。

以下の例は、Valueノードを使用して最初にコピーを作成することなく、静止スケルトンを直接SetPointTransformsに接続した場合、何が起こるかを示したものです。

Valueノードなしで静止スケルトンをSetPointTransformsに接続
静止スケルトンをコピーしていない場合、ジオメトリは変形されない

期待通りにボーンを変形させるには、Value<Geometry>ノードを使用して、静止スケルトンのコピーを作成する必要があります。 SetPointTransformsノードはコピーに対して更新を行ない、アニメーションスケルトンはSetPointTransformsノードからsop::bonedeformノードの3番目の入力(アニメーションスケルトン)であるgeoinput2に接続します。

元の静止スケルトンは、sop::bonedeformノードの2番目の入力(静止スケルトン)であるgeoinput1に接続します。

Animateステートを使用してリグロジックを評価する

Pack Folder SOPを使用して、キャラクタ要素(チューブジオメトリ、スケルトン、リグ)をAnimateステートでアニメーション可能な“キャラクタ”にパックします。 Pack Folder SOP内でキャラクタ要素に名前を付ける方法については、キャラクタデータを組み立てるを参照してください。

APEXボーン変形ネットワーク

ジオメトリを変形するには、Animateステートに入ります:

  • ネットワークエディタでAPEX Scene Animate SOPを選択し、Displayフラグをオンにします。

  • 左側のツールバー上の Animateをクリック、または、ビューポート内でEnterを押します。

Note

Animateステートのジオメトリが正しく見えない場合は、リググラフの静止トランスフォームが適切に設定されていない可能性があります。 スケルトンに基づいて静止トランスフォームを設定するには:

  1. TransformObjectノードの名前がスケルトンのジョイント名と一致していることを確認します。

  2. ネットワークエディタでAPEX Edit Graph SOPを選択します。

  3. パラメータエディタで Update Rest Transforms From Skeleton をクリックします。

  4. ダイアログが表示されたら、ネットワークエディタでSkeleton SOPを選択すると、ダイアログで自動的にSkeletonノードが選択されます。

  5. Accept をクリックします。

  6. APEX Scene Animate SOPを選択し、 Reset All をクリックします。

  7. Animateステートに入ります。

1つのトランスフォームコンポーネントを拘束する

特定の1つのトランスフォームコンポーネント(移動、回転、またはスケール)をドライバに拘束し、他のコンポーネントは変更しないようにするには、TransformObjectノードのxformmaskポートを使用します。

移動、回転、スケールの値にビットマスクをセットアップします。 ジョイントの回転をドライバの回転に拘束したい場合は、回転のValueノードを1に設定し、移動およびスケールのValueノードを0に設定します。

以下の例では、ピンクのノードを使用して、1つのトランスフォームコンポーネントをドライバに拘束する機能をセットアップしています。

joint_1の回転をドライバに拘束

driverTransformObjectノードの移動および回転の値はコントロールとしてプロモートされ、以下の機能を持ちます:

  • driverの移動コントロールを変更しても、joint_1の移動はdriverに拘束されていないため、スケルトンのjoint_1は動きません。チューブジオメトリは変形しません。

  • driverの回転コントロールを変更する場合、joint_1の回転はdriverの回転に拘束されているため、joint_1の回転はdriverと一緒に更新されます。チューブジオメトリは、joint_1回転に合わせて変形します。

以下の動画では、ドライバの 移動 を変更しても、チューブジオメトリは変形しません。ドライバの 回転 を変更すると、チューブが回転に合わせて変形します。

ジョイントの回転をドライバの回転に拘束

Abstract Controls(抽象コントロール)

抽象コントロールは、浮動小数点値を駆動させたり、ポージング用途でリグのピボットポイントとして使用可能なコントロールです。 抽象コントロールは、TransformObjectノードから作成されたコントロールとは異なり、トランスフォームに関連付けられていません。 ビューポート内での抽象コントロールの操作の挙動は、通常のコントロールと異なります。 抽象コントロールの場合、ユーザは、コントロールをドラッグして浮動小数点値を駆動します。 通常のコントロールの場合、コントロールの配置や操作をする際にトランスフォームハンドルが利用可能です。

AbstractControlグラフノードは、リグロジックの機能に影響せず、実行もされません。 それは、xform入力で指定された位置に留まり、他の入力ポートの接続次第で、値を駆動させたり、ピボットポイントとして使用されます。

以下の例では、5本のジョイントが入ったチューブジオメトリから始めて、前のボーン変形の例と同様のネットワークを構築します。

2個の抽象コントロールをボーン変形リグロジックに追加します:

  1. joint_4に留まるピボット(赤いノード)。

  2. joint_2に留まり、joint_2を基準にチューブジオメトリのスケールを駆動させるコントロール(青いノード)。

抽象コントロールリグロジック

ノード

説明

joint_*

joint_* TransformObjectノードは、親子階層で接続されています。 joint_0joint_1joint_2joint_3の移動パラメータtがプロモートされています。 抽象コントロールはjoint_4の位置に留めるので、joint_4のどのパラメータもプロモートしませんでした。

pivot

AbstractControlノードのxform入力に何かが接続されていて、そのxyの入力ポートが接続されていない場合、 そのAbstractControlノードは、ビューポートからはピボットとして使用可能なコントロールとして解釈されます。 xformポートの入力がマトリックスである限り、その入力はどのノードも受け入れることができます。 これは、AbstractControlノードがコントロールを配置する場所を知るためにそうなっています。

以下の例では、joint_4xform出力がpivot抽象コントロールのxform入力に接続されているので、そのpivot抽象コントロールはjoint_4の位置に留まります。 joint_4はジョイント階層内で最下位のジョイントであるにもかかわらず、そのjoint_4の位置にあるpivot抽象コントロールを使用して、ジョイントチェーンで上位にあるジョイントを駆動させることができます。

pivot抽象コントロールが親ジョイントを駆動

soft_transform

sop::softxformノードは、指定されたポイントグループ、さらにそれらの隣接ポイントも動かします。この例では、joint_2周辺のポイントのスケールを上げています。

設定

パラメータ

Points to transform

groupパラメータには、トランスフォームさせたいジオメトリ内のポイントを指定します。この例では、groupには、joint_2周辺のジオメトリポイントが設定されています。

Transform

sパラメータを1.0よりも大きい値に設定します。これは、joint_2周辺のチューブのサイズを大きくします。

Soft Transformノードはjoint_2周辺のポイントのスケールを設定します

radius_control

AbstractControlノードのxまたはyの入力/出力ポートを、プロモートされた値の“path”に接続した場合、その抽象コントロールを水平または垂直方向にドラッグすると、そのプロモートされた値が駆動します。

soft_transformノードの半径パラメータradがプロモートされています。 このradius_control抽象コントロールはjoint_2の位置に留まっています。 そのx入力/出力ポートがプロモートされたrad値に接続されているので、radius_controlrad値を駆動します。 その抽象コントロールを水平方向にドラッグすると、joint_2からさらに遠くにあるポイントのスケールが影響を受けます。

抽象コントロールがjoint_2から遠くにあるポイントのスケールに影響を与えています

ドラッグの挙動

アクション

コントロール値を整数ステップサイズで変更する

⌃ Ctrlを押しながらドラッグします。

コントロール値をもっと遅く変更する

⇧ Shiftを押しながらドラッグします。

コントロール値をもっと速く変更する

⌃ Ctrl + ⇧ Shiftを押しながらドラッグします。

抽象コントロールを設定する

抽象コントロールの外観

抽象コントロールのサイズ、形状、カラー、位置を設定するには、APEX Configure Controls SOPを使用します。

  1. APEX Configure Controls SOPで、 Control Configs の隣りにあるをクリックして、抽象コントロール毎に設定を追加します。

    設定

    パラメータ

    リグ名

    Rig Source パラメータには、抽象コントロールを設定するリグを指定します。 このリグの名前はPack Folder SOPで設定します。 Pack Folder SOP内でキャラクタ要素の名前を付ける方法の詳細は、キャラクタデータを組み立てるを参照してください。

    設定するコントロール

    Control Group パラメータには、抽象コントロールの名前を指定します。 または、 APEXパスパターン構文を使用すればコントロールのグループを指定することができます。 APEXパスパターン構文の詳細は、Unpack Folder SOP Extract Pattern パラメータを参照してください。

    コントロールの形状、サイズ、カラー

    目的の Use Shape OverrideUse ShapeoffsetUse Color のパラメータを有効にしてください。

  2. 設定された抽象コントロールを確認するために、Animateステートに入ります:

    • ネットワークエディタでAPEX Scene Animate SOPを選択して、Displayフラグをオンにします。

    • 左側のツールバーにある Animateをクリック、または、ビューポート内でEnterを押します。

抽象コントロールプロパティ

抽象コントロールプロパティは、ビューポート内でのコントロールの挙動を定義します。 これらのプロパティは、AbstractControlノードのproperties辞書アトリビュートに格納されます。 properties辞書には、以下の階層のように入れ子化された辞書を含んでいます:

control:
    parms:
        <property1>,
        <property2>,
        ...

control

コントロールの設定方法に関する情報(例えば、ビューポート内でのコントロールの見え方やコントロールのデフォルトパラメータ)を含んだ辞書。 コントロール形状に関する情報もこの辞書に格納されます。

parms

そのcontrol辞書の中にさらにparms辞書があります。 parms辞書には、コントロールの挙動を決めるデフォルトパラメータが格納されます。

以下のテーブルでは、抽象コントロールに対して設定可能なプロパティを載せています:

プロパティ

タイプ

説明

x_min, x_max

float

コントロールを水平方向にドラッグした時のデフォルトの最小値と最大値を定義します。 これが定義されていない場合、デフォルトの最小値と最大値は-10と10です。

y_min, y_max

float

コントロールを垂直方向にドラッグした時のデフォルトの最小値と最大値を定義します。 これが定義されていない場合、デフォルトの最小値と最大値は-10と10です。

lock_range

int

1に設定すると、コントロール値が(x_min, x_max)から(y_min, y_max)の範囲内に維持されます。 0に設定すると、コントロール値はこの範囲外に出ることができます。

Attribute Adjust Dictionary SOPAttribute Wrangle SOPを使用することで、抽象コントロールプロパティを設定することができます。 Attribute Adjust Dictionary SOPは、コントロールプロパティの辞書を作成するのに使用します。 そして、Attribute Wrangle SOPを使用して、その辞書をAbstractControlノード上のpropertiesアトリビュートに設定することができます。

抽象コントロールプロパティの設定

ノード

説明

Attribute Adjust Dictionary SOP

抽象コントロールプロパティの辞書を作成します。

設定

パラメータ

辞書名

Attribute Name パラメータに辞書の名前を指定します。 これは、後ほどAbstractControlノード上にコントロールプロパティの辞書を設定するAttribute Wrangle SOPで使用される名前です。

コントロールプロパティ

各プロパティのマルチパラメータを追加します:

  1. Number of Entries の隣りにあるをクリックします。

  2. 各プロパティに対して、 Key (プロパティの名前)、 TypeValue のパラメータを指定します。例:

    • Key: x_min

    • Type: Float

    • Value: 0.001

Attribute Wrangle SOP

抽象コントロールのpropertiesアトリビュートにプロパティの辞書を設定します。

Group パラメータに@callback=AbstractControlを設定します。 これは、プロパティが設定されるグラフノードを指定しています。

VEXpression テキストボックスに、以下のVEXコードを入力します:

dict parms = detail(1, '<Attribute Nameパラメータ>');
dict ctrl;
ctrl['parms'] = parms;
d@properties['control'] = ctrl;

この<Attribute Nameパラメータ>には、Attribute Adjust Dictionary SOPの Attribute Name パラメータで設定した名前を入れてください。

Note

Attribute Adjust Dictionary SOPで作成される辞書の名前は、( Attribute Name パラメータで)好きなように設定することができます。 しかし、抽象コントロールのpropertiesアトリビュート内の辞書の名前は、controlparmsでなければなりません。 その理由は、AbstractControlノードは、コントロールのプロパティを設定する時に、それらの名前を拾い上げるようになっているからです。

抽象コントロールのpropertiesアトリビュートには、以下のデータ階層が作成されます。 parms辞書の値には、Attribute Adjust Dictionary SOPで設定された値が入ります。

control:
    parms:
        x_min,
        x_max,
        ...

抽象コントロールのpropertiesアトリビュートは、Geometry Spreadsheetで確認することができます:

  1. ネットワークエディタで、Attribute Wrangle SOPを選択します。

  2. AbstractControlノードのアトリビュートを知りたいのであれば、グラフノードはグラフジオメトリ内ではポイントなので、Geometry Spreadsheet内で上部のツールバーにある Pointsを選択します。

  3. 抽象コントロール( callback = AbstractControl)の行の properties 項目のエントリーをクリックして Inspect を選択します。以下が抽象コントロールのpropertiesアトリビュートの例です:

    {
        "control":{
            "parms":{
                "lock_range":1,
                "x_max":2,
                "x_min":0.001,
                "y_max":2,
                "y_min":0.001
            }
        }
    }
    

アトリビュートとコールバック

APEXグラフジオメトリは以下のアトリビュートを持っています。

名前

クラス

タイプ

説明

name

point

string

ノードの名前。

callback

point

string

ノードのコールバック名。

Cd

point

float

ノードのカラー。

portname

vertex

string

ポートの名前。

portalias

vertex

string

サブポート名または名前が変更されたポート。

portindex

vertex

int

ポートのインデックス番号。

parms

point

dict

ポートのデフォルト値の辞書。

tags

point

string[]

%tag()を介してAPEXパスパターン内でマッチされる文字列の配列。

properties

point

dict

ノードの追加メタデータの辞書。

一部のグラフエレメントには特別なコールバック名があります。

ノード

コールバック名

グラフ入力ノード

__parms__

グラフ出力ノード

__output__

サブネット

__subnet__

ステッキーノート

__stickynote__

How to

To...Do this

グラフから数値を取得する

  1. グラフで、取得したい値をグラフ出力ノードに接続します。

  2. APEX Invoke Graph SOPで、取得する値を指定します:

    • Output Dictionary Bindings の横にあるをクリックします。

    • Apex Outputs Group をグラフ出力ノードの名前に設定します。

    • Output Attrib には、出力される辞書の名前(output_parms)を設定します。

上部のツールバーから Detailを選択すると、出力される辞書をGeometry Spreadsheetで確認することができます。

2つの値を加算する例を参照してください。

グラフからジオメトリを表示する

  1. グラフで、ジオメトリをグラフ出力ノードに接続します。

  2. APEX Invoke Graph SOPで、 Bind Output Geometry をオンにし、output:geo(<グラフ出力ノードの名前>:<出力ノードのジオメトリ>)を指定します。

  3. APEX Invoke Graph SOPのDisplayフラグをオンにします。ビューポートにジオメトリが表示されます。

ジオメトリを変更する例を参照してください。

コントロールを追加する

コントロールに変換したいパラメータについては、TransformObjectノードの入力パラメータをグラフinputノードに接続することで、そのパラメータがプロモートされます。

コントロールを追加する例を参照してください。

親子階層を作成する

2個のTransformObjectノードを以下のように接続します:

  • 親TransformObjectのxform出力を子TransformObjectのparent入力に接続します。

  • 親TransformObjectのlocalxform出力を子TransformObjectのparentlocal入力に接続します。

親子階層を作成する例を参照してください。

親コントロールを基準に子コントロールの開始位置を設定する

transform::Buildノードの出力を子TransformObjectノードのrestlocal入力に接続します。 restlocalは、親コントロールを基準に子コントロールの開始位置を定義します。つまり、親コントロールに対するオフセットです。

拘束を作成する

TransformObjectノードをドライバに拘束するには、ドライバの出力をTransformObjectノードのxform入力に接続します。

拘束を作成する例を参照してください。

1つのトランスフォームコンポーネントを拘束する

IntBitMaskToBoolノードと、移動、回転、スケールコンポーネントのValueノードを使用して、拘束する特定のトランスフォームコンポーネントを決定するビットマスクを作成します。 IntBitMaskToBoolノードの出力を、拘束したいTransformObjectノードのxformmask入力に接続します。

1つのトランスフォームコンポーネントを拘束する例を参照してください。

スケルトンに呼応したリグ階層を作成する

APEX Edit Graph SOPImport KineFX Skeleton ボタンを使用してください。

スケルトンからリグ階層の静止位置を更新する

APEX Edit Graph SOPUpdate Rest Transforms From Skeleton ボタンを使用してください。

グラフのワイヤーを削除する

Yを押しながらワイヤー上をドラッグします。

または

ワイヤーを選択してDeleteを押します。

グラフノードのパラメータ値を変更する

グラフノードを選択し、Pを押すとAPEXノードパラメータウィンドウが表示されます。

グラフのポート名を変更する

ポート名をクリックします。

APEXネットワークビュー内でグラフを可視のままにする

  1. APEXネットワークビュー内で可視のままにしたいグラフを含んだAPEX Edit Graph SOPを選択します。

  2. APEXネットワークビュー内の上部にあるツールバーのアイコンをクリックするとそのグラフをピン留めすることができます。このアイコンはに変わります。

ネットワークエディタ内で選択されているノードのグラフをAPEXネットワークビューに表示したいのであれば、そのグラフのピン留めを解除してください。

命名に関するメモ

  • SetPointTransformsノードでは、可変長入力のtransformsのサブポート名は、入力スケルトン(SetPointTransformsノードのgeo入力)のジョイント名に必ず合わせてください。

  • TransformObjectノードの名前は、スケルトンジョイントの名前に合わせる必要はありません。 ただし、APEX Edit Graph SOPUpdate Rest Transforms From Skeleton ボタンを使用したい場合には、TransformObjectノードはスケルトンジョイントの名前に合わせる必要があります。

KineFX

リグ入力の準備

プロシージャルリギング

変形

アニメーション

別表

アニメーションのリターゲット

KineFX19.5の機能

互換性

ペイン