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

ラグドールのシミュレーション

On this page

概要

エージェントを、アニメーションによる制御ではなく、リジッドボディシミュレーションにより制御されたステート(状態)へ遷移させたい場合があります。 例えば、エージェントが死亡する場合、胴体と手足が衝突によりあちこち打撃を受けながら、地面に落ちるようにしたいといった場合です。

ラグドールのシーンのセットアップ

Simulateシェルフツールを使用すれば、簡単に基本的な群衆シミュレーションシーンをセットアップすることができます。 その後は、目的に応じてネットワークを調整してください。

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

    Simulateシェルフツールから生成されたオブジェクトレベルのネットワーク

    Simulateシェルフツールから生成された群衆シミュレーションネットワーク (crowd_sim):

    群衆シミュレーションDOPネットワーク
  2. プレイバー上の Playボタンをクリックして、そのシミュレーションを再生します。すると、エージェントが立ち止まった状態から歩き出します。

  3. 現在のシーンだと、エージェントは“stand”状態から“walk”状態にしか遷移しないです。さらにトリガーを追加して、エージェントを“walk”状態から“ragdoll”状態に遷移させます。

    • crowd_simネットワークの中に入って、下図のようにCrowd Trigger DOPとCrowd Transition DOPを追加して接続します。

    • この新しく追加したCrowd Trigger DOPでは、 Type を Current State Duration に設定します。

    • この新しく追加したCrowd Transition DOPでは、 Input State をwalkに、 Output State をragdollに設定します。

    ラグドール状態への遷移を追加したネットワーク
  4. シミュレーションを再生します。すると、エージェントは立った状態、歩いた状態に加えて、エージェントとの干渉物がないために落下する状態がシーンに加わりました。

  5. エージェントとの干渉物となる地面(Ground Plane DOP)を追加します。そのGround Plane DOPの出力をmerge_static_collisionsノードに接続します。

  6. シミュレーションを再生します。すると、エージェントは立った状態、歩いた状態からラグドールとして地面に落下するようになりました。

ラグドール用のエージェントセットアップ

Simulateシェルフツールは、エージェント定義ネットワーク (mocapbiped1_setup)、群衆シミュレーション内のエージェントを定義したジオメトリネットワーク(crowdsource)をセットアップします。

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

このエージェント定義ネットワーク内のラグドール固有の情報は以下のとおりです:

  • コリジョンシェイプ(Agent Collision Layer SOP) - エージェントがラグドールに変わった瞬間にサーフェスと衝突させるのに使用されるエージェントスケルトンを囲んだ単純なジオメトリを定義します。

  • ジョイント構成(Agent Configure Joints SOP) - 各ジョイントの動きの範囲を指定します。

コリジョンシェイプ

コリジョンシェイプは、エージェントがラグドールに変わった瞬間にサーフェスと衝突させるのに使用されるエージェントスケルトンを囲んだ単純なジオメトリを定義します。

  1. エージェント定義ネットワーク内で、Agent Collision Layerノードを選択して、そのディスプレイフラグを有効にします。

  2. ビューポートの左側にある Show Handleツールを有効にします。

  3. ビューポート内で青いマーカーをクリックして、エージェントのその部分にコリジョンシェイプを追加します。青いマーカーをクリックしていくと、Agent Collision Layerノードの Collision Shapes パラメータのリストにコリジョンシェイプが追加されていきます。

    ビューポート内のコリジョンシェイプ
  4. ビューポート内でコリジョンシェイプハンドルを使用するか、または、パラメータエディタでAgent Collision Layerノードの Collision Shapes パラメータを編集することで、コリジョンシェイプの位置、向き、サイズを変更することができます。

  • マウスカーソルをビューポート内に移動させてZを押すと、コリジョンシェイプとして使用できるシェイプを循環させて切り替えることができます。または、Agent Collision Layerノードから各コリジョンシェイプの Shape パラメータでシェイプを変更することができます。

Note

すべての指ジョイントを別々にシミュレーションする必要がないのであれば、手全体で1個のコリジョンシェイプを使用するのが良いでしょう。 これは、手(例えば、手首)の親ジョイントにコリジョンシェイプを取り付けて、その手が覆われるようにコリジョンシェイプを調整すれば良いです。 子ジョイント(指)が手首ジョイントの動きを継承できるように親ジョイントにコリジョンシェイプを取り付けることが肝です。

