On this page |
Animateステートは、シーン内に複数のキャラクタを表示できるビューアステートです。キャラクタに対してFKやIKなどのポージングを実行したり、キャラクタのコントロールを操作したり、キャラクタ間に拘束を作成することができます。Animateステートは、APEXグラフを解釈し、そのAPEXグラフを評価し、その評価された出力をビューポートに表示します。このページでは、コントロールや拘束の作成、ジョイント階層の定義など、Animateステートで使用される特定の機能のためのグラフロジックの例を紹介します。
Note
アニメータがAnimateステートで操作可能なコントロールやジオメトリを持ったAPEXグラフを区別するために、そのようなAPEXグラフには リグ または リググラフ という用語を使用することにします。 グラフ という用語だと、より汎用的で、アニメーションでのインタラクション要素以上の目的を含んでいます。
Animateステートで表示できるのは、パックキャラクタフォーマット内のデータのみです。リググラフを構築し終えたら、Animateステートでリググラフを取得してそれを表示できるようにするために、そのリググラフをパックフォルダ構造に追加する必要があります。
以下のサンプルファイルでは、APEXグラフを使用してAnimateステート用の機能を構築する方法を説明しています。
コントロール ¶
コントロールとは、Animateステートでユーザが操作できるものです。この例では、特別なAPEXノードであるTransformObjectを紹介します。TransformObjectは、要素間のトランスフォーム階層の定義など、要素のトランスフォームの挙動を管理します。また、アニメーションさせやすくするために、定義された回転順序を使って移動、回転、スケールといったトランスフォームコンポーネント入力を処理します。TransformObjectノードをグラフに配置し、そのパラメータを プロモート (グラフの入力ノードに接続)させると、そのTransformObject要素はAnimateステートによってピックアップされてコントロールに変わります。その結果、そのTransformObject要素は、ユーザが操作できるものとして表示されます。以下の例では、ジオメトリ用のコントロールを作成します。
リグロジック ¶
以下のグラフは、トーラスジオメトリ用のコントロールを追加します:

input
グラフ入力ノード - 入力パラメータを受け取るノード。
output
グラフ出力ノード。
torus
あれこれ動かすトーラスジオメトリ。
TransformObject
階層トランスフォームの挙動の定義と管理をします。Animateステートでトランスフォームを制御可能にするには、TransformObjectノード上の操作したい入力パラメータをグラフ入力ノードに接続することで、その入力パラメータをプロモートさせる必要があります。TransformObjectパラメータがプロモートされると、そのTransformObject要素がコントロールに変わります。
上の例では、移動( t )と回転( r )のパラメータがプロモートされているので、ユーザはAnimateステートでコントロールの移動コンポーネントと回転コンポーネントにアクセスすることができます。
transform_geo
トーラスの位置を変更します。
リグロジックを評価する ¶
ビューポートでは、グラフそのものがジオメトリとして表現されます:

グラフの 出力 を確認するには、Animateステートに入る必要があります。Animateステートは、自動的にグラフを解釈して、プロモートされたパラメータのコントロールを作成し、評価された出力を表示します。Animateステートに入るには:
-
以下のようにノードネットワークを接続します:
Animateステートに入るためのネットワーク Pack Folder SOPは、リグをパックフォルダ構造にパックします。Animateステートには、このパックキャラクタフォーマット内のキャラクタ要素のみが表示されます。
-
Pack Folder SOPでは、入力がSOPに接続されると、自動的に Name パラメータに値が入力されます。入力の Type を
rig
に指定します。rig
は入力にリグロジックが含まれていることをAnimateステートに伝える特別な拡張子です。 -
APEX Scene Animate SOPを選択し、左側のツールバー上の
Animateをクリックします。
以下の動画は、Animateステートに入っています。トーラスの中央にある白いドットがコントロールです。移動と回転のパラメータがプロモートされているので、そのコントロールをクリックすると、その移動および回転のハンドルが表示されます。Animateステートでコントロールを操作すると、プロモートされたパラメータが変更され、それらのパラメータがグラフロジックの入力として使用されます。コントロールをドラッグする度に、更新されたパラメータでグラフが評価されます。
Animateステートでコントロールを操作
親子階層 ¶
この例では、親子ノード階層を作成します。
リグロジック ¶
前の例のトーラスのコントロールリグから開始して、子コントロールを追加します(赤のノードが新たに追加したノードです):

child
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
TransformObjectノードの restlocal 入力に接続します。この restlocal は、親コントロールを基準に子コントロールの開始位置を定義します。つまり、親コントロールに対するオフセットです。
リグロジックを評価する ¶
コントロールの親子階層を確認するために、Animateステートに入ります。以下の動画では、左側のドットが親コントロールで、右側のドットが子コントロールです:
トーラスの位置は子コントロールによって駆動されているため、子コントロールにトーラスの中心が来ています:

