On this page |
|
概要 ¶
KineFXリギングおよびアニメーションフレームワークでは、キャラクタのスケルトンは、ジオメトリレベルでポリゴンラインで繋がったポイントで表現されます。 このジョイントベースのシステムでは、SOPノードを使用してキャラクタのジョイント階層を作成および編集し、そこからキャラクタのスケルトンとスキンを作成および操作することで、プロシージャルにキャラクタを構築することができます。 そして、このキャラクタがリグロジックに渡されて、そのキャラクタリグの挙動が決定します。
Houdini20より前のバージョンでは、キャラクタのリグロジックは(Rig Pose SOPなどの)リグビヘイビア系ノードに存在し、評価もそれらのノード上でされていました。 これは、ネットワークでリグの挙動を決定する部分に達すると、ネットワーク上のまさにその場所でこの機能を評価しなければならないこと意味しました。 つまり、リグロジックとリグ評価の両方が、ネットワーク上の同じ場所に結び付けられていたわけです。
以下の例は、Houdini20より前のバージョンのシンプルなリギングセットアップです。 チューブジオメトリを変形させています。 リグの入力は、チューブジオメトリ、スケルトン、ジオメトリ上のキャプチャウェイトを作成することでセットアップされています。 Rig Pose SOPでは、スケルトンのポーズを操作(スケルトンを変形)し、キーフレームを設定してアニメーションを追加することができます。 その後、そのRig Pose SOPはそのスケルトンの変形とアニメーションを評価し、この評価の結果がBone Deform SOPに渡され、そこでもう1つの評価が実行されてジオメトリが変形されます。
この方法にはいくつかの問題があります:
-
スケルトン上のジオメトリを変形させるために、評価ステップが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より前のバージョンと同じ |
リグロジック | リグビヘイビア系ノード | 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 SOPのbone_deform_rig
にあります。
このリグロジックはネットワークのどの部分でも評価されず、リグのセットアップ工程(リグ入力の組み立てとリグロジックの定義)とリグ評価が明確に区別されています。
APEXでのリギング ¶
APEXリギングワークフローでは、手動でグラフを作成するか、または、リグコンポーネントを使用して、リグロジックを構築することができます。 下図の例では、紫色のノードがアニメーションの準備としてリグロジックを構築し、キャラクタを作成し、シーンを組み立てます。
キャラクタの作成とアニメーションシーンの組み立ての詳細については、パックキャラクタフォーマットおよびアニメーションワークフローを参照してください。
グラフの構築 ¶
APEXグラフは、入力パラメータの形式でデータを取り込み、そのデータに対して演算を実行し、データを出力として取得できるようにします。 グラフ内では、ジオメトリと他のタイプを一緒に制御することができます。 例えば、スケルトンジョイントのトランスフォームに対して、数値演算や行列演算を1つのグラフ内で行なうことができます。
Note
APEXグラフが出力できるデータのタイプは、そのAPEXグラフが実行されているコンテキストによってのみ制限されます。 APEXグラフをSOPで実行する場合、そのAPEXグラフはジオメトリ、さらには、そのジオメトリ上の辞書アトリビュートに格納可能などんなデータも出力することができます。 APEXグラフをPythonで実行する場合、そのAPEXグラフはPythonの型にキャスト(型変換)可能なデータを出力することができます。
APEXネットワークビューを使用してグラフを視覚化および構築することができ、そのグラフをAPEX Edit Graph SOPに直接書き込むことができます。 グラフの構築を開始するには、以下を実行します:
-
ネットワークエディタ内のジオメトリレベルで、APEX Edit Graph SOPを作成します。
-
APEX Edit Graph SOPを選択した状態で、APEXネットワークビューを開きたいペインの上部にある New Tabアイコンをクリックし、 New Pane Tab Type ▸ Animation ▸ APEX Network View を選択します。
そのAPEX Edit Graph SOPに格納されているグラフがAPEXネットワークビューに表示されます。
グラフ構造はジオメトリとして表現され、そのグラフ内のノードはビューポートではポイントとして表現され、ノード間の接続はそれらのポイント間のラインとして表現されます。 以下の例では、グラフノードとその接続の位置とカラーがそのままビューポート内のポイントおよびエッジに関連付けられています。
グラフノードの位置やカラーが変化すると、ビューポートのジオメトリに反映されます。
グラフとジオメトリのコンポーネントには、次のような相関関係があります:
グラフ(APEXネットワークビューで視覚化) |
ジオメトリ(ビューポートで視覚化) |
---|---|
ノード |
ポイント |
ワイヤー |
ラインプリミティブ |
接続したノードの入出力ポート |
頂点 |
|
ジオメトリ上に格納されたパラメータ |
グラフノード、サブグラフ、サブネット ¶
グラフノードは特定の演算を実行し、そのグラフノードはAPEX関数、Verb(動詞)、サブグラフ、サブネットのどれかで表現することができます。
APEX関数
APEX関数は、入力ポートに接続されているものに対して特定の演算を実行します。
Verb
VerbはOPノードの基本演算部分です。
これは、キャッシュ化、入力の読み込み、パラメータの評価といったノードに関係する他の処理を含んでいません。
例えば、Joint Deform SOPはbonedeform
VerbのHDAラッパーなので、APEXグラフ内ではJoint Deformを使用できませんが、bonedeform
は使用できます。
サブグラフ
サブグラフはロックされたグラフで、HDAと同様に、サブグラフを修正すれば、そのサブグラフのすべてのインスタンスが修正されます。 サブグラフの例を挙げると、SmoothIKノードがそうです。
サブグラフは、.bgeo
ジオメトリファイル形式で サブグラフライブリラリ として保存します。
そのサブグラフライブラリは、以下の構造を持ちます:
-
単一のアンパックAPEXグラフで、そのサブグラフ名は
name
Detail アトリビュートで定義されています。または
-
いくつかのパックジオメトリプリミティブで、それぞれのパックプリミティブにAPEXグラフが含まれています。 パックプリミティブ毎に、そのサブグラフ名がトップレベルの
name
Primitive アトリビュートで定義されています。
サブグラフの.bgeo
ファイルは、@/apexgraph
ディレクトリから読み込まれます。
@
はHOUDINI_PATH内のディレクトリに展開されます。
サブネット
サブネットは、複数のグラフノードを単一ノード内にカプセル化したコンテナです。 これによって、サブネット内部に含まれているグラフが簡素化され可読性が良くなります。 同じ中身を持つサブネットをいくつも作成した場合、それらのサブネットの1つを更新しても他のサブネットには影響しません。
To... | Do this |
---|---|
アンパックグラフをサブグラフライブラリファイルに保存する。 |
アンパックAPEXグラフをサブグラフライブラリファイルに保存する時、そのグラフ上に必ず
その保存されたサブグラフを読み込むには:
|
パックグラフをサブグラフライブラリファイルに保存する。 |
Pack Folder SOPを使用して、グラフをパックフォルダ構造に追加します。
このPack Folder SOPは、グラフ毎に
その保存されたサブグラフを読み込むには:
|
すべてのサブグラフインスタンスを更新する |
サブグラフに変更を加えた後は、以下の操作によって、すべてのサブグラフインスタンスが更新されます:
|
サブネットを作成する |
|
サブネットのポート名を変更する |
サブネットの中に入って、 |
ポート ¶
APEXネットワークビューでは、ノードの ポート 間にワイヤーを作成することで、それらのノードを接続することができます。 ポート値は、ポート接続、ノードパラメータウィンドウで設定された値、特定のデフォルト値のどれかで決まります。
ノードパラメータウィンドウは、ポートの値を編集するのに使用します。 ノードパラメータウィンドウを開くには、グラフノードを選択して P を押します。
ポート |
値 |
---|---|
接続されたポート |
接続からの値は、ノードパラメータウィンドウで設定された値を上書きします。 |
未接続なポート |
未接続なポート値は、ノードパラメータウィンドウで設定された値、それに呼応するSOP Verbノード、APEX内部で設定されたデフォルト値のどれかで決まります。 ノードパラメータウィンドウで表示されたポートのうち、その値フィールドの背景が黒いポートは、Geometry Spreadsheet内の
ノードパラメータウィンドウで表示されたポートのうち、その値フィールドの背景が灰色のポートは、
Note ノードパラメータウィンドウに表示されている値は、必ずしもそのポートで使用される値とは限りません。
ポートがGeometry Spreadsheet内の |
異なるポートカラーは、そのポートの異なるデータタイプを表しています。 また、ポートには、 Variadic Port(可変長ポート) と In-Place Port(インプレースポート) の2つの特別なタイプが存在します:
Variadic Port(可変長ポート)
可変長ポートには複数の接続を作成することができ、ノード上に サブポート が作成されます。
いくつかのノード上に存在するnext
ポートがこの可変長ポートの例です。
他にも特定のノード上に別の可変長ポートがあります。例えば、Addノードのb
ポート、GetPointTransformsノードやSetPointTransformsノードのtransforms
ポートがそうです。
In-Place Port(インプレースポート)
インプレースポートの値は、コピーを作成せずに更新されます。インプレースポートは正方形のマークで識別できます。
基本的なグラフ操作 ¶
このセクションのサンプルでは、以下の基本的な構造を見ていきます:
-
グラフロジックを作成する方法
-
グラフを評価(実行)する方法
以下のサンプルファイルでは、このセクションの基本的なグラフオペレーションを実行するAPEXグラフの作成方法を説明しています。
2つの値を加算する ¶
以下の例では、2つの値を加算するグラフの作成方法を紹介しています。 データをグラフに入力し、そのグラフの出力を表示する基本的なワークフローについて説明します。
グラフロジックを作成する ¶
2つの値(a
とb
)を加算するロジックを作成します。
-
ネットワークエディタ内のジオメトリレベルで、APEX Edit Graph SOPを作成します。
-
APEX Edit Graph SOPを選択したまま、APEX Network Viewを開きます。APEXネットワークビューでは、APEX Edit Graph SOPにグラフを直接書き込むことができます。
-
APEXネットワークビュー内で、簡単な数値演算を実行するグラフを作成します:
-
グラフ入力ノードとグラフ出力ノードを追加します:
-
入力パラメータを受け取るノードを追加します。TABを押してTabメニューを開き、 Input を選択します。すると
input
ノードがグラフに追加されます。 -
Tabメニューで Output を選択してグラフ出力ノードを追加します。
-
-
単純な加算演算を実行するAdd<Float>ノードを追加します。
-
それらのノードを以下のように接続します:
add
ノードのb
は可変長ポートなので、複数の接続が可能であり、b<x>
という名前のサブポートが作成されます。
-
この時点では、グラフの入力は定義されておらず、グラフは評価も計算もされていないため、何の出力も結果もありません。 グラフは、ジオメトリとして表現されたロジックの一部(ピース)でしかありません。
入力を定義する ¶
加算演算の入力のa
とb
を定義します。
数値入力は辞書形式で格納する必要があるため、基本的に辞書が入力データのコンテナとなります。
辞書にはキー/値のペアを格納し、この場合だとa
とb
がキーです。
Attribute Adjust Dictionary SOPを使用して、入力パラメータの辞書を作成します。
ネットワークエディタ内のジオメトリレベルで、Attribute Adjust Dictionary SOPを追加して、a
とb
の値を設定します:
-
Set Values セクションで、 Number of Entries の横にあるをクリックし、2個のエントリを作成します。
-
1つ目のエントリを以下のように設定します:
-
Key :
a
-
Type : Float (float値を加算します)
-
Value :値を
a
に割り当てます。
-
-
2つ目のエントリを以下のように設定します:
-
Key :
b
-
Type : Float
-
Value :値を
b
に割り当てます。
-
デフォルトでは、 Attribute Name がparms
、 Attribute Class が Detail に設定されているため、parms
という名前のDetailアトリビュートが作成されます。
この新しいparms
アトリビュートはGeometry Spreadsheetで確認することができます:
-
Geometry Spreadsheetを開きたいペインの上部にある New Tabアイコンをクリックし、 New Pane Tab Type ▸ Inspectors ▸ Geometry Spreadsheet を選択します。
-
上部のツールバーから Detailを選択します。
グラフロジックを評価する ¶
これでグラフロジックとグラフ入力が定義されました。 グラフを呼び出す(評価する)には、APEX Invoke Graph SOPを使用します。 ネットワークエディタ内のジオメトリレベルで、APEX Invoke Graph SOPを追加します。
-
追加したノードを接続します:
-
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番目の入力に接続します。
-
-
APEX Invoke Graph SOPで、入力を指定します:
-
Input Bindings に横にあるをクリックして、入力を追加します。
-
デフォルトでは、 Dictionary To Bind がオンで、
parms
に設定されています。既にAttribute Adjust Dictionary SOPを使用してparms
という名前の入力を辞書として定義しているので、これは既に望ましい設定になっています。
-
-
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でa
やb
の値を変更すると、そのAPEX Invoke Graph SOPで計算された出力の辞書が新しい合計値に更新されます。
2つの結果を取得する ¶
これから、前の例のグラフロジックを使用し、元の結果に対して別の演算を実行して2つの結果を取得したいと思います。
グラフロジックを作成する ¶
前のグラフに、その結果の合計値を除算するノードを追加します。そして除算演算の結果を出力するようにします。
-
APEXネットワークビューで、Divide<Float>ノードを追加します。以下のようにノードを接続します(この例では赤のノードが新たに追加したノードです)。この例では、
divide
ノードとoutput
ノードのサブポート名を変更しています。divide
ノードのb
ポートは可変長入力です。Note
サブポート名はその名前の上でクリックすることで名前を変更することができます。
これで
output
ノードには2つの値が出来ました。 -
divide
ノードで値を設定します。-
divide
ノードを選択し、Pを押してノードパラメータウィンドウを表示します。 -
divide
は、a
をb
で除算します。ノードパラメータウィンドウで、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
ノードから取得された値を確認します:
-
ネットワークエディタでAPEX Invoke Graph SOPを選択します。
-
Geometry Spreadsheetで、上部のツールバーから Detailを選択します。
-
output
ノードから次の2つの値が取得されています:-
add_result
:グラフ入力のa
とb
の合計値 -
add_divide_result
:<Divide
ノードのポートa
> / <グラフ入力のa
とb
の合計値>
-
Note
出力される辞書には、APEX Invoke Graph SOPの Apex Outputs Group パラメータで指定したグラフ出力ノードの すべて の結果が含まれます。
部分評価 ¶
以下の例では、 部分評価 という考え方を紹介します。 要求された出力のみを取得し、その出力のみを計算して、残りのグラフロジックは無視します。
グラフロジックを作成する ¶
前の例の加算と除算のグラフから開始します。もう1つ出力ノードを追加し、元の出力ノードと違う名前を付けます。
-
2つ目の出力ノード(Subnet Outputs)を追加し、その名前を
output2
に変更します。 -
Multiply<Float>ノードを追加します。
-
以下のようにノードを接続します(この例では赤のノードが新たに追加したノードです):
-
multiply
ノードで値を設定します。-
multiply
ノードを選択し、Pを押してノードパラメータウィンドウを表示します。 -
ノードパラメータウィンドウで、
a
の値を2.0
などに設定します。b0
は前の除算演算からの値なので、そのままにします。
-
グラフロジックを評価する ¶
取得された結果を確認します:
-
ネットワークエディタでAPEX Invoke Graph SOPを選択します。
-
Geometry Spreadsheetで、上部のツールバーから Detailを選択します。
前の例と同じように、元のoutput
ノードから同じoutput_parms
辞書が取得されています(取得される値はadd_result
とadd_divide_result
)。
もう一方の出力ノードを指定しても、APEX Invoke Graph SOPはその指定した出力ノードの値だけが取得されます。
Note
この場合では、グラフロジックに対して部分評価が実行されます。
output
の値のみが要求されているため、output
ノードの値を計算するロジックだけが実行されます。
output2
の値を計算するロジックは無視されます。
新しい出力ノードのoutput2
からも値を取得するには:
-
APEX Invoke Graph SOPで、 Output Dictionary Bindings の横にあるをクリックし、取得する出力ノードをもう1つ追加します。
-
新しい Output Dictionary Bindings エントリで:
-
Apex Outputs Group を
output2
に設定します。ドロップダウンボックスからoutput2
を選択することができます。 -
Output Attrib には、出力される辞書の名前(
output2_parms
)を設定します。
-
取得された値を確認します:
-
ネットワークエディタで、APEX Invoke Graph SOPを選択します。
-
Geometry Spreadsheetで、上部のツールバーから Detailを選択します。
2個の出力ノードのoutput
とoutput2
からの値が計算され、取得され、それらの結果がoutput_parms
とoutput2_parms
という2つの辞書に格納されています。
数値演算に基づいてジオメトリを変更する ¶
以下の例では、加算演算の結果に基づいてボックスジオメトリのサイズを変更する方法を説明します。
グラフロジックを作成する ¶
-
2つの数値を加算するグラフから始めます。
-
ボックスジオメトリ(sop::boxノード)を追加します。Add演算の
result
はボックスジオメトリのscale
に接続されているので、そのAdd演算の合計値がボックスのサイズに影響します。
グラフロジックを評価する ¶
今回は、単なる数値ではなくジオメトリを取得します。ボックスを表示するには、output
ノードでボックスジオメトリを取得する必要があります:
-
APEX Invoke Graph SOPで、 Bind Output Geometry をオンにし、その値を
output:geo
(<出力ノードの名前>:<出力ノードのジオメトリ>)に設定します。
APEX Invoke Graph SOPのDisplayフラグをオンにします。ビューポートにボックスが表示されます。
ジオメトリから情報を取得して使用する ¶
ジオメトリから情報を取得し、その情報を使用して追加で演算を実行することができます。 以下の例では、ボックスジオメトリのコーナーに球を配置します。 入力パラメータを変更すると、ボックスと球体の両方のサイズが変化します。
グラフロジックを作成する ¶
-
前の例のボックスジオメトリのグラフから開始します。
-
下図の赤いノードを追加します。このグラフロジックでは、球はボックスジオメトリ内の特定のコーナーに配置され、その球とボックスが1ジオメトリとしてマージされて出力されます。
ノード |
説明 |
---|---|
|
ポイントの位置を設定するには:
|
|
|
|
|
グラフロジックを評価する ¶
ボックスと球を一緒に表示するには、output
ノードからボックスと球が結合されたジオメトリを取得する必要があります:
-
APEX Invoke Graph SOPで、 Bind Output Geometry をオンにし、その値を
output:box_sphere_geo
(<出力ノードの名前>:<出力ノードの結合されたジオメトリ>)に設定します。 -
APEX Invoke Graph SOPのDisplayフラグをオンにし、ビューポートにボックスと球を表示します。
Attribute Adjust Dictionary SOPを選択し、パラメータエディタにグラフ入力パラメータの
a
とb
を表示します。 ただし、APEX Invoke Graph SOPのDisplayフラグはオンのままにします。 Attribute Adjust Dictionary SOPでa
とb
の値を調整すると、ビューポートでボックスと球のサイズが変わります。
Animateステート用のグラフ ¶
Animateステート は、シーン内に複数のキャラクタを表示することができる新しいビューアステートです。 キャラクタに対してFKやIKなどのポージングを実行したり、キャラクタのコントロールを操作したり、キャラクタ間に拘束を作成することができます。 Animateステートは、APEXグラフを解釈し、そのAPEXグラフを評価し、その評価された出力をビューポートに表示します。
Animateステートで評価できるグラフを構築するには、通常のグラフの構築方法に加えて、特定の規則に従う必要があります。 このセクションでは、コントロールや拘束の作成、ジョイント階層の定義、ジオメトリ変形の実行など、Animateステートで使用される特定の機能のためのグラフロジックの構築方法をいくつか紹介します。
Note
アニメータがAnimateステートで操作可能なコントロールやジオメトリを持ったAPEXグラフを区別するために、そのようなAPEXグラフには リグ または リググラフ という用語を使用することにします。 グラフ という用語だと、より汎用的で、Animateステートでのインタラクション要素以上の目的を含んでいます。
注意すべき重要な点は、Animateステートで表示できるのは、パックされたキャラクタ要素だけだということです。 リググラフを構築し終えたら、Animateステートでリググラフを取得してそれを表示できるようするために、そのリググラフをパックフォルダ構造に追加する必要があります。 Animateステートで評価できるようにキャラクタデータを準備する方法については、パックキャラクタフォーマットを参照してください。
以下のサンプルファイルでは、APEXグラフを使用してAnimateステート用の機能を構築する方法を説明しています。
コントロール ¶
コントロールとは、Animateステートでユーザがアニメーションを操作できるものです。 以下の例では、特別なAPEXノードであるTransformObjectを紹介します。 TransformObjectは、要素間のトランスフォーム階層の定義など、要素のトランスフォームの挙動を管理します。 また、アニメーションさせやすくするために、定義された回転順序を使って移動、回転、スケールといったトランスフォームコンポーネント入力を処理します。 TransformObjectノードをグラフに配置し、そのパラメータを プロモート させると、そのTransformObject要素はAnimateステートによってピックアップされてコントロールに変わります。 その結果、そのTransformObject要素は、ユーザが操作できるものとして表示されます。
リグロジックを作成する ¶
-
ネットワークエディタのジオメトリレベルで、APEX Edit Graph SOPを作成します。
-
APEX Edit Graph SOPを選択したまま、APEX Network Viewを開きます。APEXネットワークビューでは、APEX Edit Graph SOPにグラフを直接書き込むことができます。
-
APEXネットワークビュー内で、ジオメトリのコントールを追加するグラフを作成します:
-
グラフ入力ノードとグラフ出力ノードを追加します:
-
入力パラメータを受け取るノードを追加します。TABを押してTabメニューを開き、 Input を選択します。すると
input
ノードがグラフに追加されます。 -
Tabメニューで Output を選択してグラフ出力ノードを追加します。
-
-
ジオメトリを動かすノードを追加します:
ノード
説明
torus
あれこれ動かすトーラスジオメトリ。
TransformObject
階層トランスフォームの挙動の定義と管理をします。 Animateステートでトランスフォームを制御可能にするには、TransformObjectノード上の制御したい入力パラメータを
input
ノードに接続することで、その入力パラメータをプロモートさせる必要があります。 TransformObjectノード上のパラメータがプロモートされると、そのTransformObject要素がコントロールに変わり、ユーザがAnimateステートで操作できるようになります。この例では、移動(
t
)と回転(r
)のパラメータがプロモートされているので、ユーザは、Animateステートでコントールの移動コンポーネントと回転コンポーネントにアクセスすることができます。transform_geo
トーラスの位置を変更します。
-
Animateステートを使用してリグロジックを評価する ¶
ビューポートでは、グラフそのものがジオメトリとして表現されます:
グラフの 出力 を確認するには、Animateステートに入る必要があります。 Animateステートは、自動的にグラフを解釈して、その評価された出力を表示します。 また、Animateステートは、プロモートされたすべてのパラメータ(この例では移動と回転のパラメータ)のコントロールを作成し、それらのコントロールを操作できるようにします。
Animateステートに入るには:
-
以下のようにノードネットワークを接続します。
Pack Folder SOPは、リグをパックフォルダ構造にパックします。 Animateステートには、パックされたキャラクタ要素のみが表示されます。
-
Pack Folder SOPでは、入力がSOPに接続されると、自動的に Name パラメータに値が入力されます。入力の Type を
rig
に指定します。rig
は、入力にリグロジックが含まれていることをAnimateステートに伝える特別な拡張子です。 -
APEX Scene Animate SOPを選択し、左側のツールバー上の Animateをクリック、または、ビューポート内でEnterを押します。
以下の動画は、Animateステートに入っています。 トーラスの中央にある白いドットがコントロールです。 移動と回転のパラメータがプロモートされているので、そのコントロールをクリックすると、その移動および回転のハンドルが表示されます。
Animateステートでコントロールを操作すると、プロモートされたパラメータが変更され、それらのパラメータがグラフロジックの入力として使用されます。 コントロールをドラッグする度に、更新されたパラメータでグラフが評価されます。
親子階層 ¶
以下の例では、親子ノード階層を作成します。
リグロジックを作成する ¶
-
前の例のトーラスのコントロールリグから開始します。
-
子コントロールを追加します(この例では赤のノードが新たに追加したノードです):
ノード
説明
child
2つ目のTransformObjectノードをグラフに追加し、
t
とr
のパラメータをプロモートします。これで、親コントロールと子コントロールの2つのコントロールができました。parent
入力やparentlocal
入力に何か接続されているTransformObjectノードは、親子階層では子になります。 親子階層を作成するには、次のように接続します:-
親TransformObjectの
xform
出力を子TransformObjectのparent
入力に接続します。 -
親TransformObjectの
localxform
出力を子TransformObjectのparentlocal
入力に接続します。
child_starting_position
親コントロールと子コントロールが直接重なり合わないように
child
TransformObjectノードに対してオフセットを作成します。子コントロールのトランスフォームを変更するには:-
transform::Buildを選択してPを押してノードパラメータウィンドウを開きます。
-
移動パラメータ
t
のXコンポーネントに1.0
などの値を設定します。
child_starting_position
ノードの出力をchild
ノードのrestlocal
入力に接続します。 このrestlocal
は、親コントロールを基準に子コントロールの開始位置を定義します。つまり、親コントロールに対するオフセットです。 -
Animateステートを使用してリグロジックを評価する ¶
コントロールの親子階層を確認するために、Animateステートに入ります:
-
ノードネットワークを上記のコントロールの例のように接続します。
-
APEX Scene Animate SOPを選択し、左側のツールバー上の Animateをクリック、または、ビューポート内でEnterを押します。
以下の動画は、Animateステートに入っています。左側の白いドットが親コントロールです。右側の白いドットが子コントロールです。
トーラスの位置は子コントロールによって駆動されているため、子コントロールにトーラスの中心が来ています。
拘束 ¶
以下の例では、拘束を作成することで、親子関係を切る方法を紹介します。
リグロジックを作成する ¶
-
前の例からの親子リグから開始します。
-
2つ目の子コントロールを追加します(赤のノードが新たに追加したノードです):
ノード
説明
child2
t
とr
のパラメータをプロモートして、2つ目の子コントロールを作成します。child2_start_position
新しい子コントロールのオフセットを作成します。
-
child2_start_position
を選択してPを押してノードパラメータウィンドウを開きます。 -
移動パラメータ
t
のXコンポーネントに(前の例で作成した)1つ目の子コントロールとは異なる値を設定します。
以下のAnimateステートを示した動画では、左側のコントロールが親、中央のコントロールが1つ目の子コントロール、右側のコントロールが2つ目の子コントロールです。どちらの子コントロールも親に従っています。
-
-
(下図の青のノードのように)
transform::Build
ノードを追加し、そのノード名をdriver
に変更します。driver
ノードの出力をchild2
ノードのxform
入力に接続して、child2
ノードのコントロールをdriver
ノードに拘束します。 TransformObjectのxform
入力はワールド空間トランスフォームであり、他のすべての入力を上書きします。xform
に何かを接続すると、拘束のように動作します。-
driver
ノードを選択してPを押してノードパラメータウィンドウを開きます。 -
移動パラメータ
t
のXコンポーネントを設定します。
Note
TransformObjectノードが階層の子として接続されていて、何かが
xform
に接続されると、そのTransformObjectノードはその親に従わなくなり、xform
入力の位置に拘束されるようになります。 -
Animateステートを使用してリグロジックを評価する ¶
以下の動画では、中央の子コントロールは拘束されておらず、親(左側のコントロール)に従っています。
一方、右側の子コントロールは親子階層にありますが、親に従っていません。
拘束の入力(xform
)がその位置をxform
位置に拘束しているからです。
Note
TransformObjectノードが階層の子であり、拘束されている(そのxform
入力に何かが接続されている)場合、そのlocalxform
出力は、TransformObjectノードが親子化されていない場合とはまったく異なる値を持つことになります。
ローカル空間は親の動きを“逆アニメーションさせて”、コントロールをその拘束された位置に留めます。
移動、回転、スケールのいずれか1つのみを拘束し、その他のトランスフォームコンポーネントは維持したい場合は、1つのトランスフォームコンポーネントを拘束するを参照してください。
ジオメトリの変形 ¶
APEX以前のジオメトリの変形では、別々に分かれた一連の評価ステップが必要となり、ボーン変形の前にスケルトン変形を評価しなければなりませんでした。 以下の例では、チューブジオメトリを変形させています。 Rig Pose SOPがスケルトンを変形し、スケルトンの変形の評価結果がBone Deform SOPのボーン変形に渡されています。
APEXでは、同一工程で、変形する入力要素を組み立て、準備をします(以下の青のノード)が、
APEX前のセットアップにおけるRig Pose SOPとBone Deform SOPのロジックは、今では1つの場所、ここではbone_deform_rig
ノード内のAPEXグラフにまとめられています。
そのbone_deform_rig
ノードは、リグロジックを構築し、そのcreate_character
ノードはアニメーション準備としてキャラクタ要素を組み立てます(詳細は、キャラクタデータの組み立てを参照してください):
リグロジックを作成する ¶
以下は、APEX Edit Graph SOPであるbone_deform_rig
内のリグロジックです:
KineFX (APEX前) |
APEXグラフの機能 |
説明 |
---|---|---|
Rig Pose SOP |
FK階層(緑のノード)、トランスフォームによるアニメーションスケルトン(オレンジ色のノード) |
3つのTransformObjectノードが、 TransformObjectノードの
Note この例では、スケルトンのジョイント名を
SetPointTransformsノードの出力は、アニメーションスケルトンで、それが |
Bone Deform SOP |
ボーン変形(紫色のノード) |
KinefXワークフローでのBone Deform SOPの3つの入力は、 |
以下のテーブルには、SetPointTransformsノードとValueノードに関する詳細を載せています。
ノード |
説明 |
---|---|
SetPointTransformsノード |
SetPointTransformsはスケルトンデフォーマです。
トランスフォームを受け取り、それをスケルトンのジョイントに適用します。
これは特殊なノードで、可変長入力である SetPointTransformsのサブポートの名前は、そのポート名をクリックすることで、スケルトンのジョイント名(Skeleton SOPからのジョイント名)と同じになるように変更することができます。 |
Valueノード |
Value<Geometry>ノードは、静止スケルトンのコピーを作成し、このコピーをSetPointTransformsに接続します。 静止スケルトンのコピーを作成する必要がある理由は、SetPointTransformsノードは、接続されたジオメトリをその場で変更を行なうからです。 もし静止スケルトンをSetPointTransformsノードに接続してしまうと、そのSetPointTransformsノードはその静止スケルトンに対して変更を加えてしまいます。 その結果、静止スケルトンは静止スケルトンではなくなり、アニメーションスケルトンになります。 静止スケルトンは、ジオメトリ変形を実行するための参照として使用されます。 静止スケルトンとアニメーションスケルトンのトランスフォームの差を計算し、この差を使用して、ジオメトリの変形方法を決定します。 SetPointTransformsノードに接続する前に静止スケルトンのコピーを作成しなかった場合、SetPointTransformsノードはその静止スケルトンを更新してしまいます。 その結果、静止スケルトンとアニメーションスケルトンが同じになり、差分のないトランスフォームがジオメトリ変形に適用されることになります。 以下の例は、Valueノードを使用して最初にコピーを作成することなく、静止スケルトンを直接SetPointTransformsに接続した場合、何が起こるかを示したものです。 期待通りにボーンを変形させるには、Value<Geometry>ノードを使用して、静止スケルトンのコピーを作成する必要があります。
SetPointTransformsノードはコピーに対して更新を行ない、アニメーションスケルトンはSetPointTransformsノードから 元の静止スケルトンは、 |
Animateステートを使用してリグロジックを評価する ¶
Pack Folder SOPを使用して、キャラクタ要素(チューブジオメトリ、スケルトン、リグ)をAnimateステートでアニメーション可能な“キャラクタ”にパックします。 Pack Folder SOP内でキャラクタ要素に名前を付ける方法については、キャラクタデータを組み立てるを参照してください。
ジオメトリを変形するには、Animateステートに入ります:
-
ネットワークエディタでAPEX Scene Animate SOPを選択し、Displayフラグをオンにします。
-
左側のツールバー上の Animateをクリック、または、ビューポート内でEnterを押します。
Note
Animateステートのジオメトリが正しく見えない場合は、リググラフの静止トランスフォームが適切に設定されていない可能性があります。 スケルトンに基づいて静止トランスフォームを設定するには:
-
TransformObjectノードの名前がスケルトンのジョイント名と一致していることを確認します。
-
ネットワークエディタでAPEX Edit Graph SOPを選択します。
-
パラメータエディタで Update Rest Transforms From Skeleton をクリックします。
-
ダイアログが表示されたら、ネットワークエディタでSkeleton SOPを選択すると、ダイアログで自動的にSkeletonノードが選択されます。
-
Accept をクリックします。
-
APEX Scene Animate SOPを選択し、 Reset All をクリックします。
-
Animateステートに入ります。
1つのトランスフォームコンポーネントを拘束する ¶
特定の1つのトランスフォームコンポーネント(移動、回転、またはスケール)をドライバに拘束し、他のコンポーネントは変更しないようにするには、TransformObjectノードのxformmask
ポートを使用します。
移動、回転、スケールの値にビットマスクをセットアップします。
ジョイントの回転をドライバの回転に拘束したい場合は、回転のValueノードを1
に設定し、移動およびスケールのValueノードを0
に設定します。
以下の例では、ピンクのノードを使用して、1つのトランスフォームコンポーネントをドライバに拘束する機能をセットアップしています。
driver
TransformObjectノードの移動および回転の値はコントロールとしてプロモートされ、以下の機能を持ちます:
-
driver
の移動コントロールを変更しても、joint_1
の移動はdriver
に拘束されていないため、スケルトンのjoint_1
は動きません。チューブジオメトリは変形しません。 -
driver
の回転コントロールを変更する場合、joint_1
の回転はdriver
の回転に拘束されているため、joint_1
の回転はdriver
と一緒に更新されます。チューブジオメトリは、joint_1
回転に合わせて変形します。
以下の動画では、ドライバの 移動 を変更しても、チューブジオメトリは変形しません。ドライバの 回転 を変更すると、チューブが回転に合わせて変形します。
Abstract Controls(抽象コントロール) ¶
抽象コントロールは、浮動小数点値を駆動させたり、ポージング用途でリグのピボットポイントとして使用可能なコントロールです。 抽象コントロールは、TransformObjectノードから作成されたコントロールとは異なり、トランスフォームに関連付けられていません。 ビューポート内での抽象コントロールの操作の挙動は、通常のコントロールと異なります。 抽象コントロールの場合、ユーザは、コントロールをドラッグして浮動小数点値を駆動します。 通常のコントロールの場合、コントロールの配置や操作をする際にトランスフォームハンドルが利用可能です。
AbstractControlグラフノードは、リグロジックの機能に影響せず、実行もされません。
それは、xform
入力で指定された位置に留まり、他の入力ポートの接続次第で、値を駆動させたり、ピボットポイントとして使用されます。
以下の例では、5本のジョイントが入ったチューブジオメトリから始めて、前のボーン変形の例と同様のネットワークを構築します。
2個の抽象コントロールをボーン変形リグロジックに追加します:
-
joint_4
に留まるピボット(赤いノード)。 -
joint_2
に留まり、joint_2
を基準にチューブジオメトリのスケールを駆動させるコントロール(青いノード)。
ノード |
説明 |
||||||
---|---|---|---|---|---|---|---|
|
|
||||||
|
AbstractControlノードの 以下の例では、 |
||||||
|
sop::softxformノードは、指定されたポイントグループ、さらにそれらの隣接ポイントも動かします。この例では、joint_2周辺のポイントのスケールを上げています。
|
||||||
|
AbstractControlノードの
|
||||||
ドラッグの挙動 |
アクション |
||||||
コントロール値を整数ステップサイズで変更する |
⌃ Ctrlを押しながらドラッグします。 |
||||||
コントロール値をもっと遅く変更する |
⇧ Shiftを押しながらドラッグします。 |
||||||
コントロール値をもっと速く変更する |
⌃ Ctrl + ⇧ Shiftを押しながらドラッグします。 |
抽象コントロールを設定する ¶
抽象コントロールの外観 ¶
抽象コントロールのサイズ、形状、カラー、位置を設定するには、APEX Configure Controls SOPを使用します。
-
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 Override 、 Use Shapeoffset 、 Use Color のパラメータを有効にしてください。
-
設定された抽象コントロールを確認するために、Animateステートに入ります:
-
ネットワークエディタでAPEX Scene Animate SOPを選択して、Displayフラグをオンにします。
-
左側のツールバーにある Animateをクリック、または、ビューポート内でEnterを押します。
-
抽象コントロールプロパティ ¶
抽象コントロールプロパティは、ビューポート内でのコントロールの挙動を定義します。
これらのプロパティは、AbstractControlノードのproperties
辞書アトリビュートに格納されます。
properties
辞書には、以下の階層のように入れ子化された辞書を含んでいます:
control: parms: <property1>, <property2>, ...
control
コントロールの設定方法に関する情報(例えば、ビューポート内でのコントロールの見え方やコントロールのデフォルトパラメータ)を含んだ辞書。 コントロール形状に関する情報もこの辞書に格納されます。
parms
そのcontrol
辞書の中にさらにparms
辞書があります。
parms
辞書には、コントロールの挙動を決めるデフォルトパラメータが格納されます。
以下のテーブルでは、抽象コントロールに対して設定可能なプロパティを載せています:
プロパティ |
タイプ |
説明 |
---|---|---|
x_min, x_max |
|
コントロールを水平方向にドラッグした時のデフォルトの最小値と最大値を定義します。 これが定義されていない場合、デフォルトの最小値と最大値は-10と10です。 |
y_min, y_max |
|
コントロールを垂直方向にドラッグした時のデフォルトの最小値と最大値を定義します。 これが定義されていない場合、デフォルトの最小値と最大値は-10と10です。 |
lock_range |
|
|
Attribute Adjust Dictionary SOPとAttribute Wrangle SOPを使用することで、抽象コントロールプロパティを設定することができます。
Attribute Adjust Dictionary SOPは、コントロールプロパティの辞書を作成するのに使用します。
そして、Attribute Wrangle SOPを使用して、その辞書をAbstractControlノード上のproperties
アトリビュートに設定することができます。
ノード |
説明 |
||||||
---|---|---|---|---|---|---|---|
Attribute Adjust Dictionary SOP |
抽象コントロールプロパティの辞書を作成します。
|
||||||
Attribute Wrangle SOP |
抽象コントロールの Group パラメータに VEXpression テキストボックスに、以下のVEXコードを入力します: dict parms = detail(1, '<Attribute Nameパラメータ>'); dict ctrl; ctrl['parms'] = parms; d@properties['control'] = ctrl; この Note Attribute Adjust Dictionary SOPで作成される辞書の名前は、( Attribute Name パラメータで)好きなように設定することができます。
しかし、抽象コントロールの 抽象コントロールの control: parms: x_min, x_max, ... 抽象コントロールの
|
アトリビュートとコールバック ¶
APEXグラフジオメトリは以下のアトリビュートを持っています。
名前 |
クラス |
タイプ |
説明 |
---|---|---|---|
|
point |
|
ノードの名前。 |
|
point |
|
ノードのコールバック名。 |
|
point |
|
ノードのカラー。 |
|
vertex |
|
ポートの名前。 |
|
vertex |
|
サブポート名または名前が変更されたポート。 |
|
vertex |
|
ポートのインデックス番号。 |
|
point |
|
ポートのデフォルト値の辞書。 |
|
point |
|
|
|
point |
|
ノードの追加メタデータの辞書。 |
一部のグラフエレメントには特別なコールバック名があります。
ノード |
コールバック名 |
---|---|
グラフ入力ノード |
|
グラフ出力ノード |
|
サブネット |
|
ステッキーノート |
|
How to ¶
To... | Do this |
---|---|
グラフから数値を取得する |
上部のツールバーから Detailを選択すると、出力される辞書をGeometry Spreadsheetで確認することができます。 2つの値を加算する例を参照してください。 |
グラフからジオメトリを表示する |
ジオメトリを変更する例を参照してください。 |
コントロールを追加する |
コントロールに変換したいパラメータについては、TransformObjectノードの入力パラメータをグラフ コントロールを追加する例を参照してください。 |
親子階層を作成する |
2個のTransformObjectノードを以下のように接続します:
親子階層を作成する例を参照してください。 |
親コントロールを基準に子コントロールの開始位置を設定する |
|
拘束を作成する |
TransformObjectノードをドライバに拘束するには、ドライバの出力をTransformObjectノードの 拘束を作成する例を参照してください。 |
1つのトランスフォームコンポーネントを拘束する |
IntBitMaskToBoolノードと、移動、回転、スケールコンポーネントのValueノードを使用して、拘束する特定のトランスフォームコンポーネントを決定するビットマスクを作成します。
IntBitMaskToBoolノードの出力を、拘束したいTransformObjectノードの 1つのトランスフォームコンポーネントを拘束する例を参照してください。 |
スケルトンに呼応したリグ階層を作成する |
APEX Edit Graph SOPの Import KineFX Skeleton ボタンを使用してください。 |
スケルトンからリグ階層の静止位置を更新する |
APEX Edit Graph SOPの Update Rest Transforms From Skeleton ボタンを使用してください。 |
グラフのワイヤーを削除する |
Yを押しながらワイヤー上をドラッグします。 または ワイヤーを選択してDeleteを押します。 |
グラフノードのパラメータ値を変更する |
グラフノードを選択し、Pを押すとAPEXノードパラメータウィンドウが表示されます。 |
グラフのポート名を変更する |
ポート名をクリックします。 |
APEXネットワークビュー内でグラフを可視のままにする |
ネットワークエディタ内で選択されているノードのグラフをAPEXネットワークビューに表示したいのであれば、そのグラフのピン留めを解除してください。 |
命名に関するメモ ¶
-
SetPointTransformsノードでは、可変長入力の
transforms
のサブポート名は、入力スケルトン(SetPointTransformsノードのgeo
入力)のジョイント名に必ず合わせてください。 -
TransformObjectノードの名前は、スケルトンジョイントの名前に合わせる必要はありません。 ただし、APEX Edit Graph SOPの Update Rest Transforms From Skeleton ボタンを使用したい場合には、TransformObjectノードはスケルトンジョイントの名前に合わせる必要があります。