シミュレーションさせるジョイントを少なくすれば、コリジョンシェイプとジョイント制限のセットアップや構成の手間が減り、さらにはパフォーマンスが良くなります。

To...Do this

ジョイントに割り当てられているコリジョンシェイプを変更する

  1. ビューポート内で、赤いマーカーをクリックして、コリジョンシェイプを選択します。

  2. マウスカーソルをビューポート内に移動させてZを押すと、コリジョンシェイプとして使用できるシェイプを循環させて切り替えることができます。

コリジョンシェイプを削除する。

ビューポート内で、赤いマーカーをクリックしてDeleteを押します。

ジョイントの構成

Agent Configure Jointsノードでは、各ジョイントの動きの範囲を指定します。 例えば、キャラクタの肘が後ろに曲がらないように設定したりします。

  1. エージェント定義ネットワーク内で、Agent Configure Jointsノードを選択して、ディスプレイフラグを有効にします。

  2. ビューポート内で、エージェントのジョイント制限を加えたい箇所の青いマーカーをクリックします。青いマーカーをクリックすると、Agent Configure Jointsノードの Joint Limits パラメータのリストにジョイント制限が追加されます。

    ビューポート内のジョイント制限

    Note

    ビューポートの上部にあるツールバーには、 Limit Selection to Collision Layer オプションがあります。 このオプションを有効にすると、(既にAgent Collision Layer SOPで定義済みの)コリジョンシェイプが取り付けられているジョイントマーカーのみが表示され選択できるようになります。 一般的には、コリジョンシェイプが取り付けられているジョイントにしかジョイント制限を付けないです。

    まず最初にコリジョンシェイプをセットアップしてからジョイント制限を設定する場合、(コリジョンシェイプが取り付けられている)関係のあるジョイントのみが表示されるように Limit Selection to Collision Layer を有効にします。 反対に、まず最初にジョイント制限を設定する場合、スケルトン内のどのジョイントも選択できるように Limit Selection to Collision Layer を無効にしてください。

  3. ビューポート内でジョイント制限ハンドルを使用するか、または、パラメータエディタでAgent Configure Jointsノードの Joint Limits パラメータを編集することで、ジョイント制限を調整することができます。

To...Do this

ジョイント制限を削除する。

ビューポート内で、(ジョイント制限が設定済みのジョイントであることを示した)赤いマーカーをクリックしてDeleteを押します。

(肘や膝などの)ヒンジを作成する。

Up Rotation Range パラメータまたは Out Rotation Range パラメータに対して、最小値と最大値を0に設定します。

ジョイントがヒンジになるように設定

ジョイントグループ

エージェントに対して名前の付いたジョイントグループを作成することができるので、エージェントの一部またはそれ以外の部分に対してラグドール効果を適用することができます。

  1. Agent Configure Joints SOPの後にAgent Transform Group SOPを配置します。

  2. パラメータエディタで、 Transform Groups マルチパラメータを使って、新しいグループを作成します。各グループに対して:

    • Name にジョイントグループの名前を設定します。例えば、upper_body。

    • Root Transforms で、そのグループとなるルートジョイント(s)を選択します。各ルートとその子孫がグループに追加されます。

    • Blend into Group を有効にすることで、そのグループに適用されるラグドール効果の量(例えば、剛性)を制御するランプを取得し、そのランプをルートジョイントから“一番外側の”ジョイントまで適用することができます。

    • Show Guide Geometry を有効にすることで、選択したジョイントに球が描画され、どのジョイントがグループの一部なのかを確認することができます。 Guides タブでこの球のサイズを変更することができます。エージェントを Wireframe で表示することで、もっと簡単にガイドジオメトリを確認することができます。

    左側の足ジョイントグループに対して表示されるガイドジオメトリ

テスト

Agent Collision Layerノード、Agent Configure Jointsノード、Agent Transform Groupノードのどれかの後にTest Simulation Ragdollノードを配置することができます。 このTest Simulation Ragdollノードのディスプレイフラグを有効にして、プレイバーの Playをクリックすると、重力のあるラグドール状態でエージェントのシンプルなシミュレーションを再生することができます。

Tip

このノードを使用することで、ジョイント制限が正しくセットアップされているかどうかを確認することができます。 Constraints タブの Allow Initial Violation of Limits パラメータを無効にします。 スケルトンの初期状態がジョイント制限の外側にある場合、テストシミュレーションを開始すると、ジョイントが即座に飛び出し、問題のある場所を示してくれます。

