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

SOPモーションパス

SOPモーションパスを使用して少数のエージェントの挙動を変更する方法。

On this page

群衆DOPワークフローはシミュレーションベースの手法を採用しています。 エージェントは常に特定のステート(状態)にあり、それがエージェントの動きや再生されるアニメーションクリップを定義します。 特定のステートになると、エージェントは例えばゴールに向かって歩いたり、ぶらついたり、他のエージェントを避けたりします。 エージェントに作用したり、その動きを誘導するフォースは、トリガーで常に評価され、エージェントの周囲で起こっていることを特定し、ある時点でエージェントを別のステートに遷移させます。 この手法は、いくつかの簡単なルールをセットアップして群衆全体の全般的な挙動を制御できるため、大規模な群衆には強力です。 しかし、DOPシミュレーションワークフローの課題は、少数のエージェントを正確に制御することです。 例えば、1つのエージェントのパスを更新したい場合、他のエージェントに影響を与えずにそのエージェントの挙動を更新するように、群衆セットアップの変更方法を考える必要があります。 群衆シミュレーションのエージェントはすべて相互に反応するので、このDOPシミュレーションワークフローだと困難です。

SOPモーションパスを使用することで、群衆全体を再シミュレーションすることなく、少数のエージェントのモーションパスまたはアニメーションを簡単に変更することができます。 SOPモーションパスツールにはシミュレーションは含まれません。 タイムステップを1つも進めずに、フォースとトリガーを評価して、エージェントを別のステートに切り替えるかどうかを決定します。 エージェントのモーションパスが、時間の経過と共に変化するエージェントの全体的な位置を描画し、パス上で操作を実行してエージェントがどこに移動するかを決定します。

SOPモーションパスツールを使用すれば、ユーザは別の方法で群衆ショットをセットアップすることができます。 SOPモーションパスツールとDOPシミュレーションワークフローをうまく組み合わせることで、目的の群衆の挙動を実現することができます。

エージェントの群衆のSOPモーションパス

セットアップ

SOP群衆モーションパスツールセットはCrowd MotionPath SOPから始めます。 これはエージェントの群衆からモーションパスを生成します。 Crowd MotionPath Evaluate SOPは、そのCrowd MotionPath SOPと併用するノードです。 Crowd MotionPath Evaluate SOPは、特定のフレームでパスに沿ってエージェントの位置を決定し、エージェントでアニメーションを再生します。

Crowd MotionPath SOPとCrowd MotionPath Evaluate SOP間では、以下の操作が行なわれます:

群衆モーションパスを生成する

SOP群衆モーションパスツールの入力は、エージェントの群衆です。

Note

SOPモーションパスとDOPシミュレーションのどちらの入力群衆の作成にも、同じセットアップを使用することができます。

以下は、エージェントの群衆を作成する基本セットアップの一例です。これらのノードを群衆で使用する方法の詳細は、セットアップを参照してください:

SOPモーションパスツールを使用するための基本セットアップ

Crowd MotionPath SOPによって生成されたモーションパスは、特定のフレーム範囲内の時間軸における各ポイントでのエージェント位置を示したカーブによって表現されます。 エージェントの正面には、時間範囲全体のパスが配置されます。 デフォルトでは、エージェントのパスは、エージェントに割り当てられているアニメーションクリップから生成されます。 モーションデータはアニメーションクリップから取得され、順再生を繰り返すことで、時間軸における各ポイントでのエージェントの位置を生成します。 Crowd MotionPathツールは、MotionClipツールと同様に、スケルトンのポーズが時間軸で配置されます。

Crowd MotionPath Evaluate SOPによって再生されるアニメーション

エージェントパスの生成に使用されるアニメーションクリップ(s)を変更するには:

  1. Crowd MotionPath SOPの Clip Assignment セクションにある Clip Names パラメータにクリップの名前を設定します。 アニメーションクリップのライブラリがある場合、異なるクリップをいくつか指定することで、エージェントが再生するクリップがランダムに選択されるようにすることができます。 各 Clip Names パラメータには、複数のクリップを指定することができます。

    Note

    Clip Names ドロップダウンメニューからクリップを選択すると、そのクリップ名が Clip Names 内の既存のエントリに追加されます。

  2. クリップのグループに Weight 値を設定します。 ウェイトが高いほど、エージェントがそれらのクリップを再生する確率が上がります。

  3. Clip Groups の横にあるをクリックして、様々なウェイトのクリップを追加します。

To...Do this

エージェントパスの生成に使用されるフレーム範囲を変更する

Crowd MotionPath SOPStart/End/Inc 値を変更します。

アニメーションクリップの速度を変更する

Crowd MotionPath SOPの Clip Speed を調整します。