拘束 ¶
この例では、拘束を作成することで、親子関係を切る方法を紹介します。
リグロジック ¶
-
前の例の親子リグから開始して、2つ目の子コントロールを追加します(赤のノードが新たに追加したノードです):
2つ目の子コントロールを作成 以下の動画では、左側のコントロールが親、中央のコントロールが1つ目の子コントロール、右側のコントロールが2つ目の子コントロールです。どちらの子コントロールも親に従っています:
親コントロールに従う両方の子コントロール -
以下のグラフでは、
child2
TransformObjectコントロールは特定の位置に拘束されています:2つ目の子コントロールを拘束 child2
TransformObjectの xform 入力はワールド空間トランスフォームであり、他のすべての入力を上書きします。 xform 入力に何かを接続すると、拘束のように動作します。
Note
TransformObjectが階層の子として接続されていて、何かが xform 入力に接続されると、TransformObjectはその親に従わなくなり、 xform 入力の位置に拘束されるようになります。
リグロジックを評価する ¶
以下の動画では、中央の子コントロールは拘束されておらず、親(左側のコントロール)に従っています。一方、右側の子コントロールは親子階層にありますが、親に従っていません。 xform 入力によって xform 位置に拘束されているからです。
Note
TransformObjectが階層の子であり、拘束されている(その xform 入力への接続がある)場合、その localxform 出力は、TransformObjectが親子化されていない場合とはまったく異なる値を持つことになります。ローカル空間は親の動きを“逆アニメーションさせて”、コントロールをその拘束された位置に留めます。
1つのトランスフォームコンポーネントを拘束する ¶
特定の1つのトランスフォームコンポーネント(移動、回転、またはスケール)をドライバに拘束し、他のコンポーネントは変更しないようにするには、TransformObjectノードの xformmask ポートを使用します。
この例では、3つのジョイントが入ったチューブジオメトリから始めて、ボーン変形の例と同様のネットワークを構築します。ピンクのノードは、特定のトランスフォームコンポーネントをドライバ(ジョイントやコントロールのトランスフォームを駆動するもの)に拘束するために、ビットマスクを使用する機能を追加します:

joint_1
およびconstrain_rotate_to_driver
joint_1
では、 xformmask 入力は xform 入力との組み合わせで動作し、トランスフォームの特定のコンポーネントを上書きします。この例では、ビットマスクで以下の値を設定することで、joint_1
の回転をdriver
の回転に拘束しています:
-
rotate
Valueノード =True
-
translate
およびscale
Valueノード =False
driver
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
を基準にチューブジオメトリのスケールを駆動させるコントロール(青いノード)。

joint_*
joint_*
TransformObjectノードは親子階層で接続されています。joint_0
、joint_1
、joint_2
、joint_3
の移動パラメータ t がプロモートされています。抽象コントロールはjoint_4
の位置に留めるので、joint_4
のどのパラメータもプロモートしませんでした。
pivot
AbstractControlノードの xform 入力に何かが接続されていて、その x と y の入力ポートが接続されていない場合、そのAbstractControlノードは、ビューポートからはピボットとして使用可能なコントロールとして解釈されます。 xform ポートの入力がマトリックスである限り、その入力はどのノードも受け入れることができます。 これは、AbstractControlノードがコントロールを配置する場所を知るためにそうなっています。
この例では、joint_4
の xform 出力がpivot
抽象コントロールの xform 入力に接続されているので、そのpivot
抽象コントロールはjoint_4
の位置に留まります。joint_4
はジョイント階層内で最下位のジョイントであるにもかかわらず、そのjoint_4
の位置にあるpivot抽象コントロールを使用して、ジョイントチェーンで上位にあるジョイントを駆動させることができます。
以下の挙動を、Animateステートで確認できます:
-
ネットワークエディタで
APEX Scene Animate SOPを選択して、Displayフラグをオンにします。
-
左側のツールバーにある
Animateをクリックします。
soft_transform
sop::softxformノードは、指定されたポイントグループ、さらにそれらの隣接ポイントも動かします。この例では、
joint_2
周辺のポイントのスケールを上げています:
-
group パラメータには、トランスフォームさせたいジオメトリ内のポイントを指定します。この例では、 group には
joint_2
周辺のジオメトリポイントが設定されています。 -
s パラメータを
1.0
よりも大きい値に設定します。これは、joint_2
周辺のチューブのサイズを大きくします。

