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

群衆シミュレーションのセットアップ

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

On this page

概要

群衆シミュレーションは、セットアップにいくつか異なるノードネットワークを必要とします。 それらのノードネットワークのほとんどが、シェルフツールによってセットアップすることができます。

  • エージェントプリミティブを定義したジオメトリネットワーク。

  • 群衆シミュレーションを走らせるためのシミュレーションネットワーク。

クィックスタート

Simulateシェルフツールを使用することで、シーン内に“デモ”の群衆シミュレーションを簡単に取り込むことができます。 これは、群衆シミュレーションに必要な色々なネットワークがどのようなものなのかを知るのに役立ちます。

  1. Crowds シェルフタブの Simulateツールを⌃ Ctrl + クリックします。このツールは、Houdiniに組み込まれているmocapbiped1キャラクタを使って、自動的にエージェントとCrowd Sourceネットワークを構築します。

  2. エージェントを歩かせる地形ジオメトリがあれば、それを選択して、 Crowds シェルフタブの Terrainをクリックします。

エージェントの定義

群衆では、キャラクタがデジタルアセットとしてカプセル化またはFBXファイルになっていることを前提にしています。

To...Do this

シェルフツールを使って、キャラクタからエージェントを作成する

  1. オブジェクトレベルで、エージェントに変換したいキャラクタアセットを選択します。

  2. Crowds シェルフタブの Agentツールをクリックします。

    新しいエージェントに関する情報を設定するためのダイアログボックスが表示されます:

    • キャラクタリグアセットまたはFBXファイル、USDファイル、LOPノードのどちらからキャラクタを読み込むのかを選択します。

    • キャラクタアセットノードのパス(またはFBX/USDファイルのファイルパス)を指定します。

    • Agent Name を設定します。

    • キャラクタアニメーションの Clip Name を設定します。静止ポーズを取り込んだ場合には、restといったクリップ名を使用します。

手動でエージェントネットワークをセットアップする

  1. オブジェクトレベルで、エージェント用にジオメトリオブジェクトを作成します。

  2. そのジオメトリネットワークに入り、Agentノードを作成します。

    • Agent Name を設定します。

    • Input に“Character Rig”を設定してから、その Character Rig フィールドにキャラクタノードのパスを設定します。

    • OK をクリックします。

  3. Nullを追加します。このノードの名前をAGENT_DEFINITIONに変更します。

  4. 高速化するために最終的にエージェント定義をディスクにキャッシュ化したいのであれば、Agent Definition Cacheノードを追加します。

  5. 例えば、 Terrain Adaptation (エージェントの足が地形ジオメトリ上に適切に乗るように、Houdiniがエージェントのアニメーションを調整します)、 Look At (頭がどこかに向くように、Houdiniがエージェントの首ジョイントを編集します)のように、どのジョイントがどの体の部位を表わしているのかHoudiniに知らせる必要のある機能を実行したいのであれば、Agentノードの下にAgent Prepノードを追加する必要があります。

    Agent Prepパラメータでは、キャラクタ内のジョイントを特定の体の部位に関連付けることができます。

  6. エージェントのラグドールシミュレーションを実行したいのであれば、そのエージェントに 衝突ジオメトリジョイント制限 をセットアップする必要があります。ラグドール用にエージェントをセットアップする方法を参照してください。

  7. ネットワークの最後にNullを追加し、それをディスプレイフラグに設定します。これにより、そのNullの前に他のノードを追加してもネットワークの出力の参照場所が変わらない便利なノードになります。

    通常の慣習では、このノードの名前をOUTにします。

エージェント定義ネットワーク

このネットワークでは、シミュレーションする前に、エージェントプリミティブを修正するためにあなたが(またはシェルフツールが)ノードを追加する場所です。例えば、このネットワークでレイヤーを追加したり、ラグドールシミュレーションをするための衝突ジオメトリやジョイントの回転制限情報を追加します。

Agentノード

エージェントプリミティブを作成し、その名前、現行レイヤー、現行アニメーションクリップなどの基本情報を設定します。

Agent Clipノード