エージェント別にクリップ速度を変化させるには、 Clip Speed の横にあるドロップダウンメニューから Set Varying を選択して、 VarianceVariance Seed の値を調整します。

エージェントパスに沿って時間軸の各ポイントにエージェント位置を表示する

ビューポートの右側にあるツールバーの Display pointsを有効にします。

群衆シミュレーションからエージェントパスを構築する

アニメーションクリップのモーションに基づいてエージェントパスを構築するのではなく、群衆シミュレーションからパスを生成することもできます。

以下の例では、群衆シミュレーションDOPネットワークによって、エージェントがぶらついたり互いに避けたりします。DOPシミュレーションからパスを生成するには:

  1. DOPネットワークの出力をCrowd MotionPath SOPの入力に接続します。

    エージェントパスを生成するためのDOPシミュレーションネットワーク
  2. Crowd MotionPath SOPの Source ModeSimulation に設定します。

    群衆シミュレーションを使用してエージェントパスを生成する

このサンプルでは、シミュレーションした群衆からモーションパスを生成する方法を説明しています。

エージェント間の親子関係

エージェント間の親子関係は、Agent Relationship SOPを使用して設定することができます。 親エージェントのモーションパスが編集されると、子エージェントのモーションパスは、その子エージェントがその親エージェントに取り付けられた状態を維持するように変形されます。

親エージェントと子エージェントの両方のモーションパスを生成するには、Agent Relationship SOPをCrowd MotionPath SOPに接続します。 以下の例では、騎手エージェント(子)を馬エージェント(親)に取り付けています:

Agent Relationship SOPのパラメータとアトリビュートに関する情報とそのSOPビューアステートを使用して子エージェントのトランスフォームを調整する方法は、エージェントの親子関係を参照してください。

親エージェントと子エージェントのアニメーションクリップを設定するには:

  1. Crowd MotionPath SOPの Number of Assignments の横にあるをクリックして、各親子のアニメーションクリップパラメータセットを追加します。

  2. 各パラメータセットの Group パラメータに親エージェントまたは子エージェントのグループ(例えば、@agentname=horse)を設定します。

    Tip

    agentnameアトリビュートは、上流ノード(Agent Definition Cache SOPAgent from Rig SOPなど)で作成されます。 各エージェントのagentnameアトリビュートを確認するには:

    1. Agent Relationship SOPを選択します。

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

    3. そのGeometry Spreadsheetペインの上部にあるツールバーの Pointsをクリックします。

  3. Clip Names パラメータに、エージェントに使用したいアニメーションクリップを設定します。エージェントのアニメーションクリップを指定する方法の情報は、群衆モーションパスの生成を参照してください。

デフォルトでは、子エージェントのモーションパスは非表示になっています(Crowd MotionPath SOPの Hide Child Agent Paths が有効になっています):

Note

親と子のモーションパスのポイント数は同じ(タイムサンプリングが同じ)でなければなりません。 同じCrowd MotionPath SOPを使用して親と子のモーションパスを生成した場合( Start/End/Inc が同じ、つまり、同じフレーム範囲で、同じサブフレーム数)、デフォルトでこの条件が満たされます。

To...Do this

子エージェントのモーションパスを表示する

Crowd MotionPath SOPの Hide Child Agent Paths を無効にします。

親エージェントから子エージェントを外す

以下の例では、親エージェントから子エージェントを外してから、Crowd MotionPath Follow SOPを使用して親のモーションパスを修正すると、子が親に追従しなくなる様子を示しています:

  1. 群衆モーションパスツールセットのSOPの2番目の出力(Agent出力)をAttribute Wrangle SOPに接続します:

  2. そのAttribute Wrangle SOPの VEXpression フィールドに、もはや親子関係を解消したい子エージェントのagentrel_parentidアトリビュートを-1に設定するVEXコードを記述します。例:

    if (@ptnum == 37)
    {
        i@agentrel_parentid = -1;
    }
    

    モーションパスに対して実行するどの下流のノードも、その子を元の親に再び取り付けようとしなくなります。

  3. Curve SOPで、元のパスが追従するカーブを描画します。

  4. Crowd MotionPath Follow SOPの Group に、親エージェントを設定します(ドロップダウンメニューからも選択することができます)。 この例では、 Group@agentname=horseを設定しました。

子エージェントのどれかが親エージェントに追従しなくなりました:

エージェントに対して後処理を実行した後に、子エージェントを再び親エージェントに取り付ける

