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

エージェントの親子関係

エージェント間で親子関係を定義します。

On this page

エージェント間の親子関係は、Agent Relationship SOPを使用してセットアップすることができます。 このAgent Relationship SOPは、親子関係を示したアトリビュートをエージェントに追加します。 これらのアトリビュートは、Crowd Solverおよび群衆モーションパスツールで使用され、子エージェントが親エージェントに取り付けられた状態を維持します。

親子関係のセットアップ

この例では、騎手エージェント(子)を馬エージェント(親)に取り付けています:

子エージェントは、ポイント番号に基づいて親エージェントに取り付けされます。 親エージェントと子エージェントの数が同じである必要はありません。 子エージェントが親エージェントより多い場合、一部の親エージェントに複数の子エージェントが取り付けられます。

デフォルトでは、Agent Relationship SOPは子エージェント全体のトランスフォームを親エージェント全体のトランスフォームに合うように更新します。 初期取り付け後に子エージェントをさらに調整する方法がいくつかあります:

  • ビューポートの左側にあるツールバーのをクリックして、Agent Relationshipビューアステートに入り、ハンドルを使用して子エージェントを調整します。 子エージェントの向きを変更するには、そのハンドルを()クリックして、 Cycle Translate/Rotate を選択するか、または、ビューポート上でYを押してそのハンドルを回転モードに変更します。 そのハンドルを操作すると、Agent Relationship SOPの Translate および Rotate パラメータが更新されます:

  • 子エージェントを親エージェントの特定のジョイントに取り付けます - Agent Relationship SOPの Parent Joint をオンにして、騎手の取り付け先となる馬のジョイントを選択します。 子エージェント側のジョイントを指定( Child Joint パラメータで指定)して、それを Parent Joint に取り付けることもできます。

To...Do this

親エージェントとして指定可能なエージェントを指定する。

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

  2. ビューポート内で、親に指定したいエージェントを選択します。

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

その選択した親エージェントが Parent Group パラメータに設定されます。

子エージェントを特定の親エージェントに取り付ける。

  1. Agent Relationship SOPの上流にAttribute Wrangle SOPを配置します:

  2. そのAttribute Wrangle SOPの VEXpression フィールドに、agentrel_parentidアトリビュートを設定するVEXコードを記述します。 例えば、ポイント番号の逆順で子エージェントを親エージェントに取り付けるには、以下のVEXコードを使用します:

    i@agentrel_parentid = npoints(0) - @ptnum - 1;
    

子エージェントのスケールが親エージェントのスケールに合うように変更する。

Agent Relationship SOPの Match Parent Agent Scale をオンにします。

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

群衆シミュレーションネットワークでは、Crowd Solverが子エージェントを親エージェントに取り付けた状態を維持し、その親エージェントの動きは、その親エージェントに加えられているフォースによって制御されています。 親のSOPネットワークcrowd_simulation DOPネットワークを以下に載せます:

  1. 親のSOPネットワーク内のAgent Relationship SOPがcrowd_simulation DOPネットワークの1番目の入力に接続されているので、crowdobject DOPの SourceFirst Context Geometry に設定します。

  2. 馬エージェントのステートを設定します:

    • 馬エージェントのCrowd State DOP(この例ではhorse_run_straight)の名前を変更します。

    • このステートで馬が再生するアニメーションクリップを設定します - Crowd State DOPの Clip Namerun_straightに設定します。

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

    Note

    エージェントで利用可能なアニメーションクリップを確認するには、Agent Clip SOPを使用します:

    1. Agent Clip SOPの Set Current Clip をオンにして、ドロップダウンメニューから確認したいアニメーションクリップを選択します。 これらのアニメーションクリップ名は、Crowd State DOPの Clip Name パラメータでそのステートが再生するアニメーションクリップを設定するのに使用されます。

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

  3. POP Steer Wander DOPを使用して、馬エージェントがランダムに動き回るようにします:

    • パーティクルではなくエージェントを扱うので、 Output AttributeCrowds steerforce に設定します。

  4. 騎手エージェントのステートを設定します:

    • 騎手エージェントのCrowd State DOP(この例ではrider_run_straight)の名前を変更します。

    • このステートで騎手が再生するアニメーションクリップを設定します - Crowd State DOPの Clip Namerunに設定します。

親エージェントと子エージェントは、(それぞれのCrowd State DOPで定義された)独自のアニメーションクリップセットを持つ個別のエージェントとして扱われます。 子エージェントは親エージェントに取り付けられているので、その子エージェントに加わるステアリングフォースは、その子エージェントの動きには何も影響しません。

親エージェントに取り付けられている子エージェントのシミュレーション

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

子エージェントを親エージェントから外したい場合があります。 例えば、子エージェントを完全なラグドールに遷移させたい場合、まず最初にその子エージェントを親エージェントから外すことになります。

Agent Relationship SOPは、親子関係を示したアトリビュートをエージェントに追加します。 エージェントのagentrel_parentidアトリビュートは、そのエージェントの取り付け先である親エージェントを識別します。 agentrel_parentid0未満の場合、そのエージェントは親を持たず、他のagentrel_*アトリビュートは意味を持ちません。

この例では、50フレーム後に騎手エージェントを親の馬エージェントから外します。 これを行なうには、騎手が外された時に再生するアニメーションクリップが設定されたCrowd State DOPと、その騎手を新しいアニメーションクリップに遷移させるトリガー条件が設定されたCrowd Trigger DOPを追加します:

  1. Crowd State DOP(rider_detached)は、Crowd State DOP(rider_run_straight)のコピーです。

  2. POP Wrangle DOPを使用して、騎手を親から外します:

    • VEXpression フィールドに、親子関係を解消したい子エージェントのagentrel_parentidアトリビュートを-1に設定するVEXコードを記述します。 例えば、以下のVEXスニペットは、すべての子エージェントの親子関係を解消します:

      i@agentrel_parentid = -1;
      
  3. Crowd Trigger DOPを使用して、騎手を親から外すトリガーを設定します:

    • TypeTime (Current) に設定します。 デフォルトでは、( UnitsComparisonPlayback Time のパラメータの値に基づいて)フレーム数が50を超えるとトリガーが有効になります。

  4. Crowd Transition DOPを使用して、騎手を親エージェントから外した後に、その騎手を別のステートに遷移させます:

    • 子エージェントをrider_run_straightステートからrider_detachedステートに遷移させたいので、 Input Staterider_run_straightに、 Output Staterider_detachedに設定します。

以下の動画では、騎手エージェントが50フレーム経過した後に親エージェントから外れた後も、アニメーションクリップの再生を続けている様子が分かります:

See also

群衆シミュレーション

はじめよう

  • 基本

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

  • セットアップ

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

動くパーツ

  • エージェント

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

  • ステート

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

  • トリガー

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

  • キャッシュ

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

挙動

外観

  • 多様性

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

  • 布の取り付け

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

地形

  • 足の着地

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

  • 地形

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

  • 障害物

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

SOP群衆

群衆プロシージャル