To...Do this

エージェントを様々な方向に投げた時のそのエージェントの反応をテストする。

  1. Test Simulation Ragdollノードの Initial Velocity パラメータで初期Velocityを設定します。

  2. プレイバーの Playをクリックして、エージェントのシミュレーションを再生します。

DOPでのラグドール

群衆シミュレーションネットワークでは、エージェントがラグドールになっている時のステート、そのエージェントをラグドールに変えるトリガーを設定することができます。

ラグドール用の群衆シミュレーションDOPネットワーク

ラグドールのステート(状態)

Crowd State DOPの RBD Ragdoll パラメータを以下のどれかに設定することで、特定の状態にあるエージェントをラグドールにするかどうかを選択することができます:

Active

エージェントは、アニメーションクリップに追従することなくラグドールとしてシミュレーションされます。

Animated Static

エージェントはラグドールにならず、その動きはアニメーションクリップに追従します。 エージェントは他のシミュレーションオブジェクトに影響を与えることができます(例えば、歩いている時に物を蹴散らすなど)が、シミュレーションオブジェクトはエージェントに影響を与えません。

Ignore

エージェントはラグドールにならず、どのリジッドボディダイナミクスオブジェクトにも当たりません。

詳細はCrowd State DOPを参照してください。

ragdollステートへのトリガー

Crowd Trigger DOPを使用して、エージェントをラグドールに変えるトリガーを設定することができます。 このトリガーを使用することで、例えば、歩いているエージェントが大きな石に当たった時にラグドールに変えることができます。

To...Do this

エージェントがRBDオブジェクトに当たった時にステートトランジション(状態遷移)を発動させる。

  1. Crowd Trigger DOPの Type パラメータを RBD Impact Data に設定します。

  2. DOP Impact Objects パラメータで、そのトリガーを有効にするRBDオブジェクトのリストを指定します。

  3. Impact Threshold パラメータで、そのトリガーを有効にするのに必要な衝撃の強度を指定します。

エージェントが他のエージェントに当たった時にステートトランジション(状態遷移)を発動させる。

Crowd Trigger DOPの DOP Impact Objects パラメータのオブジェクトの1つとして群衆オブジェクト(上記のネットワークのcrowdobject)を設定します。

ラグドール効果

エージェントがラグドールステート (Crowd State DOPの RBD Ragdoll パラメータを Active に設定)になると、そのエージェントに以下のようなラグドール効果を適用することができます:

  • 粘着性のある衝突 - 衝突中にオブジェクトがエージェントに引っ付くように設定することができます。

  • 剛性 - エージェントのポーズの変化に対する抵抗を制御します。

  • 部分的なラグドール - エージェントの一部をシミュレーションさせ、残りの部分をアニメーションクリップに追従させることができます。

  • モーター(運動作用) - ジョイントをアニメーションクリップによって部分的に駆動させつつも、シミュレーションフォースに反応させることができます。

詳細はCrowd State DOPを参照してください。

Sticky Collisions(粘着性のある衝突)

エージェントの群れに向かって矢が放たれる場面を考えてみましょう。 エージェントは矢に当たるとラグドールに変わり地面に倒れます。 この場合では、その矢がエージェントに引っ付いたままにして、その矢が跳ね返らず落ちないようにしたいことでしょう。 ここで、Sticky Collisions(粘着性のある衝突)の出番です。

Sticky Collisions(粘着性のある衝突)は、エージェントのステート毎に設定することができます。 例えば、エージェントがwalkステートの時は矢が引っ付いていて、ragdollステートの時は矢が引っ付かないようにSticky Collisions(粘着性のある衝突)を設定することができます。 これは、Crowd State DOPの Sticky Collisions セクション内のパラメータを設定することで行なうことができます。

他にも、エージェントで発生したSticky Collisionsの回数に基づいて、エージェントの新しい挙動(新しいステート)を発動させることができます。 Crowd Trigger DOPには、エージェントで発生したSticky Collisionsの回数を数えるオプションが用意されており、そのオプションを使用することで新しい挙動を発動させることができます。

以下の動画では、エージェントに当たった矢がそのエージェントに引っ付いたままになっています。 エージェントにSticky Collisionsが2回当たると、walkステートからragdollステートに遷移しています。

Sticky Collisions