エージェントに対して後処理を実行した後に、Agent Relationship SOPを使用して、子エージェントを再び親エージェントに取り付けることができます。 例えば、Crowd MotionPath Evaluate SOPを使用してモーションパスを評価した後に、親エージェントに対して地形適応を実行したい場合があります。 地形適応の後に再び子エージェントを取り付けるには:

  1. Agent Terrain Adaptation SOPを2つ目のAgent Relationship SOPに接続します:

  2. そのAgent Terrain Adaptation SOPの Group@agentname=horseを設定します。これによって、その親エージェントが地形に適応します。

  3. 2つ目のAgent Relationship SOPの Transform Child Agents を有効にして、騎手エージェントを馬エージェントに再び取り付けます。

    地形に適応された親エージェント(左); 親に再び取り付けられた子エージェント(右)

    また、再び取り付けたい特定の子エージェントを選択することができます:

    • Group パラメータの横にあるをクリックします。

    • ビューポート内で、再び取り付けたい子エージェントを選択します。

    • ビューポート上でEnterを押します。

    すると、 Group パラメータに、その選択した子エージェントが入力されます。

エージェントパスを操作する

以下のノードは、エージェントが時間に追従するパスを変化させます:

Crowd MotionPath Follow

ビューポートに描画されたカーブ(s)に追従するように元のエージェントパスを変形させます。

Crowd MotionPath Edit

エージェントが移動する位置を正確に決定できるようにパスを直接操作することができます。 Crowd MotionPath Followよりも細かなレベルの制御が可能です。

Crowd MotionPath Avoid

エージェント間の衝突の検出と回避を実行します。

エージェントパスが追従するガイドカーブ

エージェントが追従するガイドカーブを素早く描画できるため、エージェントを道に沿って進ませたい場合などに便利です。 Crowd MotionPath Follow SOPは、描画されたカーブに追従するように元のエージェントパスを変形させます。 パスに沿ってポイントの位置と方向を変更しますが、アニメーションクリップは変更しません。

Crowd MotionPath Follow SOPを、Crowd MotionPath SOPとCrowd MotionPath Evaluate SOPの間に接続します:

Curve SOPを使用して、ビューポート内にカーブ(または複数のカーブ)を描画します。デフォルトでは、エージェントパスは一番近くにあるカーブに追従します:

  1. カーブを描画した時にエージェントパスがどのように変形されるのか確認できるように、Crowd MotionPath Follow SOPのディスプレイフラグをオンにします。

  2. Curve SOPを選択して、ビューポートの左側にあるツールバーのをクリックして、ビューアステートに入ります。

  3. カーブ(s)を描画します。

    Tip

    Construction Planeを表示して、カーブがコンストラクション平面に自動的にスナップするようにします。 右側のビューポートツールバーでDisplay Construction Planeをクリックします。

  4. Crowd MotionPath Evaluate SOPを選択してその評価結果を表示します。

  5. プレイバーをクリックして、更新されたパスに沿って移動するエージェントのアニメーションを再生します。

    ビューポートで描画されたカーブに追従するエージェント

このサンプルでは、ガイドカーブに追従するようにモーションパスを変形させる方法や、エージェントが閉じたループを辿るようにさせたり、アトリビュートを使用して各エージェントが辿るカーブを制御するといった高度なオプションを説明しています。

MotionPathFollowCurve

To...Do this

Curve SOPを使用して描画したカーブをすべて削除する

Curve SOPで、 Reset Operations をクリックします。

エージェントパスを直接操作する

Crowd MotionPath Edit SOPを使用すると、パスを直接操作して、エージェントが移動する位置を正確に決定することができます。 このノードでは、Crowd MotionPath Follow SOPよりも細かなレベルでパスの操作を制御できます。

  1. Crowd MotionPath Edit SOPを、Crowd MotionPath SOPとCrowd MotionPath Evaluate SOPの間に接続します。

  2. Crowd MotionPath Edit SOPを選択して表示します。

  3. ビューポートで、カーブに沿ってポイントをドラッグし、パスを変形させます。これらのポイントは ピン と呼ばれます。

    Note

    If there is a parent-child relationship between agents, only the points on the parent path can be selected

    Tip

    Construction Planeをオンにして、平坦な地形でポイントをドラッグすると、ポイントがコンストラクション平面に沿ってドラッグされるようにします。

    エージェントパスを直接編集する

いくつかのメモ:

  • モーションパス上にピン留めされた各ポイントにはウェイトがあり、それが、パスがピンから受ける影響の強度を決定します。各ピンのウェイトは、HUDスライダPin Weight パラメータを使用して変更することができます。

  • 変形されたカーブがピン留めポイントを通過しない時、点線が表示され、そのピンとカーブ上の元のポイントの関係を示します。

  • デフォルトでは、モーションパスが変更されても、カーブの長さは通常維持されます。

このサンプルでは、Crowd MotionPath Edit SOPを使用して、特定のエージェントのパスをインタラクティブに調整する方法を説明しています。