1個以上のアニメーションクリップをエージェント定義に追加します。

AGENT_DEFINITIONノード

このノードは、シミュレーションネットワーク内でPOP Sourceノードを使ってエージェントを取り込めるようにするための参照ターゲットとして存在しています。

Agent Definition Cacheノード

エージェント定義をディスクに書き出してから、それ以降は、入力の代わりにそのキャッシュ化したファイルからエージェント定義を読み込んでクックするようにさせることができます。 これを使用することで、キャラクタのクックが遅い場合に、そのエージェント定義ネットワークを高速化することができます。

Agent Prepノード

重要なジョイントの名前などの追加情報をエージェントにセットアップし、 手足に使用するトランスフォームを指定すれば、ソルバは足の配置方法や他のプロシージャルな変更方法を知ることができます。 これ自体は計算が高速でキャッシュ化する必要がないので、Agent Definition Cacheノードの後に追加します。

OUTノード

エージェント定義の“キャッシュ化可能”な部分の最後を示したマーカー。 最終のエージェント定義を他のネットワークにインポートするのに便利なターゲット。

アニメーションクリップをエージェントに追加する

クリップとは、キャラクタの短いアニメーション(例えば、立った状態、歩行、走行)のことです。 エージェント定義にクリップを追加することができるので、ステート別にエージェントに異なるアニメーションを演じさせることができます。

To...Do this

アニメーションソースをセットアップする

エージェントにクリップを追加する前に、 ソースキャラクタのそれぞれのインスタンスが各アニメーションを演じるようにセットアップ する必要があります。

例えば、歩行と走行のアニメーションをするcharacter1に基づいたエージェントがあったとします。 1つのcharacter1のインスタンス(character1_walkとします)が歩行を演じ、もう1つのインスタンス(character1_runとします)が走行を演じるようにセットアップします。

このセットアップを行なう一番便利な方法は、キャラクタにアニメーションが埋め込まれているのであれば、キャラクタアセット自体のポップアップメニューを使ってアニメーションを切り替えることです。 次に、単に必要な数だけインスタンスを作成して、インスタンス毎に別々にメニューを設定します。

シェルフツールを使って、アニメーションクリップをエージェントに追加します

  1. エージェント定義ネットワーク(上記参照)を含んだジオメトリオブジェクトを選択します。

  2. クリップに関する情報を設定するためのダイアログボックスが表示されます:

    • キャラクタリグアセットまたはFBXファイル、USDファイル、LOPノードのどちらからキャラクタを読み込むのかを選択します。

    • キャラクタアセットノードのパス(またはFBX/USDファイルのファイルパス)を指定します。

    • このアニメーションの Clip Name を設定します。

    • OK をクリックします。

手動でアニメーションクリップをエージェントに追加する

  1. エージェント定義SOPチェーンを含んだジオメトリネットワークの中に入ります。

  2. Agent/Agent Prepノード(s)の後にAgent Clipsノードを追加します。

Note

前のバージョンのHoudiniの群衆システムでは、エージェント情報を常にディスクにベイクし、1体のキャラクタインスタンスを作成して、それがアニメーションクリップを再生するように設定し、 そのクリップをベイクしてから、同じインスタンスが別のクリップを再生するように編集し、そのクリップをベイクしてといったように作業していました。

現在の群衆システムは、はるかに便利になって、もはやファイルをディスクにベイクする必要がなくなりました。 このシステムは、Houdiniで必要なキャラクタ情報を単にダイレクトにクックするだけです。 しかし、これだと各アニメーションクリップを演じるキャラクタアセットのインスタンスが 別々に 必要になることを意味するので、この群衆システムは、必要になった時にキャラクタ情報をクックします。

Crowd Sourceを作成する

群衆を作成するには、 エージェントプリミティブ の群衆を作成する Crowd Source ネットワークが必要です。このネットワークは、ポイントをばら撒いて、各ポイント上にエージェントプリミティブをインスタンス化します。

  1. Crowds シェルフタブで、Populateをクリックします。

  2. エージェントセットアップオブジェクトを選択してから、Enterを押します。

  3. 地形ジオメトリがあれば、それを選択してEnterを押し、なければ単にEnterを押します。

    (地形ジオメトリがない場合、そのノードは、そのノードのパラメータで定義された領域にエージェントをばら撒くだけです。)

