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

群衆への多様性の追加

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

On this page

ジオメトリバリエーション

単一エージェントタイプ内でジオメトリバリエーションを生成するには、異なるエージェントレイヤーセットを個々のエージェントに割り当てることで、エージェント毎に表示したいシェイプを指定することができます。

レイヤーには1つ以上の シェイプバインド を含めることができます。 このシェイプバインドには、デフォーマと一緒にレイヤーに適用したいシェイプをそのエージェントのシェイプライブラリから指定します。 デフォーマを 含まない静的な シェイプバインドに関しては、シェイプをリジッドとして追加したいジョイントも指定することができます。

エージェントには複数のレイヤーを割り当てることができ、それらのレイヤーのシェイプバインドの組み合わせによってエージェントのジオメトリが決まります。

Tip

個々のエージェントに割り当てたいシェイプバインド全部を含んだ単一レイヤーを作成することは可能なものの、 群衆で使用される固有な組み合わせ毎に新しいレイヤーをエージェント定義に追加しなければならなくなるので扱い辛いです。

私どもは、シェイプを細かくセット(レイヤー)に分けてから、個々のエージェントにそれらのレイヤーの組み合わせを割り当てて新規バリエーションを生成することを推奨してきました。 これによって、必要となるレイヤーの数が大幅に減って、エージェント定義を変更することなく群衆を集めた後に新しい組み合わせを作成することができます。

このワークフローでは、常に割り当てたい複数のシェイプバインド(例えば、目だと別々のシェイプを持ったスキンメッシュ)をレイヤーに含めることができますが、1個のシェイプバインドのみ(例えば、プロップ)をレイヤーに含めることもできます。

シェイプとレイヤーの追加

キャラクタからエージェントを作成する時、 Agent SOPは、オリジナルキャラクタの可視ジオメトリからデフォルトレイヤーを生成します。 Agent Layer SOPノードは、さらにシェイプとレイヤーを追加することができます。

全体的に異なるキャラクタスキンを含んだレイヤーを作成する:

  1. エージェントセットアップジオメトリネットワーク内に Agent Layer SOP ノードを追加します。

  2. 新しいキャラクタスキンジオメトリをその Agent Layer SOP ノードの2番目の入力に接続します。

    • スキンジオメトリを取り込むには、 Scene Character Import SOP, FBX Skin Import SOP, USD Skin Import SOPなどのノードを使用します。

    • ジオメトリ上のname Primitiveアトリビュートを使用して、エージェントシェイプの名前が決まります。このnameアトリビュート値が異なれば、そのジオメトリは複数のエージェントシェイプに分割されます。

  3. 新しいレイヤーに対して Layer Name を設定します。

シェイプを複数のレイヤーに分ける

デフォルトでは、 Agent Layerノードは、新しいシェイプ全部を含んだ単一レイヤーを作成します。

シェイプを複数のレイヤーに分ける:

  1. Number of Layers の隣りにある Addボタンをクリックして、新しいレイヤーを追加します。

  2. そのレイヤーに対して Layer Name を入力します。

  3. そのレイヤーに含めたい新しいシェイプのリストまたはパターンを Shapes に設定します。をクリックすれば、ツリービューダイアログからシェイプ名を選択することができます。

    • Solo Layer を有効にすると、このレイヤー内のシェイプのみを表示することができます。これは、 Set Current Layers パラメータ(デフォルトでは、新しいレイヤーすべてを表示します)をオーバーライドします。

  4. シェイプグループ毎に繰り返します。

Tip

シェイプジオメトリ上の文字列Primitiveアトリビュートを使用することで、プロシージャルに新しいシェイプをレイヤーに分けることができます。 例えば、 Layer Name Attributename(これがデフォルトの Shape Name Attribute です)に設定すると、シェイプ毎に別々のレイヤーが作成され、各シェイプ名が各レイヤーの名前として使用されます。

静的なシェイプの追加

静的な(変形しない)シェイプバインドを作成する方法がいくつかあります。 静的なシェイプバインドを使用することで、例えば、剛体プロップをリグ内のジョイントに取り付けることができます。

  • シェイプジオメトリが単一パックプリミティブで構成されていて、そこにboneCapture Pointアトリビュートが存在すれば、そのパックプリミティブのポイントのウェイトを単一ジョイントに当てることで(例えば、剛体変形を表現することで)、静的なシェイプバインドが生成されます。

    Note

    この形式は、KineFXのリジッドスキニングの表現方法と同じです。 例えば、Capture Packed Geometryを使用することで、シェイプを剛体として取り込むことができます。

  • シェイプにboneCapture Pointアトリビュートが 存在しない 場合、静的なシェイプバインドが生成されます。 Shape Bindings タブの Transform Name に、シェイプの取り付け先となるジョイントを設定します。をクリックすれば、ツリービューダイアログからジョイントを選択することもできます。

    • シェイプジオメトリ上のアトリビュートを使用して Transform Name を指定することもできます。これは、複数のシェイプを追加した時にそれぞれのシェイプを異なるジョイントに取り付けるのに役立ちます。 Transform Name ModeSet from Attribute に変更してから、 Transform Name Attribute に、使用するPrimitiveアトリビュートを設定します。

レイヤーをエージェントに割り当てる

