Houdini 21.0 群衆シミュレーション

レイヤアニメーションクリップ

エージェントにアニメーションクリップをレイヤとして重ねます。

On this page

以下のノードを使用することで、エージェントのベースアニメーションの上にアニメーションクリップをレイヤとして重ねることができます:

これらのノードは、群衆シミュレーションネットワーク内のCrowd State DOPの後に接続し、 POP Steer Path DOPと同様にステートビヘイビア系ノードの前後のいずれかに配置することができます:

エージェントにアニメーションクリップをレイヤとして重ねる

Agent Clip Layer DOPを使用することで、エージェントのベースアニメーションクリップの上にアニメーションクリップをレイヤとして重ねることができます。 これは、歩行サイクルの上に上半身の動きを含んだアニメーションクリップを追加するなど、群衆ショットにバリエーションを取り入れるのに役立ちます。 複数のAgent Clip Layer DOPを接続することで、複数のアニメーションレイヤを作成することができます。

レイヤ化されたアニメーションクリップは、以下の2つの方法でベースアニメーションと合成することができます:

  1. ブレンド比率に基づいて、レイヤ化されたクリップをベースアニメーションに合成する方法:

    元のポーズ(左)、レイヤ化されたポーズ(右)
    ブレンド比率=0の最終ポーズ(左)、ブレンド比率=0.5(中央)、レンド比率=1(右)
  2. レイヤ化されたクリップを 差分クリップ として使用する方法。差分は、レイヤ化されたクリップポーズとその同一クリップの参照ポーズから計算されます。そして、この差分をベースアニメーションに加算します:

    元のポーズ(左)、参照ポーズ(中央)、差分ポーズ(右)
    ベースアニメーションに差分ポーズの何%かを加算した最終ポーズ:0%(左)、50%(中央)、100%(右)

ベースアニメーションとレイヤアニメーションのブレンド

以下の例では、エージェントのベースアニメーションの歩行サイクルの上に、拍手アニメーションを重ねています。 この拍手アニメーションは、エージェントが境界ボックス内にいる時にそのエージェントの上半身に対してトリガーされます:

歩行アニメーションクリップ
拍手アニメーションクリップ

この例では、Agent Clip Layer DOPを使用してエージェントの上半身にアニメーションクリップを適用する方法を説明しています。 このアニメーションクリップは、エージェントが境界ボックス内にいる時に有効化されます。

ClipLayerTrigger

オブジェクトレベルとSOPネットワークのセットアップ

  1. オブジェクトレベルでは、利用可能なアニメーションクリップを定義し、 ジオメトリレベル(SOPネットワーク)では、群衆ネットワークをセットアップします。 下図のAgent SOPAgent Clip SOPAgent Transform Group SOPエージェント定義を構成しています:

  2. Agent SOPを使用して、エージェントを作成します:

    • Character Rig パラメータには、ベースアニメーションが入ったキャラクタリグを含んでいるノードを設定します。 そのパラメータの右側にあるボタンを使用すると、ポップアップウィンドウからノードを選択することができます。 この例では、 Character Rig パラメータを../../mocapbiped3_walkに設定しています。

  3. Agent Clip SOPを使用して、ベース(歩行)アニメーションクリップをエージェント定義に追加します:

    • Clips パラメータセットで、 Namewalkに設定します。

    • Character Rig パラメータを../../mocapbiped3_walkに設定します。

  4. エージェントが歩行クリップをループ再生しながら前進し続けるようにしたいので、そのAgent Clip SOPで以下の設定を行ないます:

    • Locomotion Node パラメータには、エージェント全体の移動を制御し空間内で前進させるジョイントを設定します。二足歩行の場合、通常だと、ここにはhipジョイントを設定します。

    • Start/End/Inc パラメータのチャンネルを削除します - Start/End/Incクリックして Delete Channels を選択します。

    • Start/End/Inc パラメータには、歩行クリップの開始フレームと終了フレームを設定します。

    • Convert to In-Place Animation チェックボックスをオンにします。

    Note

    クリップをプレビューするには:

    1. Set Current Clip チェックボックスをオンにして、そのフィールドにwalkを設定します。

    2. クリップがループ再生されている間にエージェントの位置が時間の経過と共に前進し続ける様子を確認するには、 Apply Clip Locomotion チェックボックスをオンにします。 エージェントがその場で歩行する様子を確認するには、 Apply Clip Locomotion チェックボックスをオフにします。

  5. 同じAgent Clip SOPを使用して、レイヤ(拍手)アニメーションクリップをエージェント定義に追加します:

    • Clips マルチパラメータの横にあるをクリックして、クリップパラメータセットを追加します。

    • Name パラメータをclapに設定します。

    • Character Rig パラメータを../../mocapbiped3_clapに設定します。

  6. Agent Transform Group SOPを使用して、レイヤクリップが適用されるスケルトンの部分を示した名前付きジョイントグループを作成します。 このAgent Transform Group SOPは、エージェント定義内のAgent SOPの後でCrowd Source SOPの前のどこかに配置します:

    • Transform Groups マルチパラメータを使用して、新しいジョイントグループを作成します。 Name パラメータにジョイントグループの名前(例えば、upper_body)を指定します。

    • Root Transforms パラメータで、そのグループのルートジョイント(s)を選択します。 各ルートジョイントとその子ジョイントがそのグループに追加されます。 この例では、 Root Transforms パラメータをSpine_To_Spine1に設定しています。 そのグループに属しているジョイントを確認するには、 Show Guide Geometry チェックボックスをオンにします。 これによって、選択したジョイントの周囲に球体が表示されます。 このガイドジオメトリを見やすくするために、エージェントを Wireframe表示します:

      アニメーションクリップを重ねるエージェントジョイント
  7. Crowd Source SOPで、 Initial State パラメータをDOPネットワーク内で利用可能などれかのステートに設定します。 このステートは、Crowd State DOPの State Name パラメータで指定されています。 このDOPネットワークにはwalkステートがあるので、 Initial State パラメータをwalkに設定します。

  8. DOPシミュレーションネットワークをセットアップします。