Tip

最終結果のネットワークは編集することができ、エージェントをポイント上にコピーする前に、必要に応じて何かしらのSOPsを使ってそれらのポイントをセットアップすることができます。 例えば、散乱ポイントの代わりに、何かしらのSOPsを使って、規則正しく並んだ列のポイントをセットアップすることができます。

Crowd Sourceネットワーク

Object merge

これらのノードは、セットアップネットワークからエージェントプリミティブを“インポート”します。

Crowd Sourceノード

このノードは、エージェントプリミティブをポイント上にコピーします。 このノードには、サーフェス上または定義した領域内にエージェントを自動的に配置したり、さらに初期状態をランダムにするオプションがあります。

Agent Constraint Network

このノードは、ラグドールシミュレーション用にエージェントのパーツ間に拘束ネットワークをセットアップします。

merge_crowdsources

このノードは、シミュレーション内のエージェントクラス毎に別々のimport → crowd source → constraintsのブランチを結合します。

このノードより下には、エージェントをCrowd Simulation DOPネットワークに取り込むためのターゲットとして動作するNullノードがあります。この2つのノード間に、必要なノードを接続することで、そのノードをすべてのエージェントに適用することができます。

crowd_sim_import

このDOP IOノードは、DOP群衆シミュレーションの結果をこのオブジェクトに取り込むことで、その結果をレンダリングできるようにします。

ジオメトリをCrowd Sourceノードの2番目の入力に接続することで、エージェントの配置を制御することができます。

  • ポイントジオメトリを接続すれば、それらのポイントにエージェントが作成されます。

    入力ポイント上にエージェント関連のアトリビュートがあれば、それらのアトリビュートが、新しいエージェントプリミティブにコピーされます。これは、手動またはランダムで色々な開始条件、ルックなどをエージェントに指定するのに非常に効率の良い方法です。

  • サーフェスジオメトリを接続すれば、そのサーフェスの寸法が、パラメータでランダムにエージェントが配置される領域として使用されます。

    そのサーフェスにdensityアトリビュートがあれば、このノードは、アトリビュート値がゼロ以外の箇所にのみエージェントを作成します。

  • 何もジオメトリを接続しなかった場合は、そのパラメータを使って、ランダムに配置するエージェントの領域と数を決めます。

群衆シミュレーションを作成する

Crowd Source ネットワークは、エージェントプリミティブを生成することで、群衆内の個々のエージェントを表現します。群衆を動かしたり挙動を実行させるには、 Crowd Simulation ネットワークが必要です。

  1. Crowd Sourceオブジェクトを選択します。

  2. Crowds シェルフタブで、 Simulateをクリックします。

    このツールは、ダイナミクスネットワークを構築して、そのCrowd Sourceオブジェクトを読み込んで、いくつかのデフォルトの挙動を適用します。このネットワーク内のノードを編集することで、あなたが求めている群衆の挙動をセットアップすることができます。

    このネットワークの一般的な構造に関する詳細は、以下のダイナミクスネットワークを参照してください。

DOPネットワーク

Simulateシェルフツールは、上記のジオメトリネットワークを作成し、さらに、群衆をシミュレーションするためのシミュレーションネットワークをいくつかのサンプルノードと一緒に作成します。

States and behaviors

merge_statesノードの入力の各ブランチは、Crowd Stateノードから開始しています。このノードには、ステート(状態)の名前を指定します。

Crowd Stateノードの後には、そのCrow Stateノードとmerge_statesノードの間で、そのステート(状態)に固有の挙動ノードが接続されています。 これらの挙動ノードは、順番通りに実行 されません 。これらの挙動ノードは正規化され、そのステート(状態)のエージェントに同時に適用されます。