To...Do this

複数のピンをドラッグする

  1. 複数のピンをボックス選択または⇧ Shift選択します。

  2. ドラッグします。

選択したピンを削除する

Deleteを押します。

選択したピンのウェイトを変更する

を使用するか、HUDスライダの Pin Weight パラメータを変更します。

新しいピンのデフォルトのウェイトを設定する

Default Pin Weight パラメータを設定します。

モーションパスの開始ポイントのウェイトを変更する

Start Point Weight パラメータを設定します。

選択したパス上のすべての編集を削除する

Uを押して、選択したピンを含むすべてのパス上の編集を削除します。

すべての編集を削除する

パラメータエディタで Reset All Changes をクリックします。

衝突の検出と回避

Crowd MotionPath Avoid SOPは、エージェント間の衝突の検出と回避を実行します。

  1. Crowd MotionPath Avoid SOPを、Crowd MotionPath SOPとCrowd MotionPath Evaluate SOPの間に接続します。

  2. Crowd MotionPath Avoid SOPを選択して表示します。

    デフォルトで、 Visualize Collisions はオンになっており、モーションパスの衝突が含まれる部分をハイライト表示します。球形状のガイドジオメトリは、衝突検出に使用されるエージェントのサイズを示します:

    衝突の視覚化
  3. Steering タブのパラメータと Iterations の数を調整し、衝突の解決を試みます。 Iterations は、衝突を解決するためにカーブ上に作成される回避パスの数です。 Steering のパラメータで制限をあまりに厳しくした場合、後のイテレーションにあまり効果が見られなくなる場合があります。

Note

エージェントがどこに移動するかをより細かく制御したい場合は、Crowd MotionPath Follow SOPまたはCrowd MotionPath Edit SOPを使用してください。

To...Do this

起こり得る衝突を表示する

Visualize Collisions をオンにします。モーションパスの衝突が含まれる部分がハイライト表示されます。

Avoidance がオフの場合でも、 Visualize Collisions は衝突が発生する場所を特定するのに便利です。

特定のパスで衝突回避を実行する

  1. Group パラメータの横にあるをクリックします。

  2. ビューポートで、他のエージェントや障害物を回避するように変形されるパスを選択します。

  3. Enterをクリックします。

Group で指定したエージェントは、 Group でリストされていないエージェントと衝突する可能性があります。

エージェントが、どのくらい前から起こり得る衝突を回避し始めるのか特定する

Max Collision Time を調整します。

Max Collision Time の値が高いほど、エージェントは早く起こり得る衝突の回避を試み始めます。

エージェントの衝突検出のサイズを変更する

Particle Scale Multiplier を調整して、すべてのエージェントの衝突サイズを変更します。

各エージェントは、例えばAttribute Adjust Float SOPを使用して、上流で設定されたpscalemultiplierアトリビュートを継承することもできます。 pscalemultiplierアトリビュートは、 Particle Scale Multiplier によってスケールされます。

衝突回避を適用するフレーム範囲を設定する

Start Frame および End Frame をオンにして指定します。

パスの開始時に初期の回転角度を設定する

Max Initial Rotation をオンにして設定します。

これは、モーションパスの開始時にエージェントが非常に接近していて、エージェント同士を遠ざけたい時に便利です。 Max Initial Rotation を使用すると、開始時だけ即座にエージェントが反対方向を向くように設定することができます。 これにより、時間範囲全体のTurn Rateに影響する Max Turn Rate を調整する必要がなくなります。

パスの元の終了位置を維持する

Goal Position Weight を上げます。

近接エージェントを回避する

  1. Neighbors をオンにします。

  2. Neighbor Distance を上げ、エージェントの回避をより早く開始します。

障害物を回避する

  1. 障害物のジオメトリをCrowd MotionPath Avoid SOPの3番目の入力に接続します。

  2. Obstacles をオンにします。

  3. Obstacle Distance を上げ、障害物の回避をより早く開始します。

  4. Collision Padding を上げ、エージェントが障害物に近づかないようにします。

  5. Horizontal FOV を調整し、エージェントが障害物を見ることができるビュー角度に変更します。障害物との衝突パス上にあるエージェントのみに対して障害物回避を実行するには、 Horizontal FOV を下げます。

障害物回避なし
障害物回避がオン

このサンプルでは、Crowd MotionPath Avoid SOPを使用して障害物を回避する方法を説明しています。

他のグループとの衝突を無視する特定のエージェントグループを指定する

このサンプルでは、Crowd MotionPath Avoid SOPを使用して、近接エージェント間に回避を適用する方法を説明しています。 collisionignoreおよびcollisiongroup文字列アトリビュートを使用して、異なるエージェントグループ間により複雑な回避ルールと衝突フィルタを構築します。