Sticky CollisionsはBullet Solverの機能でもあります。 そのため、上記の例では、エージェントを粘着性があるようにしましたが、矢も粘着性があるようにすることができます。 RBD Configure SOPを使用することで、RBDオブジェクト(矢)を粘着性があるようにすることができます。 複数のオブジェクトに対してSticky Collisionsの設定をした場合、その設定はお互いにオーバーライドされてしまいます。 例えば、衝突衝撃の閾値が高いオブジェクトの設定が優先されることになります。 RBD Configure SOPとCrowd State DOPで共通のSticky Collisions設定に関する詳細は、Bullet SolverのSticky Collisionsを参照してください。

To...Do this

エージェントの特定のパーツを粘着性があるように設定する。

Crowd State DOPの Sticky Collisions セクションで、粘着性があるようにしたいジョイントのグループ名を Group パラメータに設定します。エージェントのジョイントグループの作成方法は、ジョイントグループを参照してください。

エージェントの粘着性を制御する

Crowd State DOPの Min Collision Impulse パラメータは、オブジェクトがエージェントに引っ付くコリジョンの最小の衝撃を定義します。 この値が大きいほどオブジェクトがエージェントに引っ付きにくくなります。

オブジェクトをエージェントに引っ付けるには、 Min Collision Impulse を0以上に設定しなければなりません。

各エージェントに引っ付け可能なオブジェクトの数を制限する

Crowd State DOPの Max Collision Objects per Shape パラメータに、粘着性があるものとして指定されているエージェントジョイントグループの各コリジョンシェイプに引っ付け可能なオブジェクトの数を設定します。 エージェントのコリジョンシェイプを定義する方法は、コリジョンシェイプを参照してください。

エージェントのコリジョンシェイプを表示するには、Crowd Object DOPの Bullet Data タブで:

  • Show Guide Geometry を有効にします。

  • ガイドジオメトリをもっと見やすくしたいのであれば、 Display Geometry を無効にすると良いでしょう。

例えば、粘着性があるように指定されたジョイントグループがupper_body(Crowd State DOPの Sticky Collisions セクションの Group をupper_bodyに設定)、 Max Collision Objects per Shape が2に設定されている場合、エージェントの上半身の各コリジョンシェイプには2個のオブジェクトしか引っ付かないことになります。 これはコリジョンシェイプ毎であり、そのエージェントの上半身の他のコリジョンシェイプにさらにオブジェクトを引っ付けることができます。

下図では、エージェントの上半身のコリジョンシェイプを表示しています。 Max Collision Objects per Shape を2に設定すると、エージェントには同じコリジョンシェイプに対して既に2個のオブジェクトが当たって引っ付いているので、下側の赤い矢はエージェントに引っ付かなくなっています。

コリジョンシェイプに衝突しているオブジェクト

オブジェクトが揺れないようにする

デフォルトでは、Bullet SolverはSticky Collisions用の接着拘束を作成します。 これによって、衝突しているオブジェクト間に完全に固定された取り付けが生成されます。 この拘束タイプをソフト拘束に切り替えると、エージェントに当たったオブジェクトはアンカーポイント(接触点)基準に揺れることが許容されるようになります。 この挙動を回避したいのであれば、Crowd State DOPの Max Collision Points を上げて、オブジェクトとエージェントの間にもっとたくさんの接触点を追加してください。

特定のオブジェクトのみがエージェントに引っ付くことができるようにする

Crowd State DOPの Collision Ignore に、エージェントに引っ付けたくないオブジェクトを設定します。 ここで指定されたオブジェクトはエージェントと衝突できますが、引っ付くことはありません。

Collision Ignore には、以下の指定をすることができます:

  • 無視したいオブジェクトのリスト - これらのオブジェクトがエージェントに引っ付かなくなります。

  • ワイルドカード(*)はすべてのオブジェクトを無視します - どのオブジェクトもエージェントに引っ付かなくなります。

  • 頭にキャレット文字(^)を付けたオブジェクトはエージェントに引っ付きます。例えば、* ^projectilesは、projectilesのみがエージェントに引っ付くことを意味します。

エージェントで発生したSticky Collisionsの回数に基づいて、新しい挙動を発動させる。

  1. Crowd Trigger DOPの Type を RBD Sticky Collisions に設定します。

  2. Transform Group には、Sticky Collisionsが発生した回数がカウントされるジョイントグループ(s)を設定します。

  3. エージェントを他のステートに変化させるトリガーの基準となる Number of Sticky Collisions と Comparison メソッドを設定します。