DOPシミュレーションネットワーク

以下の画像は、親のSOPネットワークcrowd_simulation DOPネットワークを表示しています:

  1. 以下の入力をそのcrowdsolver DOPに接続します:

    • crowdobject DOPをcrowdsolver DOPの1番目の入力(Crowd Object入力)に接続します。

    • 群衆ステートをcrowdsolver DOPの3番目の入力(States入力)に接続します。

    Note

    Agent Clip Layer DOPは、ステートをマージした後のCrowd Solverの前に配置しても構いません。

  2. 親のSOPネットワーク内のCrowd Source SOPがcrowd_simulation DOPネットワークの1番目の入力に接続されているので、crowdobject DOPの Source パラメータを First Context Geometry に設定します。

  3. Crowd State DOPで、ベースアニメーションクリップを再生する群衆ステートをセットアップします:

    • Crowd State DOPの名前をベースアニメーションクリップ名のwalkに変更します。

      Note

      デフォルトの Clip Name パラメータには$OSが設定されています。 これによって、群衆ステートが再生するアニメーションクリップの名前がそのCrowd State DOPの名前に設定されます。

    • 元の歩行クリップにはルート全体のモーションが含まれているので、 TypeLocomotive に設定します。

  4. Crowd Trigger DOPで、レイヤクリップを有効化するトリガーを設定します:

    • Type パラメータを Object Bounds に設定します。

    • Object SOP Path パラメータを境界ボックスのパス(この例では、../../../box)に設定します。

    • Check パラメータを Continuous に設定します。これによって、エージェントが境界ボックス内にいる間はそのレイヤクリップがトリガーされます。

  5. Agent Clip Layer DOPで、スケルトンの上にレイヤとして重ねる拍手アニメーションクリップを設定します:

    • デフォルトの Blend Mode パラメータは Interpolate に設定されているので、 Blend Ratio の値に応じて、ベースアニメーションとレイヤクリップの間で補間が行なわれます。

      Note

      代わりにベースアニメーションの上にレイヤアニメーションの効果を加算する詳細は、加算レイヤを参照してください。

    • Clip Name パラメータをclapに設定します。これは、ベースアニメーションの上に重ねるクリップです。

    • Transform Group パラメータをupper_bodyに設定します。これは、レイヤアニメーションを再生するジョイントグループです。

    • Blend Ratio パラメータを調整して、レイヤアニメーションとベースアニメーションのブレンドを制御します。

    • Activate with Trigger チェックボックスをオンにします。 Crowd Trigger DOPは、このAgent Clip Layer DOPの1つ目の Trigger 入力(2番目の入力)に接続されているので、 Activate with Trigger ドロップダウンメニューから First Trigger Input を選択します。