エージェントのcollisionignore文字列パターンが、近接エージェントが属するcollisiongroupと一致する場合、エージェントはその近接エージェントとの衝突を無視します(近接エージェントの回避を試みません)。

エージェントのcollisionignoreパターン = *の場合、エージェントは衝突の回避を試みません。この場合、Crowd MotionPath Avoid SOPは何の作用も持ちません。

エージェントのcollisionignore文字列が空の場合、エージェントは衝突を無視しません(すべてに対して衝突します)。

エージェントが追従するパスを設定する

Crowd MotionPath Avoid SOPを使用すると、エージェントがパスに追従するようにできます。 そのCrowd MotionPath Avoid SOPに障害物としてラインジオメトリを入力することで、 そのラインジオメトリは、エージェントが回避を試みるチューブ形状として扱われます。

衝突するポイントを含むジオメトリ上のポイントグループを出力する

Collision Point Group をオンにし、ポイントグループの名前を指定します。

アニメーションクリップ間のトランジション(遷移)

以下のノードは、アニメーションクリップ間のトランジション(遷移)を制御します:

Crowd MotionPath Transition

異なるアニメーションクリップに切り替えます。

Crowd MotionPath Trigger

別のアニメーションクリップへのトランジションをトリガーする条件を設定します。

Crowd MotionPath Layer

エージェントのベースアニメーション上に様々なアニメーションクリップをレイヤ化します。 レイヤ化されたクリップは、スケルトンの特定のパーツに適用することができます。

Crowd MotionPath Arcing Layer

エージェントの旋回速度に基づいて、アニメーションクリップをブレンドします。

クリップの遷移ポイントを手動で選択する

Crowd MotionPath Transition SOPを使用して、新しいアニメーションクリップに遷移させます。

  1. Crowd MotionPath Transition SOPを、Crowd MotionPath SOPとCrowd MotionPath Evaluate SOPの間に接続します。

  2. Crowd MotionPath Transition SOPで、 Clip Name を新しいアニメーションクリップに設定します。

    デフォルトで、Crowd MotionPath Transitionはフレーム範囲の開始フレームでエージェントのアニメーションクリップを切り替えます。

    フレーム範囲の開始フレームで新しいアニメーションクリップに遷移

パス上の後のポイントで新しいアニメーションクリップに遷移させるには:

  1. Crowd MotionPath Transition SOPで、 Trigger Group の横にあるをクリックします。

  2. ビューポートで、トランジションを開始するパス上のポイントを選択します。⇧ Shiftを押したまま、様々なパスでポイントを選択します。単一のパスに沿って複数のポイントを選択した場合、パス上の最初に選択したポイントでトランジションが発生します。

  3. Enterをクリックします。 Trigger Group パラメータは選択したポイントに設定されます。

    手動で選択したポイントで新しいアニメーションクリップに遷移

このサンプルでは、Crowd MotionPath Transition SOPを使用してアニメーションクリップ間をブレンドする方法や、Clip Transition Graphで定義された中間遷移クリップを使用する方法を説明しています。

To...Do this

複数のトリガーに基づいて新しいアニメーションクリップに切り替える

Combine Triggers セクションで、ブール論理を使用して様々な組み合わせのトリガーを指定します。

少し時間をずらして、エージェントを新しいアニメーションクリップに遷移させる

  1. Random Delay をオンにします。

  2. Random Delay セクションで、 Max Random Delay および Random Seed パラメータを調整します。

異なるアニメーションクリップに遷移させる

アニメーションクリップのライブラリがある場合、異なるクリップをいくつか指定することで、トランジション(遷移)先の次のクリップとしてランダムに選択できます。

  1. Randomize Clips をオンにします。

  2. トランジション(遷移)先の Clip Names を設定します。それぞれの Clip Names パラメータで、複数のクリップを指定することができます。

  3. クリップのグループに Weight 値を設定します。ウェイト値を上げるほど、これらのクリップが次のクリップとして選択される可能性が高くなります。

  4. Clip Groups の横にあるをクリックして、様々なウェイトのクリップを追加します。

トランジションのシーケンスを使用して新しいクリップに遷移させる