例えば、 Transform Group にupper_bodyを設定し、 Comparison を Equal 、 Number of Sticky Collisions を2に設定した場合、 エージェントの上半身に2個のオブジェクトが当たって引っ付くと、ステート遷移が発生します。 エージェントの遷移先のステートは、群衆シミュレーションネットワーク内のCrowd Trigger DOPの後に接続するCrowd Transition DOPで指定します。

下図では、緑色のエージェントが歩行ステートになっていて、上半身にまだSticky Collisionsが2回発生していません。 右側では数フレーム後に、黄色のエージェントは上半身にはSticky Collisionsが2回発生してラグドールに変わっています。

右側の黄色のエージェントはSticky Collisionsが2回発生してラグドールに変わりました

トラブルシューティング

以下の動画では、歩行エージェントがラグドールエージェントと衝突した時に、ラグドールエージェントを支えている拘束を無効にしています。 Sticky Collisionsは歩行エージェントに対して有効になっています。

エージェントがお互いに衝突した際の予期しなかった結果

接着拘束 は、Sticky Collisions用にBullet Solverによって作成されます。 エージェントが衝突すると、Bullet Solverはエージェントをお互いに引っ付ける接着拘束を作成します。

この接着拘束が作成されるときは、その接着拘束はDOP群衆シミュレーションネットワーク内の 拘束ネットワーク の1つに追加されます。 拘束ネットワークは、一緒に拘束したい剛体オブジェクトの組を定義します。 この場合だと、DOPネットワークには2個のConstraint Network DOPs(ragdoll_constraintsとrbd_to_agent_constraints)が含まれています。

群衆シミュレーションネットワーク内のConstraint Network DOPs

ragdoll_constraints拘束ネットワーク

エージェント間の拘束を定義します。 2番目の入力には接着拘束が接続されていません(後ほど、これが重要である理由が分かります)。

rbd_to_agent_constraints拘束ネットワーク

矢とエージェント間の拘束を定義します。 2番目の入力には接着拘束が接続されています。

Sticky Collision拘束の追加先となる拘束ネットワークを決めるBullet Solverのロジックは、Bullet Solver DOPの Sticky Collisions パラメータで制御します(上図のネットワークでいうと、このBullet SolverはRigid Body Solver DOP (rigidbodysolver1)で、 Solver Engine パラメータが Bullet に設定されています)。

この例では、Bullet Solverは、次のことが理由で、Sticky Collision拘束をragdoll_constraints拘束ネットワークに追加しました:

  • 衝突は2体のリジッドボディ(エージェント)間で発生し、それらのリジッドボディはどちらもCrowd Object(crowdobject1)内にあったこと。

    且つ

  • Bullet Solverの Use Internal Constraint Networks パラメータが有効だったこと。これによって、Sticky Collision拘束が衝突オブジェクト(エージェント)間の拘束ネットワーク(ragdoll_constraints)に追加されるようになったこと。

拘束ネットワークの2番目の入力には、適切な拘束タイプが接続されている必要があります。 この場合では、Sticky Collisionsから生成された接着拘束はragdoll_constraints拘束ネットワークに追加されましたが、 (rbd_to_agent_constraintsとは異なり)ragdoll_constraintsには接着拘束が接続されませんでした。 これが原因でragdoll_constraintsでエラーが発生し、次に、ラグドールを支えていたconetwist拘束が無効になりました。

解決策

あなたが求める挙動に応じて、いくつか解決策があります:

  • エージェント同士を引っ付けたくない場合、歩行エージェントが他のエージェントとの衝突を無視するように設定します - walkステートのCrowd State DOPの Collision Ignore をcrowdobject1(エージェント)に設定します。

  • (矢とエージェント間、2体のエージェント間の)すべてのSticky Collision拘束をrbd_to_agent_constraints拘束ネットワーク内に入れたい場合、Bullet Solverの Use Internal Constraint Networks をオフにします。オフにしなかった場合、Sticky Collision拘束はragdoll_constraints拘束ネットワークに追加されます。

    DOPネットワークにさらに拘束ネットワークを追加している場合、Bullet Solverの External Constraint Network をrbd_to_agent_constraintsに設定することで、Sticky Collision拘束がrbd_to_agent_constraintsに追加されるように明示的に指定することができます。

  • 2体のエージェント間のSticky Collision拘束をragdoll_constraints拘束ネットワーク内に入れたい場合、接着拘束をragdoll_constraintsの2番目の入力に接続するか、または、新しいSticky Collision拘束を別の拘束タイプ(ハード拘束とかソフト拘束)に切り替えるSOP Solverを追加します。

