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

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

On this page

概要

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

キャラクタのセットアップ

まず、 Crowds シェルフのツールを使って、キャラクタにラグドール固有の情報を追加する必要があります。

  1. Collision Layerツールを使用して、エージェントのスケルトンの周りに単純な衝突ジオメトリをセットアップします。

    (crowd source networkが既にある場合は、そこからではなく)agent setup networkからエージェントを選択します。

    • 主要なボーンをクリックします。

    • ハンドルを使って、衝突形状のサイズを調整します。

    • カプセルやボックスなど、異なった単純な形状を選んで、ボーンの周りに配置することができます。

    コリジョンを追加しないでください。例えば、手の場合は、単一の球やボックスだけを使用します。

  2. Configure Jointsツールを使用して、各ジョイントのモーション範囲を指定します。これは、例えば、キャラクタの肘が後ろに曲がらないように指定する場合です。

    (crowd source networkが既にある場合は、そこからではなく)agent setup networkからエージェントを選択します。

    • ジョイントをクリックします。

    • ハンドルを使って、ジョイントの回転制限を調整します。

    • 1方向に0まで制限を設定して、(肘や膝のような)ヒンジを作成することができます。

名前の付いたジョイントグループの作成

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

  1. エージェントをセットアップするジオメトリネットワーク内で、Agent Transform Groupノードを探します。

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

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

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

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

    • Show Guide Geometry を有効にすることで、選択したジョイントに球( Guides タブで球をスケールすることができます)を描画することができます。これは、どれのジョイントがグループの一部なのかを簡単に確認することができます。

テスト

Collision LayerおよびConfigure Jointsツールを使用する場合、agent setup networkTEST_RAGDOLL_SIMノードが作成されます。 ディスプレイフラグをこのノードに切り替えて、プレイバーのをクリックすると、重力のあるラグドール状態でエージェントのシンプルなシミュレーションを再生することができます。

テストノードは、エージェントに初期Velocityを与えることができるため、エージェントを別の方向へ投げた時に、そのエージェントがどのように反応するかをテストすることができます。

また、このノードが役に立つ理由としては、ジョイントの制限を間違ってセットアップした結果、スケルトンの初期状態が制限の外側にある場合、テストシミュレーションを開始すると、 ジョイントが即座に飛び出し、問題のある場所を示してくれる点です。

DOPでのラグドール

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

Crowd State DOPで、 RBD Ragdoll パラメータを使用して、その状態にあるエージェントをラグドールにするかどうかを選択することができます。

Active

エージェントは、Bullet RBD Solverによって制御されるラグドールです。

Animated Static

エージェントはCrowd Solverにより制御されますが、他のダイナミクスオブジェクトに影響を与えることがあります(例えば、歩く時に物を蹴散らすなど)。

Ignore

エージェントはCrowd Solverにより制御され、リジッドボディダイナミクスから影響は受けません。

Impact(衝撃)トリガー

Crowd Trigger DOPには、エージェントがRBDオブジェクトに当たると、遷移をトリガーすることができる"RBD Impact Data"タイプがあります。 例えば、エージェントが大きな石に当たった場合、エージェントをラグドールへ変更することができます。

このノードにより、トリガーを有効化することができるRBDオブジェクトのリストと、トリガーを有効化するのに必要な衝撃の強度を指定することができます。

Tip

他のエージェントとの衝突によりエージェントをトリガーできるようにするには、群衆オブジェクトを DOP Impact Objects のどれかとして設定します。

背景

Bullet Solverにラグドールのエージェントが見える場合、Bulet Solverはエージェントのトランスフォームを見て、Collision Layer内の形状を持つ各トランスフォームをリジッドボディとして処理します。 各シミュレーションのタイムステップの終わりに、Bulet Solverは、エージェントのトランスフォームを更新して、シミュレーションされたリジッドボディの変化を考慮します。 エージェントの位置と向きを感覚的に調整しようとするため、エージェントのローカルトランスフォームは"定位置"のままです。

追加ラグドールエフェクト

エージェントの RBD Ragdoll が"Active"の状態の時、Stiffness(アニメーション/シミュレーションの抵抗)、Partial Ragdoll(エージェントの一部をシミュレーションし、残りの部分をアニメーションクリップに追従させる)、Motors(ジョイントを部分的にアニメーションクリップで駆動させつつ、シミュレーションフォースに反応させる)などの効果を適用することができます。詳細は、Crowd State DOPのパラメータを参照してください。

手足の分離 (上級)

  • crowd source geometry network内のAgent Constraint Networkノードは、各エージェントのすべてのジョイントに対してすべてのコンストレイントを表した一連のポリラインを作成します。群衆シミュレーションネットワークのragdoll_internal_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をエージェントシェイプジオメトリの一部として追加/拘束すれば、エージェントの動きに基づいて布をシミュレーションすることができます。

地形

  • 足の着地

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

  • 地形

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

  • 障害物

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