Clip Transition Graphを使用すると、クリップトランジションをより細かく制御することができます。Clip Transition Graphは、ペアのクリップの間でトランジション領域を自動的に見つけ、現在のクリップが新しいクリップにうまくブレンドするポイントを決定します。また、現在のクリップから新しいクリップへの、トランジションのシーケンスを指定することもできます。

  1. Agent Clip Transition Graph SOPエージェントの定義に追加します(Agent SOPの後、Crowd Source SOPの前の任意の場所に配置します)。

  2. エージェントが受け取ることのできる様々なトランジションを指定します。Agent Clip Transition Graph SOPで、 Filters の横にあるをクリックしてクリップトランジションを追加します。

    例えば、以下のクリップトランジションを指定することができます:

    • Clip A : idleClip B : walk

    • Clip A : walkClip B : run

    • Clip A : runClip B : run_turn_left

    • Clip A : runClip B : run_turn_right

  3. トリガー条件とトランジション(遷移)先のクリップを設定します。オプションで、ランダムなクリップのコレクションをトランジション(遷移)先に指定することもできます(“異なるアニメーションクリップに遷移させる”How-toを参照してください)。

  4. Crowd MotionPath Transition SOPで、 Use Clip Transition Graph をオンにします。

例として上記のクリップトランジションを使用して、以下を指定する場合:

  • 初期クリップとしてidleおよびwalk(Crowd MotionPath SOPで)

  • トランジション(遷移)先のクリップとしてrun_turn_leftおよびrun_turn_right(Crowd MotionPath Transition SOPで)

その後、初期idleクリップを再生するエージェントは、Clip Transition Graphで以下のトランジションに追従し、run_turn_leftなどに遷移します:

  • idlewalk

  • walkrun

  • runrun_turn_left

初期walkクリップを再生するエージェントは、Clip Transition Graphで適切なトランジションにも追従し、run_turn_rightなどに遷移します:

  • walkrun

  • runrun_turn_right

Note

Crowd Source SOPまたはCrowd MotionPath SOPのいずれかでクリップを初期化することができます。 クリップを割り当てるのが、群衆のレイアウトを取り込む時か、またはエージェントパスを生成する直前かは、ワークフローの設定によります。

Crowd MotionPath SOPでのクリップの割り当ての方がやや柔軟性が高く、 Group パラメータを使用して、エージェントの様々なグループに対してクリップの割り当てをセットアップしたり、特定のエージェントのクリップを上書きすることができます。

トリガー条件に基づいて新しいアニメーションに遷移させる

Crowd MotionPath Trigger SOPおよびCrowd MotionPath Transition SOPは連携して、特定の条件が満たされた時にエージェントのアニメーションクリップを切り替えます。

Crowd MotionPath Triggerは、別のアニメーションクリップへのトランジションをトリガーする条件を設定し、Crowd MotionPath Transitionは、トリガー条件が満たされた時にエージェントのアニメーションクリップを切り替えます。

  1. Crowd MotionPath Trigger SOPとCrowd MotionPath Transition SOPを、Crowd MotionPath SOPとCrowd MotionPath Evaluate SOPの間に接続します:

  2. Crowd MotionPath Trigger SOPで、 Trigger Name がデフォルトで$OSに設定されています。これは、トリガー名をそのCrowd MotionPath Trigger SOPの名前に設定します。 Trigger Name は、トリガーを参照するCrowd MotionPath Transition SOPなどの後続ノードで使用されるため、もっと分かりやすい名前に変更しても構いません。

  3. Crowd MotionPath Trigger SOPで、 Type パラメータのトリガータイプを設定します。特定のフレームでアニメーションクリップを切り替えるには:

    • TypeTime に設定します。

    • Frame を、異なるアニメーションクリップに遷移させるフレームに設定します。

    以下の例では、Crowd MotionPath Trigger SOPが選択および表示されています。トリガー条件を満たすパス上のポイントがハイライト表示されています。

    トリガー条件を満たすパス上のポイント(ハイライト表示)
  4. Crowd MotionPath Transition SOPで:

    • Trigger Group を(上流のrowd MotionPath Trigger SOPの Trigger Name パラメータで定義されている)トリガーの名前に設定します。

    • Clip Name を新しいアニメーションクリップに設定します。

    以下の例では、Crowd MotionPath Transition SOPが選択および表示されています。トリガー条件を満たすパス上のポイントが、新しいアニメーションクリップに遷移されます:

    新しいアニメーションクリップへのトランジション(遷移)

Note

Crowd MotionPath TriggerノードおよびCrowd MotionPath Transitionノードは、群衆シミュレーションネットワークにおいてCrowd Trigger DOPおよびCrowd Transition DOPに相当するSOPレベルのノードです。

このサンプルでは、Crowd MotionPath Trigger SOPおよびCrowd MotionPath Transition SOPを使用して、アニメーションクリップ間をブレンドする方法を説明しています。

To...Do this