Note

Sticky Collision拘束の格納先となる拘束ネットワークを決定することがワークフローの選択肢となります。 しかし、上記の例では、ragdoll_constraints拘束ネットワークの Attach Internal Constraints to Objects パラメータがデフォルトでオンになっています。 これは、ragdoll_constraints拘束ネットワークには2体のエージェント間の拘束のみ含めることができて、矢とエージェント間の拘束を含めることができないことを意味します。

詳細は、Bullet SolverとConstraint Networkを参照してください。

Stiffness(剛性)

Stiffnessが有効になっていると、エージェントはラグドールに変わった時に現行ポーズの維持を試みます。 Stiffnessが無効になっていると、エージェントはragdollステートでは、だらりと垂れたような挙動になります。

Stiffnessが無効
Stiffnessが有効
To...Do this

Stiffnessを有効にする。

  1. Crowd State DOPの RBD Ragdoll を Active に設定します。

  2. すると、 Stiffness セクションパラメータを有効にすることができます。

剛性を強くする。

Crowd State DOPの Stiffness セクション内の Stiffness パラメータを上げます。

この Stiffness パラメータは、 Stiffness Value が Constant に設定されている時に利用可能です。

エージェントの特定の部位の剛性を強くする。

Crowd State DOPの Stiffness セクション内の Group パラメータに、剛性を強くさせたいジョイントのグループを設定します。 エージェントのジョイントグループの作成方法は、ジョイントグループを参照してください。

エージェントが現行ステートでいる最初の数秒間の剛性を制御する。

  1. Crowd State DOPの Stiffness セクション内の Stiffness Value を Ramp に設定します。

  2. Time Range に、剛性をエージェントに取り入れたい開始/終了時間(秒)を設定します。この Time Range の開始/終了時間が Stiffness Ramp の開始点/終了点に呼応しています。

    例えば、 Time Range に0.0と5.0を設定した場合、 Stiffness Ramp は、エージェントが現行ステートでいる最初の5秒間の剛性を制御します。この範囲外では、ランプはその最初と最後の値を延長します。

  3. 剛性を調整します:

    • Stiffness Ramp を使用して、 Time Range の各ポイントの剛性を調整します。

    • Stiffness Scale は、 Stiffness Ramp の値をスケールします。

Partial Ragdoll(部分的ラグドール)

Partial Ragdollが有効になっていると、エージェントのラグドールにしたい部分を指定することができます。 そして、そのエージェントの残りの部分はアニメーションクリップに追従します。 例えば、下半身は歩行クリップでアニメーションさせ、上半身はラグドールにしてシミュレーションオブジェクトから衝突反応させるようにすることができます。

以下の動画では、エージェントの上半身がSticky Collisionsの条件を満たすとラグドールに変わっているのに対して、下半身は歩行アニメーションクリップに基づいて歩き続けています。

Partial Ragdoll - 上半身がラグドールになっていて下半身が歩行アニメーションをしています
To...Do this

エージェントの特定の部分をラグドールに指定する。

  1. Crowd State DOPの RBD Ragdoll を Active に設定します。

  2. Partial Ragdoll パラメータをオンにします。

  3. Active Group パラメータには、ラグドールにしたいジョイントのグループを設定します。エージェントのジョイントグループの作成方法は、ジョイントグループを参照してください。

エージェントのラグドールでない部分で生成するアニメーションクリップを指定する。

  1. Crowd State DOPの RBD Ragdoll を Active に設定します。

  2. Partial Ragdoll パラメータをオンにします。

  3. Clips セクション内の Clip Assignment を Single Clip に設定します。

  4. Clip Name には、再生するアニメーションクリップを指定します。

アニメーションクリップの速度を上げる。

  1. Crowd State DOPの RBD Ragdoll を Active に設定します。

  2. Partial Ragdoll パラメータをオンにします。

  3. Clip Playback セクション内の Clip Speed Multiplier を上げます。

Tip

エージェントがragdollステートに遷移した時に足が滑っているように見える場合、 Clip Playback セクション内の Type を Locomotive に変更してください。 これによって、エージェントの動きがクリップのロコモーションデータでガイドされるようになります。 Type が In-Place に設定されている場合、エージェントの動きは大元のパーティクルによって完全に駆動されるため、エージェントの足の位置がステップ毎に地面に着地せずに滑ってしまいます。