エージェントが境界ボックス内にいる時に拍手する最終アニメーション:

ベースアニメーション上にレイヤアニメーションクリップの効果を加算する

ベースアニメーションをレイヤアニメーションクリップの実際のトランスフォームとブレンドする方法ではなくて、 そのレイヤアニメーションクリップを 差分クリップ (レイヤアニメーションクリップのポーズとその同一アニメーションクリップ内の参照ポーズから計算された差分)として使用することができます。 この差分は、ベースアニメーションの上に加算されます。

ここの例では、歩行ベースアニメーションに頭を傾けるアニメーションクリップをレイヤとして重ねる方法を説明します:

歩行アニメーションクリップ
頭を傾けるアニメーションクリップ

オブジェクトレベルとSOPネットワークのセットアップ

オブジェクトレベルとSOPレベルのネットワークのセットアップは、前の例と同様ですが、 今回は、そのレイヤアニメーションクリップを差分クリップとしてセットアップする手順が追加されています:

  1. Agent SOPに設定するパラメータに関しては、前の例を参照してください。

  2. 1つ目のAgent Clip SOP(add_clips)を使用して、ベース(歩行)アニメーションクリップをエージェント定義に追加します。 設定するパラメータに関しては、前の例を参照してください。

  3. 同じAgent Clip SOP(add_clips)を使用して、頭を傾けるアニメーションクリップをエージェント定義に追加します:

    • Clips マルチパラメータの横にあるをクリックして、クリップパラメータセットを追加します。

    • Name パラメータをhead_turnに設定します。

    • Character Rig パラメータを../../head_turnに設定します。

    • Start/End/Inc パラメータのチャンネルを削除します - Start/End/Incクリックして Delete Channels を選択します。

    • Start/End/Inc パラメータには、歩行クリップの開始フレームと終了フレームを設定します。

  4. 差分クリップをセットアップします。

  5. Agent Transform Group SOPで設定するパラメータに関しては、前の例を参照してください。

  6. 群衆の中の1体のエージェントのみを表示したいので、Crowd Source SOPで以下の設定を行ないます:

    • Layout パラメータを Formation に設定します。

    • Rows パラメータと Columns パラメータを1に設定します。

    • Initial State パラメータをwalkに設定します。

  7. DOPシミュレーションネットワークをセットアップします。

差分クリップのセットアップ

  1. 差分クリップを生成するCHOPネットワークをセットアップします:

    CHOPネットワーク
  2. Agent CHOPを使用して、エージェント定義から頭を傾けるアニメーションクリップを取り込みます。Agent CHOPで以下の設定を行ないます:

    • SOP Path パラメータには、取り込みたいアニメーションクリップが入ったエージェントを含んでいるSOPノード(例えば、../../add_clips)を設定します。

    • Clip Name パラメータには、レイヤアニメーションクリップの名前(例えば、head_turn)を設定します。

  3. Pose Difference CHOPで、参照ポーズに使用したいクリップのフレーム番号を設定します。

  4. 親のSOPネットワーク内にある2つ目のAgent Clip SOP(add_difference_clip)を使用して、その差分クリップをエージェント定義に追加します:

    • Input パラメータを CHOP に設定します。

    • Name パラメータに、その差分クリップの名前(例えば、head_turn_additive)を指定します。

    • CHOP パラメータに、そのCHOPネットワーク出力(例えば、../set_up_difference_clip/HEAD_TURN_ADDITIVE)を設定します。

    Warning

    元のレイヤアニメーションを含んだAgent Clip SOPに差分クリップを追加しようとすると、エラーが発生します。

DOPシミュレーションネットワーク

以下の画像は、親のSOPネットワークcrowd_simulation DOPネットワークを表示しています:

  1. Crowd Object DOPおよびCrowd State DOPのパラメータ設定に関する情報は、前の例を参照してください。

  2. Agent Clip Layer DOPでは、頭を傾ける差分クリップをベースアニメーションの上に重ねるレイヤとして設定します:

    • Blend Mode パラメータを Additive に設定します。これは、ベースアニメーションの上にレイヤアニメーションクリップの効果を加算します。

    • Clip Name パラメータに、差分クリップ(例えば、head_turn_additive)を設定します。 このクリップ名は、親のSOPネットワーク内のAgent Clip SOP(add_difference_clip)で設定済みです。

    • Transform Group パラメータにupper_bodyを設定します。

    • ベースアニメーションの上に加算されるレイヤアニメーションクリップの割合を制御するために、 Blend Ratio パラメータを調整します。