エージェントが領域またはジオメトリ内部にある場合、新しいアニメーションクリップに切り替える

  1. Crowd MotionPath Trigger SOPで、 TypeBounding Region に設定します。

  2. ビューポートで、ハンドルを使用してボックスのサイズを変更します。

  3. Comparison を設定し、ボックスの内部または外部のポイント、ボックスに入るポイント、ボックスから出ていくポイントのいずれが新しいアニメーションクリップへのトランジションをトリガーするかを指定します。

  4. Crowd MotionPath Trigger SOPを選択および表示して、トリガー条件を満たすポイント(ハイライト表示)を確認します:

    境界領域内でトランジションをトリガーする
  5. Crowd MotionPath Transition SOPを選択および表示して、更新したエージェントパスを確認します:

    境界領域トリガーを使用して更新したパス

IncomingComparison メソッドは、トランジションがトリガーされる各パス上の1つのポイントをハイライト表示します:

ボックスに入るポイント(ハイライト表示)でトランジションがトリガーされる

トランジションをトリガーする境界領域として、他のジオメトリを使用することもできます。以下の例では、Rubber Toyテストジオメトリを境界領域として使用しています:

  1. Rubber ToyテストジオメトリをCrowd MotionPath Trigger SOP(3番目の入力)に接続します。

  2. TypeBounding Region に設定します。

  3. Bounding TypeBounding Object に設定します。

  4. ComparisonInside に設定します。

新しいアニメーションクリップへのトランジションは、エージェントがRubber Toyジオメトリ内部にある時にトリガーされます(以下では、Rubber Toyジオメトリがテンプレートになっています):

ジオメトリ内部でトランジションをトリガーする

利用可能なプリビルドのトリガーについては、Crowd MotionPath Triggerノードのドキュメントを参照してください。

このサンプルでは、エージェントにクリップをレイヤ化する方法と、エージェントが境界オブジェクト内に入った時にアクティブにする方法を説明しています。

MotionPathLayerClip

親のアニメーションが変わった時に子エージェントのアニメーションを切り替える

エージェントが他のエージェントに取り付けされている場合、Crowd MotionPath Trigger SOPの Match Parent Agent’s Trigger を有効にすることで、親のアニメーションが変わった時に子エージェントのアニメーションを切り替えることができます。

レイヤアニメーション

Crowd MotionPath Layer SOPを使用すると、手を振る、頭の向きを変えるなどのモーションを簡単にエージェントに追加することができます。 様々なモーションを望ましい組み合わせで実行する、完全に新しいアニメーションクリップは必要ありません。 Crowd MotionPath LayerはCrowd MotionPath Transitionと似ていますが、完全に新しいアニメーションクリップに切り替えるのではなく、エージェントのベースアニメーションの上に異なるクリップをレイヤ化します。レイヤ化したクリップも、スケルトンの特定のパーツに適用することができます。

Crowd MotionPath Trigger SOPとCrowd MotionPath Layer SOPを、Crowd MotionPath SOPとCrowd MotionPath Evaluate SOPの間に接続します:

  1. Agent Transform Group SOPは、レイヤ化したクリップを適用するスケルトンのパーツを指定するのに使用される、ジョイントの名前付きグループを作成します。 詳細は、レイヤアニメーションクリップを参照してください。そのAgent Transform Group SOPの Nameupper_bodyに設定します。

  2. そのCrowd MotionPath Trigger SOPの Trigger Name パラメータにトリガーの名前を指定します。この例では、 Trigger Nametrigger_zombieに設定しました。

  3. Crowd MotionPath Layer SOPを使用してレイヤをセットアップします:

    • Trigger Name には、レイヤクリップの再生を開始するトリガー(この例では、trigger_zombie)を設定します。

    • Transform Group には、レイヤクリップを再生するジョイントグループ(この例では、upper_body)を設定します。

    • Clip Name には、そのレイヤクリップを設定します。

以下の例では、エージェントの上半身はパス上の特定の位置でゾンビのレイヤクリップの再生を開始し、下半身は元のwalkingクリップの再生を続けています:

エージェントの上半身のレイヤアニメーション

このサンプルでは、Crowd MotionPath Layer SOPを使用してエージェントの上半身にクリップをレイヤ化する方法を説明しています。このクリップは、エージェントが境界オブジェクト内に入った時にアクティブになります。

MotionPathLayerClip

To...Do this

複数のトリガーに基づいて新しいアニメーションクリップに切り替える

Combine Triggers セクションで、ブール論理を使用して様々な組み合わせのトリガーを指定します。

異なるアニメーションクリップに遷移させる

アニメーションクリップのライブラリがある場合、異なるクリップをいくつか指定することで、トランジション(遷移)先の次のクリップとしてランダムに選択できます。

  1. Randomize Clips をオンにします。

  2. トランジション(遷移)先の Clip Names を設定します。それぞれの Clip Names パラメータで、複数のクリップを指定することができます。

  3. クリップのグループに Weight 値を設定します。ウェイト値を上げるほど、これらのクリップが次のクリップとして選択される可能性が高くなります。

  4. Clip Groups の横にあるをクリックして、様々なウェイトのクリップを追加します。