radius_control
AbstractControlノードの x または y の入力/出力ポートを、プロモートされた値の“path”に接続した場合、その抽象コントロールを水平または垂直方向にドラッグすると、そのプロモートされた値が駆動します。
soft_transform
ノードの半径パラメータ rad がプロモートされています。このradius_control
抽象コントロールはjoint_2
の位置に留まっています。その x 入力/出力ポートがプロモートされた rad 値に接続されているので、radius_control
は rad 値を駆動します。その抽象コントロールを水平方向にドラッグすると、joint_2
からさらに遠くにあるポイントのスケールが影響を受けます。
以下の挙動を、Animateステートで確認できます:
以下のホットキーは、ビューポート内の抽象コントロールのドラッグの挙動を変更します:
ドラッグの挙動 |
アクション |
---|---|
コントロール値を整数ステップサイズで変更する |
⌃ 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パスパターン構文を使用すればコントロールのグループを指定することができます。
-
目的の Use Shape Override 、 Use Shapeoffset 、 Use Color のパラメータを有効にしてください。
-
-
設定された抽象コントロールを確認するために、Animateステートに入ります:
-
ネットワークエディタで
APEX Scene Animate SOPを選択して、Displayフラグをオンにします。
-
左側のツールバーにある
Animateをクリックします。
-
抽象コントロールプロパティ ¶
抽象コントロールプロパティは、ビューポート内でのコントロールの挙動を定義します。これらのプロパティは、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 Name パラメータに辞書の名前を指定します。これは、後ほどAbstractControlノード上にコントロールプロパティの辞書を設定するAttribute Wrangle SOPで使用される名前です。
-
各コントロールプロパティのマルチパラメータを追加します:
-
Number of Entries の隣にある
をクリックします。
-
各プロパティに対して、 Key (プロパティの名前)、 Type 、 Value のパラメータを指定します。例:
-
Key :
x_min
-
Type : Float
-
Value :
0.001
-
-
Attribute Wrangle SOP
抽象コントロールのproperties
アトリビュートにプロパティの辞書を設定します。
Group パラメータに@callback=AbstractControl
を設定します。これは、プロパティが設定されるグラフノードを指定しています。
VEXpression テキストボックスに、以下のVEXコードを入力します:
dict parms = detail(1, '<Attribute Name parameter>'); dict ctrl; ctrl['parms'] = parms; d@properties['control'] = ctrl;
この<Attribute Name parameter>
には、Attribute Adjust Dictionary SOPの Attribute Name パラメータで設定した名前を入れてください。
Note
Attribute Adjust Dictionary SOPで作成される辞書の名前は、( Attribute Name パラメータ)で好きなように設定することができます。しかし、抽象コントロールのproperties
アトリビュート内の辞書の名前は、control
やparms
でなければなりません。その理由は、AbstractControlノードは、コントロールのプロパティを設定するときに、それらの名前を拾い上げるようになっているからです。
抽象コントロールのproperties
アトリビュートは、Geometry Spreadsheetで確認することができます:
-
ネットワークエディタで、Attribute Wrangle SOPを選択します。
-
ペインの上部で、
New Tabアイコンをクリックして、 New Pane Tab Type ▸ Inspectors ▸ Geometry Spreadsheet を選択します。
-
AbstractControlノードのアトリビュートを知りたいのであれば、グラフノードはグラフジオメトリ内ではポイントなので、Geometry Spreadsheet内で、上部のツールバーにある
Pointsを選択します。
-
抽象コントロール( callback =
AbstractControl
)の行の properties 列のエントリをクリックして、 Inspect を選択します。以下が抽象コントロールの
properties
アトリビュートの例です:{ "control":{ "parms":{ "lock_range":1, "x_max":2, "x_min":0.001, "y_max":2, "y_min":0.001 } } }
How-to ¶
To... | Do this |
---|---|
コントロールを追加する |
コントロールに変換したいパラメータについては、TransformObjectノードの入力パラメータをグラフのinputノードに接続することで、そのパラメータがプロモートされます。コントロールを追加する例を参照してください。 |
親子階層を作成する |
2個のTransformObjectノードを以下のように接続します:
親子階層を作成する例を参照してください。 |
親コントロールを基準に子コントロールの開始位置を設定する |
transform::Buildノードの出力を子TransformObjectノードの restlocal 入力に接続します。親子階層を作成する例を参照してください。 |
拘束を作成する |
TransformObjectノードをドライバに拘束するには、ドライバの出力をTransformObjectノードの xform 入力に接続します。拘束を作成する例を参照してください。 |
1つのトランスフォームコンポーネントを拘束する |
BoolToIntBitMaskノードと、移動、回転、スケールコンポーネントのValueノードを使用して、拘束する特定のトランスフォームコンポーネントを決定するビットマスクを作成します。BoolToIntBitMaskノードの出力を、拘束したいTransformObjectノードの xformmask 入力に接続します。1つのトランスフォームコンポーネントを拘束する例を参照してください。 |
ビューポート内の抽象コントロールのドラッグの挙動を変更する |
抽象コントロール値を整数ステップサイズで変更する - ⌃ Ctrlを押しながらドラッグします。 抽象コントロール値をもっと遅く変更する - ⇧ Shiftを押しながらドラッグします。 抽象コントロール値をもっと速く変更する - ⌃ Ctrl + ⇧ Shiftを押しながらドラッグします。 |