各エージェントプリミティブは、現行(表示)レイヤーのリストを持ちます。他にも、エージェントはコリジョンレイヤーのリストを持つこともできます。 このコリジョンレイヤーには、ラグドールシミュレーションで使用されるジオメトリを指定し、そのエージェントの境界ボックスなどが計算されます。

  • ハイレベルな Crowd Assign Layersノードには、群衆全体にランダムなレイヤーの組み合わせを割り当てるオプションが用意されています。

    • Remove Layers を有効にすると、エージェントに既に割り当てられている特定のレイヤーを除去することができます。例えば、 Remove Layers*を設定すると、エージェントに既に割り当てられているすべてのレイヤーが除去されます。このノードによって割り当てられるレイヤーは、エージェントのレイヤーリストの後に追加されます。

    • Number of AssignmentsLayer Choices では、ウェイト指定によるレイヤーの分布を指定することで、 Group 内のエージェントに割り当てられるレイヤーを制御することができます。hat*といったパターンを使用すれば、均等な確率で選択されるレイヤーリストを指定することができます。

    • Percent to Select を有効にすると、群衆からランダムに選択されたエージェントにのみレイヤーを割り当てることができます。

    • もっと複雑なルールでレイヤーを組み合わせてジオメトリバリエーションを構築したいのであれば、 Select ByCurrent Layer に設定し、 Layer Pattern にレイヤー名のリストまたはパターンを設定します。これを使用することで、例えば、現行レイヤーのリスト内に既にレイヤーBまたはCを持ったエージェントにのみレイヤーAを割り当てることができます。

    • エージェントに既に割り当てられているレイヤーの一部を別のレイヤーに置換したいのであれば、 Switch Layers を使用して、1つ以上の検索/置換パターンを指定すると良いでしょう。 例えば、 Fromproxy_*Torender_*に設定すると、proxy_skinレイヤーの割り当てをrender_skinレイヤーに切り替えることができます。

  • Agent Edit SOPを使用することで、選択したエージェントの現行レイヤーを設定することができます。

  • WrangleまたはVOPネットワークで現行レイヤーを設定したい場合(例えば、エージェントが特定の状態になった時にそのエージェントのレイヤーを変更したい場合)、setagentcurrentlayers VEX関数またはAgent Layer Name, Agent Layers, Set Agent LayerのVOPsを使用すると良いでしょう。

Tip

エージェントに割り当てられているレイヤーは、いつでも変更可能です。 例えば、最初の段階ではインタラクティブに作業ができるように低解像度プロキシジオメトリを含んだレイヤーをエージェントに割り当てて、その後に、レンダリング前に高解像度ジオメトリを含んだレイヤーに切り替えることができます。

マテリアルのバリエーション

Material Style Sheetsは、エージェントをMantraまたはビューポートでレンダリングする時にそのエージェントのマテリアル設定を変更することができます。 これによって、例えば、エージェントのテクスチャ設定をランダムにして異なるルックを得ることができます。

Solarisで群衆をレンダリングする場合、Vary Material Assignmentなどのノードを使用することで、群衆全体で異なるマテリアルバリエーションを割り当てることができます。

複数のエージェントタイプを使用する

複数のエージェント定義を使用することで、異なるキャラクタタイプ(例えば、馬や騎手)で群衆を集めることができます。

  1. 各エージェント定義をセットアップしてから、AgentまたはAgent from Rigを使用して作成された各エージェントに固有の Agent Name を割り当てます。

    • 慣例で、agentname Pointアトリビュートには、使用されているエージェントタイプを識別できるように固有な名前を含めてください。

  2. エージェントをマージした後に、 Crowd Sourceノードを接続します。

  3. Randomize タブの Randomize Agent Primitive を有効にします。これは、群衆を集める時に1番目の入力からプロトタイプエージェントのどれかをランダムに選択します。

    • 2番目の入力のポイント上にagentnameアトリビュートを作成することで、エージェントタイプの分布を制御することができます。

  4. Agent Clip Transition GraphノードまたはAgent Clip Propertiesノードを使用している場合、各エージェントタイプの最終ジオメトリをマージします(同じ名前のクリップが複数のエージェント定義内に存在していても、agentnameアトリビュートを使用することでその干渉を回避することができます)。Crowd ObjectClip Transition GraphClip Properties のパスには、それぞれ合成されたトランジショングラフとクリッププロパティを参照するように設定します。

アトリビュート

  • Crowd Sourceノードの入力ポイント上にエージェント関連のアトリビュートが存在すれば、それらのアトリビュートが新しいエージェントプリミティブ上にコピーされます。これは、上級ユーザが手動またはランダムで異なる開始条件、ルックなどをエージェント全体で指定するのに非常に効率的な方法です。

  • Crowd Sourceノードの Randomize タブにあるコントロールを使用することで、エージェントのスケール、初期の向き、クリップ時間などのプロパティを可変させることができます。

群衆シミュレーション

はじめよう

  • 基本

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

  • セットアップ

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

動くパーツ

  • エージェント

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

  • ステート

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

  • トリガー

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

  • キャッシュ

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

挙動

外観

  • 多様性

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

  • 布の取り付け

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

地形

  • 足の着地

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

  • 地形

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

  • 障害物

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