元のクリップがレイヤ化されたクリップにブレンドする早さを変更する

Blend In FramesBlend Out Frames を調整します。

レイヤ化されたモーションクリップと元のアニメーションを部分的にブレンドする

Blend Ratio を調整します。 Blend Ratio1の場合、元のアニメーションクリップの上にレイヤ化されたアニメーションクリップがフルに使用されます。

レイヤ化されたクリップを数秒だけ再生するように設定する

Number of Loops をオンにして、その値を調整します。 Number of Loops1に設定すると、レイヤ化されたクリップが1回再生され、その後元のアニメーションクリップに戻ります。

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

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

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

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

以下の例では、Crowd MotionPath Follow SOPを使用してモーションパスを変形させています。 次に、Crowd MotionPath Arcing Layer SOPを使用して、モーションパスの曲がり角に沿って馬エージェントのアニメーションクリップをブレンドさせています:

エージェント定義には、以下のアニメーションクリップが入っています(エージェントのアニメーションクリップを確認する方法は、レイヤアニメーションを参照してください):

ベースアニメーション
旋回アニメーション
  1. Crowd MotionPath Arcing Layer SOPを、Crowd MotionPath SOPCrowd MotionPath Evaluate SOPの間に接続します。

    Crowd MotionPath SOPは、モーションパスにrest_transformアトリビュートを追加することで、そのモーションパスの“静止ポーズ”を保存します。 (例えば、Crowd MotionPath Follow SOPを使用して)そのモーションパスを編集した後、Crowd MotionPath Arcing layer SOPは、その更新されたモーションパスと元のモーションパスを比較して、 その差分を使用して、エージェントの旋回速度を計算します。 モーションパスに沿った旋回速度を滑らかにすることが重要です。 旋回速度は、アニメーションクリップのブレンドウェイトを駆動させるのに使用されるので、急速に変化する旋回速度は、クリップ間でアニメーションが飛び跳ねる現象が発生します。

  2. Crowd MotionPath Arcing Layer SOPの Group に、旋回アニメーションを適用したいエージェントを設定します。

  3. Base Clip Name にベースアニメーションクリップを設定します。 ベースアニメーションクリップとそれに関連する旋回アニメーションクリップを複数追加するには、 Clip Sets の横にある をクリックします。

  4. ブレンドする別の旋回アニメーションクリップを指定します:

    • Arcing Clips の横にあるをクリックして、別のクリップを追加します。

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

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

      Note

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

  5. エージェントがモーションパスに沿ってどれだけ急に旋回しているのか可視化するために、 Turn Rate Attribute を有効にして、そのパラメータの右側にあるをクリックします。 旋回速度(色)がモーションパスに沿って滑らかに変化すれば、クリップのブレンドも滑らかに変化します。

    エージェントの旋回速度を可視化

    Tip

    アニメーションが異なるクリップ間で飛び跳ねる場合、クリップ間のブレンドウェイトが飛び跳ねているのが原因です。 Crowd MotionPath Arcing Layer SOPの Strength パラメータの値を上げてモーションパスの旋回速度を滑らかにすることで、クリップ間のブレンドが滑らかになるようにしてください。

To...Do this

エージェントの旋回速度を可視化する

Crowd MotionPath Arcing Layer SOPの Turn Rate Attribute パラメータの横にあるをクリックします。

後処理

SOPモーションパスツールを使用した後に、Agent Terrain Adaptation SOPAgent Look At SOPAgent Edit SOPなどのSOPを使用して、エージェントのポーズをさらに細かく制御することができます。 これらのSOPは、Crowd MotionPath Evaluate SOPの後に配置してください。

騎手(子)と馬(親)のような親子関係にあるエージェントがあって、例えば、Agent Terrain Adaptation SOPを後処理工程として使用して、馬のトランスフォームを修正した場合、 Agent Relationship SOPを使用することで、その後処理工程の後に騎手を馬に取り付けし直すことができます。 この例に関しては、親子関係を参照してください。

その他の操作

Crowd MotionPath Retime

アニメーションのモーションを高速化、低速化、クロップ、シフトします。

群衆シミュレーション

はじめよう

  • 基本

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

  • セットアップ

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

動くパーツ

  • エージェント

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

  • ステート

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

  • トリガー

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

  • キャッシュ

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

挙動

外観

  • 多様性

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

  • 布の取り付け

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

地形

  • 足の着地

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

  • 地形

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

  • 障害物

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

SOP群衆

群衆プロシージャル