Motors(運動作用)

Motors(運動作用)が有効になっていると、エージェントのジョイントがアニメーションクリップによって部分的に駆動されつつ、シミュレーションフォースに反応するようになります。

以下の動画では、エージェントがラグドールに変わっても、まだエージェントの足は歩行アニメーションクリップによって部分的に駆動されています。

Motors(運動作用)
To...Do this

Motors(運動作用)を有効にする。

  1. Crowd State DOPの RBD Ragdoll を Active に設定します。

  2. Motors パラメータをオンにします。

アニメーションクリップの効果を強くする。

Crowd State DOPの Motors セクション内の Motor Strength パラメータを上げます。

この Motor Strength パラメータは、 Strength Value が Constant に設定されている時に利用可能です。

アニメーションクリップによって部分的に駆動されるエージェントの特定の部分を指定する。

Crowd State DOPの Motors セクション内の Group パラメータに、クリップで部分的にアニメーションさせたいジョイントのグループを設定します。 エージェントのジョイントグループの作成方法は、ジョイントグループを参照してください。

エージェントが現行ステートでいる最初の数秒間のアニメーションクリップの効果を制御する。

  1. Crowd State DOPの Motors セクション内の Strength Value を Ramp に設定します。

  2. Time Range に、アニメーションクリップの効果を制御したい開始/終了時間(秒)を設定します。この Time Range の開始/終了時間が Strength Ramp の開始点/終了点に呼応しています。

    例えば、 Time Range に0.0と5.0を設定した場合、 Strength Ramp は、エージェントが現行ステートでいる最初の5秒間のアニメーションクリップの効果を制御します。この範囲外では、ランプはその最初と最後の値を延長します。

  3. アニメーションクリップの効果を調整します:

    • Strength Ramp を使用して、 Time Range の各ポイントのアニメーションクリップの効果を調整します。

    • Strength Scale は、 Strength Ramp の値をスケールします。

手足の分離 (上級)

  • crowd source geometry network内のAgent Constraint Networkノードは、各エージェントのすべてのジョイントに対してすべてのコンストレイントを表した一連のポリラインを作成します。群衆シミュレーションネットワークのragdoll_constraintsConstraint Network DOPは、これらのコンストレイントをシミュレーションにインポートし、Bullet Solverがそれらのコンストレイントを維持するためのフォースを適用します。

    Multiple SolverにSOP Solverを追加することで、それらの拘束をシミュレーションの一部として変更することができます(例えば、コンストレイントラインを削除することで手足を分離することができます)。 これらの拘束は、Crowd ObjectのConstraintGeometryサブデータに格納されているので、SOP Solverの Data Name パラメータをデフォルト値(Geometry)からConstraintGeometryに変更してください。

  • ラグドールのエージェントがある場合(それらのステートの RBD Ragdoll が Active )やラグドールに切り替わるかもしれないエージェントがある場合( RBD Ragdoll が Animated Static )、ラグドールソルバは、使用できるコンストレイントにアトリビュートを追加して、コンストレイントの変更をトリガーします。

    SOP Solverネットワークのrelationship_geometryノードをクリックして Spreadsheet を選び、そのアトリビュートを確認します。

  • torquePrimitiveアトリビュートには、現行のタイムステップでコンストレイントを維持するためにソルバが使用する必要があったフォース(つまり、ジョイントでのフォースの量)を含んでいます。

    衝撃時に手足を分離させるために、torqueが一定の限界を超えた箇所のコンストレイントラインを削除するPrimitive Wrangleをセットアップします:

    if (f@torque > 50)
        removeprim(0, @primnum, /* andpoints */ 1);
    
  • エージェントに変形ジオメトリがある場合、分離されたパーツは離れますが、スキンはその分離されたパーツ上で引き伸ばされます。分離されたエージェントに対して、別のスキンジオメトリを持つ代替レイヤに切り替える必要があります。

群衆シミュレーション

はじめよう

  • 基本

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

  • セットアップ

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

動くパーツ

  • エージェント

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

  • ステート

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

  • トリガー

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

  • キャッシュ

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

挙動

外観

  • 多様性

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

  • 布の取り付け

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

地形

  • 足の着地

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

  • 地形

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

  • 障害物

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

SOP群衆

群衆プロシージャル