Houdini 20.5 キャラクタ KineFX

ビューポートアニメーション用のグラフ

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

Animateステートは、シーン内に複数のキャラクタを表示できるビューアステートです。キャラクタに対してFKやIKなどのポージングを実行したり、キャラクタのコントロールを操作したり、キャラクタ間に拘束を作成することができます。Animateステートは、APEXグラフを解釈し、そのAPEXグラフを評価し、その評価された出力をビューポートに表示します。このページでは、コントロールや拘束の作成、ジョイント階層の定義など、Animateステートで使用される特定の機能のためのグラフロジックの例を紹介します。

Note

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

Animateステートで表示できるのは、パックキャラクタフォーマット内のデータのみです。リググラフを構築し終えたら、Animateステートでリググラフを取得してそれを表示できるようにするために、そのリググラフをパックフォルダ構造に追加する必要があります。

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

APEXGraphExamples

コントロール

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

リグロジック

以下のグラフは、トーラスジオメトリ用のコントロールを追加します:

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

input

グラフ入力ノード - 入力パラメータを受け取るノード。

output

グラフ出力ノード。

torus

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

TransformObject

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

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

transform_geo

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

リグロジックを評価する

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

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

グラフの 出力 を確認するには、Animateステートに入る必要があります。Animateステートは、自動的にグラフを解釈して、プロモートされたパラメータのコントロールを作成し、評価された出力を表示します。Animateステートに入るには:

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

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

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

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

  3. 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ステートに入ります。以下の動画では、左側のドットが親コントロールで、右側のドットが子コントロールです:

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

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

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

拘束

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

リグロジック

  1. 前の例の親子リグから開始して、2つ目の子コントロールを追加します(赤のノードが新たに追加したノードです):

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

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

    親コントロールに従う両方の子コントロール
  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の回転をドライバに拘束

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個の抽象コントロールをボーン変形リグロジックに追加します:

  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抽象コントロールを使用して、ジョイントチェーンで上位にあるジョイントを駆動させることができます。

以下の挙動を、Animateステートで確認できます:

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

soft_transform

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

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

  • 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からさらに遠くにあるポイントのスケールが影響を受けます。

以下の挙動を、Animateステートで確認できます:

抽象コントロールが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パスパターン構文を使用すればコントロールのグループを指定することができます。

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

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

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

抽象コントロールプロパティは、ビューポート内でのコントロールの挙動を定義します。これらのプロパティは、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 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アトリビュート内の辞書の名前は、controlparmsでなければなりません。その理由は、AbstractControlノードは、コントロールのプロパティを設定するときに、それらの名前を拾い上げるようになっているからです。

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

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

  2. ペインの上部で、 New Tabアイコンをクリックして、 New Pane Tab Type ▸ Inspectors ▸ Geometry Spreadsheet を選択します。

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

  4. 抽象コントロール( 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ノードを以下のように接続します:

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

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

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

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

transform::Buildノードの出力を子TransformObjectノードの restlocal 入力に接続します。親子階層を作成する例を参照してください。

拘束を作成する

TransformObjectノードをドライバに拘束するには、ドライバの出力をTransformObjectノードの xform 入力に接続します。拘束を作成する例を参照してください。

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

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

ビューポート内の抽象コントロールのドラッグの挙動を変更する

抽象コントロール値を整数ステップサイズで変更する - ⌃ Ctrlを押しながらドラッグします。

抽象コントロール値をもっと遅く変更する - ⇧ Shiftを押しながらドラッグします。

抽象コントロール値をもっと速く変更する - ⌃ Ctrl + ⇧ Shiftを押しながらドラッグします。

KineFX

概要

キャラクタ要素の準備

APEXグラフを使用したリギング

APEXスクリプトを使用したリググラフの構築

リグコンポーネントを使用したリギング

ビューポート内でアニメーションを付ける

SOPベースのアニメーション

変形

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

H20以前

ペイン

別表