歩行アニメーションの上に頭を傾けるクリップをレイヤとして加算した最終アニメーションを右側に表示しています:

元の歩行アニメーションクリップ
歩行アニメーションの上にレイヤとして加算した頭を傾けるクリップ

How-to

To...Do this

レイヤアニメーションクリップを特定のエージェントグループに適用する。

Agent Clip Layer DOPGroup パラメータをオンにして、そのフィールドにエージェントを指定します。

ベースアニメーションをレイヤアニメーションクリップでオーバーライドする。

Agent Clip Layer DOPで:

  1. Blend Mode パラメータを Interpolate に設定します。

  2. Blend Ratio パラメータを1に設定します。

ベースアニメーションとレイヤアニメーションクリップ間の遷移を滑らかにする。

Agent Clip Layer DOPで:

  1. Activate with Trigger チェックボックスをオンにします。

  2. Blend In Frames パラメータと Blend Out Frames パラメータの値を上げます。

トリガー時にレイヤアニメーションクリップを一回だけ再生する。

Agent Clip Layer DOPで:

  1. Activate with Trigger チェックボックスをオンにします。

  2. Play Once チェックボックスをオンにします。

レイヤクリップを特定の時間から開始するように設定する。

Agent Clip Layer DOPの Initial Clip Time チェックボックスをオンにして、値を設定します。

レイヤクリップの再生速度を上げる。

Agent Clip Layer DOPの Clip Speed Multiplier チェックボックスをオンにして、値を上げます。

異なるトリガーで有効化される複数のレイヤクリップを追加する。

  1. トリガー(Crowd Trigger DOP)を、Agent Clip Layer DOPのどれかの Trigger 入力に接続します。

  2. そのAgent Clip Layer DOPの Clips マルチパラメータの横にあるをクリックして、レイヤクリップ用のパラメータセットを追加します。

  3. その新しいクリップパラメータセットで、 Activate with Trigger チェックボックスをオンにして、その Activate with Trigger ドロップダウンには、そのトリガーが接続されているAgent Clip Layer DOPの入力を選択します。

エージェントが再生するレイヤクリップをランダムにする。

アニメーションクリップのライブラリがあれば、ベースアニメーションの上に再生されるレイヤクリップとして、異なるクリップがランダムに選択されるように指定することができます。

  1. Agent Clip Layer DOPの Randomize Clips チェックボックスをオンにします。

  2. エージェントがベースアニメーションの上にレイヤとして追加できる Clip Names を設定します。 各 Clip Names パラメータには、複数のクリップを指定することができます。

  3. クリップグループの Weight 値を設定します。値が高いほど、そのクリップグループが再生される確率が高くなります。

  4. Clip Groups マルチパラメータの横にあるをクリックして、異なるウェイトのクリップグループを追加します。

4つ以上のトリガーをセットアップする。

複数のAgent Clip Layer DOPを直列でチェーン接続します。

エージェントの旋回速度に基づいたアニメーションクリップ間のブレンド

Agent Arcing Clip Layer DOPは、エージェントの旋回速度に基づいてアニメーションクリップをブレンドすることができます。 これによって、エージェントが素早く旋回する際により自然な動きになります:

元のアニメーション
旋回中に異なるアニメーションクリップを使用

旋回の動きをするアニメーションクリップは、ベースアニメーションと同期させることが重要になります。 Agent Arcing Clip Layer DOPは、異なるアニメーションクリップをブレンドするので、旋回の動きをするアニメーションクリップは、ベースアニメーションと同じ平面上にある必要があります。

アニメーションクリップを確認するには、Agent Clip SOPを使用します:

  1. Agent Clip SOPの Set Current Clip チェックボックスをオンにして、そのドロップダウンメニューから確認したいアニメーションクリップを選択します。 そのドロップダウンメニューにリストされるアニメーションクリップは、後ほど群衆シミュレーションネットワーク内のCrowd State DOPノードで参照されるアニメーションクリップの名前です。

  2. プレイバーをクリックして、クリップを再生します。 アニメーションが非常に速く再生される場合は、プレイバーの Real Time Toggleボタンをクリックしてみてください。

    ベースアニメーション
    旋回アニメーション

