On this page |
概要
エージェントを、アニメーションによる制御ではなく、リジッドボディシミュレーションにより制御されたステート(状態)へ遷移させたい場合があります。 例えば、エージェントが死亡する場合、胴体と手足が衝突によりあちこち打撃を受けながら、地面に落ちるようにしたいといった場合です。
キャラクタのセットアップ
まず、 Crowds シェルフのツールを使って、キャラクタにラグドール固有の情報を追加する必要があります。
-
Collision Layerツールを使用して、エージェントのスケルトンの周りに単純な衝突ジオメトリをセットアップします。
(crowd source networkが既にある場合は、そこからではなく)agent setup networkからエージェントを選択します。
-
主要なボーンをクリックします。
-
ハンドルを使って、衝突形状のサイズを調整します。
-
カプセルやボックスなど、異なった単純な形状を選んで、ボーンの周りに配置することができます。
コリジョンを追加しないでください。例えば、手の場合は、単一の球やボックスだけを使用します。
-
-
Configure Jointsツールを使用して、各ジョイントのモーション範囲を指定します。これは、例えば、キャラクタの肘が後ろに曲がらないように指定する場合です。
(crowd source networkが既にある場合は、そこからではなく)agent setup networkからエージェントを選択します。
-
ジョイントをクリックします。
-
ハンドルを使って、ジョイントの回転制限を調整します。
-
1方向に0まで制限を設定して、(肘や膝のような)ヒンジを作成することができます。
-
名前の付いたジョイントグループの作成
エージェントに対して名前の付いたジョイントグループを作成することができるので、エージェントの一部またはそれ以外の部分に対してラグドール効果を適用することができます。
-
エージェントをセットアップするジオメトリネットワーク内で、Agent Transform Groupノードを探します。
-
パラメータエディタで、 Transform Groups マルチパラメータを使って、新しいグループを作成します。各グループに対して:
-
Name にジョイントグループの名前を設定します。例えば、
upper_body
。 -
Root Transforms で、そのグループとなるルートジョイントを選択します。各ルートとその子孫がグループに追加されます。
-
Blend into Group を有効にすることで、そのグループに適用される効果(例えば、剛性)の量を制御するランプを取得し、そのランプをルートジョイントから"一番外側の"ジョイントまで適用することができます。
-
Show Guide Geometry を有効にすることで、選択したジョイントに球( Guides タブで球をスケールすることができます)を描画することができます。これは、どれのジョイントがグループの一部なのかを簡単に確認することができます。
-
テスト
Collision LayerおよびConfigure Jointsツールを使用する場合、agent setup networkにTEST_RAGDOLL_SIM
ノードが作成されます。
ディスプレイフラグをこのノードに切り替えて、プレイバーのをクリックすると、重力のあるラグドール状態でエージェントのシンプルなシミュレーションを再生することができます。
テストノードは、エージェントに初期Velocityを与えることができるため、エージェントを別の方向へ投げた時に、そのエージェントがどのように反応するかをテストすることができます。
また、このノードが役に立つ理由としては、ジョイントの制限を間違ってセットアップした結果、スケルトンの初期状態が制限の外側にある場合、テストシミュレーションを開始すると、 ジョイントが即座に飛び出し、問題のある場所を示してくれる点です。
DOPでのラグドール
ラグドールのステート(状態)
Crowd State DOPで、 RBD Ragdoll パラメータを使用して、その状態にあるエージェントをラグドールにするかどうかを選択することができます。
Active
エージェントは、Bullet RBDソルバにより制御されるラグドールです。
Animated Static
エージェントはCrowdソルバにより制御されますが、他のダイナミクスオブジェクトに影響を与えることがあります(例えば、歩く時に物を蹴散らすなど)。
Ignore
エージェントはCrowdソルバにより制御され、リジッドボディダイナミクスから影響は受けません。
Impact(衝撃)トリガー
Crowd Trigger DOPには、エージェントがRBDオブジェクトに当たると、遷移をトリガーすることができる"RBD Impact Data"タイプがあります。 例えば、エージェントが大きな石に当たった場合、エージェントをラグドールへ変更することができます。
このノードにより、トリガーを有効化することができるRBDオブジェクトのリストと、トリガーを有効化するのに必要な衝撃の強度を指定することができます。
Tip
他のエージェントとの衝突によりエージェントをトリガーできるようにするには、群衆オブジェクトを DOP Impact Objects のどれかとして設定します。
背景
Bulletソルバにラグドールのエージェントが見える場合、Bulletソルバはエージェントのトランスフォームを見て、Collision Layer内の形状を持つ各トランスフォームをリジッドボディとして処理します。 各シミュレーションのタイムステップの終わりに、Bulletソルバは、エージェントのトランスフォームを更新して、シミュレーションされたリジッドボディの変化を考慮します。 エージェントの位置と向きを感覚的に調整しようとするため、エージェントのローカルトランスフォームは"定位置"のままです。
Additional ragdoll effects
エージェントが RBD Ragdoll が"Active"の状態の時、Stiffness(アニメーション/シミュレーションの抵抗)、Partial Ragdoll(エージェントの一部をシミュレーションし、残りの部分をアニメーションクリップに追従させる)、Motors(ジョイントを部分的にアニメーションクリップで駆動させつつ、シミュレーションフォースに反応させる)などの効果を適用することができます。詳細は、Crowd State DOPのパラメータを参照してください。
手足の分離 (上級)
-
crowd source geometry network内のAgent Constraint Networkノードは、各エージェントのすべてのジョイントに対してすべてのコンストレイントを表した一連のポリラインを作成します。群衆シミュレーションネットワークの
ragdoll_constraints
Constraint Network DOPは、このコンストレイントネットワークの計算を行ない、それらのコンストレイントを維持するためのフォースを適用します。ragdoll_constraints
ノードには、modify_ragdoll_constraints
SOP Solverネットワークが付加されており、これを使用して、それらのコンストレイントをシミュレーションの一部として修正することができます。これは、コンストレイントラインを削除することで、手足を分離させることができます。 -
ラグドールのエージェントがある場合(それらのステートの RBD Ragdoll が"Active")やラグドールに切り替わるかもしれないエージェントがある場合( RBD Ragdoll が"Animated Static")、ラグドールソルバは、使用できるコンストレイントにアトリビュートを追加して、コンストレイントの変更をトリガーします。
SOPソルバネットワークの
relationship_geometry
ノードを右クリックして、 Spreadsheet を選び、そのアトリビュートを確認します。 -
torque
Primitiveアトリビュートには、現行のタイムステップでコンストレイントを維持するためにソルバが使用する必要があったフォースを含んでいます。つまり、ジョイントでのフォースの量です。torque
が一定の限界を超えた箇所のコンストレイントラインを削除するPrimitive Wrangleをセットアップして、衝撃時に手足を分離させることができます:if (f@torque > 50) removeprim(0, @primnum, /* andpoints */ 1);
-
エージェントに変形ジオメトリがある場合、分離された部分は離れますが、スキンはその上で引き伸ばされます。分離されたエージェントに対して、別のスキンジオメトリを持つ代替レイヤーに切り替える必要があります。