merge_statesノードの に挙動ノードを接続することができます。それらの挙動ノードは、 すべてのステート(状態) に適用されます。 これは、障害物の回避などの動作で役に立ちます。

ステート(状態)の名前は、そのステート(状態)で再生されるエージェントと同じ名前のアニメーションクリップに合わせてください。

Triggers and transitions

merge_transitionsノードの入力の各ブランチは、Crowd Triggerノードから開始しています。 このノードには、エージェントのステート(状態)を変更させるための条件を指定します。 Crowd Trigger Logicノードを使用することで、複数の条件を組み合わせることができます。 このノードには、2つのトリガー間での“And”, “Or”, “Not”の関係を指定することができます。

Crowd Triggerノードの後には、Crowd Transitionノードが接続されています。 これには、あるステート(状態)のエージェントがトリガー条件を満たした時に他のステート(状態)に切り替える設定を指定します。

(トリガーに複数のステート(状態)の変更を引き起こさせたい場合は、Crowd Triggerとmerge_transitionsノードの間で複数のTransitionノードを接続することができます。)

Crowd source

これは、Crowd Sourceネットワークで作成されたエージェントプリミティブを参照するPOP Source DOPです。

Crowd solverノード

群衆システムを実行します。このソルバは、すべてのエージェントに適用することができるオプションのいくつかのデフォルトの挙動(例えば、エージェントとエージェントとの衝突回避、地形追従)を制御することができます。

Crowd Object と POP Solver

これらのノードは、群衆システムの構築のベースになっているパーティクル(POP)で使用されます。通常では、これらのノードを修正する必要はありません。

Tip

Houdiniは、ネットワークエディタ内のノードをわかりやすくするために、特定のノードにカラーコード(Crowd Stateはピンク、Crowd Triggerはオレンジ、Crowd Trigger Logicは緑)を自動的に設定します。 このカラーコードを変更したいのであれば、そのノードが作成された後でノードのカラーを変更することができます。

シェルフツール

下記のツールは、シェルフの Crowds タブにあります。

Add Clip

キャラクタインスタンスが再生しているアニメーションを参照することで、そのアニメーションクリップをエージェント定義に追加します。

Collision Layer

エージェントキャラクタのスケルトン周りに単純な衝突ジオメトリをセットアップします。

Configure Joints

ラグドールシミュレーションに使用するために、エージェントキャラクタのジョイント回転制限をセットアップします。

Populate

選択したジオメトリ上にエージェントを配置するためのネットワークを作成します。 これは、シミュレーションネットワークを作成 しません 。 これは、シミュレーションを作成したくないレイアウトアーティストに役立ちます。

Paint density

地形ジオメトリ上にdensityアトリビュートをペイントすることで、生成されるエージェントのランダムな配置を制御することができます。

Simulate

サンプルのアニメーションエージェントとサンプルの挙動を使って、ジオメトリとシミュレーションのネットワークをセットアップします。 これは、迅速にネットワークをセットアップするのに役立ち、必要に合わせてネットワークを修正することができます。

Terrain

選択したジオメトリを、現在の群衆シミュレーションの地形として設定します。

Obstacle

選択したジオメトリを、現在の群衆シミュレーションの障害物として設定します。

Path

選択した経路にすべてのエージェントが辿るようにPOP Steer Pathノードを作成します。 ある特定の状態のエージェントのみがその経路を辿るようにしたい場合、POP Steer Pathノードを再接続する必要があります。 シミュレーションネットワークの概要ステート(状態)とビヘイビア(挙動)を参照してください。

Look At

エージェントの頭が、選択したオブジェクトの方を向くようにします。

Target Position

エージェントが、選択したオブジェクトの後を追いかけるようにします。

Agent Cam

選択したエージェントの頭のトランスフォームにカメラを取り付けます。

群衆シミュレーション

はじめよう

  • 基本

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

  • セットアップ

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

動くパーツ

  • エージェント

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

  • ステート

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

  • トリガー

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

  • キャッシュ

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

挙動

外観

  • 多様性

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

  • 布の取り付け

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

地形

  • 足の着地

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

  • 地形

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

  • 障害物

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