SOPネットワーク

SOPネットワーク内の群衆セットアップを以下に載せています。 馬エージェントが辿る経路もSOPネットワーク内で定義されています:

  1. 馬エージェントは、Agent Definition Cache SOPを使用して定義されています。

  2. Curve SOPを使用して、その馬エージェントが辿る経路を描画します。

  3. 4頭の馬エージェントを狭い領域から開始させたいので、Crowd Source SOPで:

    • Area Size パラメータを下げます。

    • Number of Agents マルチパラメータを4に設定します。

  4. DOPシミュレーションネットワークをセットアップします。

DOPシミュレーションネットワーク

以下のDOPシミュレーションネットワークでは、POP Steer Path DOPを使用して、エージェントが経路に沿うように誘導され、 Agent Arcing Clip Layer DOPによってベースアニメーションクリップがその経路の曲がり角に沿って旋回クリップとブレンドされます:

Note

Agent Arcing Clip Layer DOPは、群衆シミュレーションネットワーク内のCrowd State DOPの後に接続し、 POP Steer Path DOPと同様にステートビヘイビア系ノードの前後のいずれかに配置することができます。

  1. 親のSOPネットワーク内のCrowd Source SOPがcrowd_simulation DOPネットワークの1番目の入力に接続されているので、crowdobject DOPの Source パラメータを First Context Geometry に設定します。

  2. ベースアニメーションは、Crowd State DOPで定義されています。 Crowd State DOPの名前をベースアニメーションの名前に変更します。

  3. パーティクルではなくエージェントを扱っているので、POP Steer Path DOPの Output Attribute パラメータを Crowds steerforce に設定します。

  4. Parameters タブの SOP Path パラメータに、エージェントが辿るSOPネットワーク内のカーブのパス(例えば、../../guide_curve)を設定します。

  5. Agent Arcing Clip Layer DOPの Group パラメータをオンにして、旋回アニメーションを適用したいエージェントを指定します。

  6. 旋回アニメーションクリップを追加するには、 Clips マルチパラメータの横にあるをクリックします。

  7. ブレンドする別の旋回クリップを指定します:

    • Clip Name パラメータに、旋回アニメーションクリップの名前を設定します。

    • Turn Direction パラメータと Radius パラメータを設定します。 クリップの旋回半径を確認するには、そのクリップが適用されているエージェントをCrowd MotionPath SOPに接続して、 Clip Names パラメータにその確認したいクリップ名を設定します:

      Note

      旋回半径は完全に正確である必要はありません。 おおよその値で大丈夫です。

Note

経路に沿った旋回速度を滑らかにすることが重要です。 旋回速度は、アニメーションクリップのブレンドウェイトを駆動させるのに使用されるので、急速に変化する旋回速度は、クリップ間でアニメーションが飛び跳ねる現象が発生します。 旋回速度を滑らかにするには、Crowd Solver DOPConstrain Turn Acceleration チェックボックスをオンにして、必要に応じて Turn Stiffness を調整してください。 Max Turn Rate パラメータも調整してみてください。

群衆シミュレーション

はじめよう

  • 基本

    Houdiniにおける群衆シミュレーションの考え方の概要を説明します。

  • セットアップ

    群衆シミュレーションのセットアップと編集の方法

動くパーツ

  • エージェント

    群衆シミュレーションの要員である動くアクターであるエージェントについて説明します。

  • ステート

    エージェントのステート、各エージェントのアニメーションや仕草を制御する仮想的な雰囲気について。

  • トリガー

    エージェントのステートを変更する条件を指定する方法です。

  • キャッシュ

    群衆シミュレーションの効率的なキャッシュ化と読み込みのTips。

挙動

外観

  • 多様性

    エージェントに異なる外観と行動を作成することで、より現実的な群衆を作成する方法。

  • 布の取り付け

    Vellum Clothをエージェントシェイプジオメトリの一部として追加/拘束すれば、エージェントの動きに基づいて布をシミュレーションすることができます。

地形

  • 足の着地

    エージェントのアニメーションを地形に適応させて滑りを回避するためのセットアップ方法。

  • 地形

    エージェントが歩く地形ジオメトリを指定する方法です。

  • 障害物

    エージェントが回避する障害物を設定する方法です。

SOP群衆

群衆プロシージャル