リジッド ボディとの衝突

 
 
 

リジッド ボディが別のリジッド ボディと接触した時点で、どちらのリジッド ボディも衝突オブジェクトになります。これは、Softimage のその他のシミュレーション(ソフト ボディ、クロス、ヘアなど)とは若干異なります。その他のシミュレーションでは、衝突を生じさせるために障害物オブジェクトを設定する必要があります。たとえば、互いに衝突するビリヤードの球をアニメートする場合は、単に球をリジッド ボディにするだけです。球が互いに接触した時点で、すべての球が衝突に反応します。

ヒント:衝突に関するヒントについては、「うまく衝突させるためのヒント」を参照してください。

ビリヤードの球はすべてアクティブ リジッド ボディとして設定されているため、白球(円で囲まれています)が当たると、すべての球が衝突に反応します。

リジッド ボディに対する衝突を設定する

衝突を作成する場合は、最低 1 個のリジッド ボディをアクティブに設定する必要があります。複数のアクティブ オブジェクトを衝突させると、そのすべてのアクティブ オブジェクトがダイナミクスの作用を受けて動きます。

動かない(ダイナミクスの作用を受けない)障害物を作成するには、それをパッシブ リジッド ボディにする必要があります。たとえば、ビリヤード台のエッジに当たって跳ね返るビリヤード球をアニメートする場合は、球をアクティブ リジッド ボディにし、台をパッシブ リジッド ボディにします。球は台のエッジに接触すると直ちに跳ね返りますが、台は動きません。アクティブ リジッド ボディとパッシブ リジッド ボディの詳細については、「アクティブ リジッド ボディとパッシブ リジッド ボディ」を参照してください。

リジッド ボディはすべて、衝突プロパティのセットを使用して衝突時の互いの反応を計算します。このプロパティには、弾性、摩擦、衝突ジオメトリ タイプ(衝突の計算に使用されるジオメトリ)が含まれます。

衝突における関係を簡潔にするためには、通常は、一度に 1 つのリジッド ボディの値だけを設定する方法をお勧めします。たとえば、多数のアクティブ リジッド ボディが 1 つのパッシブ リジッド ボディから跳ね返る場合、そのパッシブ リジッド ボディのみが衝突プロパティ設定の対象になります。 このようにすると、パッシブ リジッド ボディのパラメータを一定値に保てます。パッシブ衝突リジッド ボディに対する各アクティブ リジッド ボディの反応を異なるものにする場合は、パッシブ リジッド ボディの基本的な衝突プロパティを設定した後で、各アクティブ リジッド ボディの反応を個別に設定できます。

注:リジッド ボディの衝突は片面で発生します。両面で衝突させるには、リジッド ボディのジオメトリを複製し、それを反転させます。
  1. リジッド ボディを 2 つ以上選択します(最低 1 つはアクティブに設定します)。

  2. それらのオブジェクトのジオメトリが互いに接触すること(ジオメトリが相互に貫入するポイントがあること)を確認します。

    最良の結果を得るためには、シミュレーションの最初のフレーム(初期状態)でリジッド ボディのジオメトリが貫入しないようにリジッド ボディを設定する必要があります。

  3. すべてのリジッド ボディの衝突プロパティを、[Rigid Body]プロパティ エディタで設定します。詳細については、このセクションで説明しています。

  4. シミュレーションを再生して、リジッド ボディを衝突させます。

    ヒント:衝突の後の回転で生じるエネルギーに気をつけてください。リジッド ボディの[速度 - 角速度制限](Velocity - Limit Angular)[リニア速度制限](Linear Limit)の値を下げてみます(「リジッドボディの速度と加速度の制限の設定」を参照)。

衝突ジオメトリ タイプの選択

リジッド ボディの衝突時には、各リジッド ボディに対して使用される衝突専用ジオメトリのタイプを設定することができます。このジオメトリには次のタイプを設定できます。

各タイプの衝突ジオメトリは他のジオメトリとうまく相互作用することができます。たとえば、リジッド ボディ同士であれば、バウンディング ボックス付きのものと、実際の形状ジオメトリを持つものとの衝突が可能です。

大まかには、できる限りバウンディング シェイプ(ボックス、球、およびカプセル)を使用してください。このタイプは、ほかの衝突タイプと比べてより安定したジオメトリを速く作成できます。この次に速く安定したジオメトリを作成できるのが凸面ハルです。実際の形状の衝突は、オブジェクトをどうしても実際の形状にする必要がある場合にのみ使用してください。実際の形状は安定しており、速く作成できますが、適切な動作を得るためには微調整が必要となります。

ヒント:地面やテーブルを作成する場合、かなり薄いグリッドよりも、いくらかの厚みのある平坦な立方体を使用してください。オブジェクトが極端に薄いと、衝突がうまく動作しません。

衝突ボリュームの表示

リジッド ボディを選択すると、選択した衝突ジオメトリのタイプに応じて、その衝突ボリュームの範囲を示す黄色いワイヤフレームが、選択したリジッド ボディの周りに表示されます。

[Visibility Options]プロパティ エディタ([Shift]+[S]キーを押す、または目のアイコンから[可視性オプション]を選択する)の[属性]ページの[衝突プリミティブ](Collision Primitives)設定を使用して、衝突ジオメトリの可視性を切り替えることができます。

バウンディング シェイプ

シェイプの精度が重要でない場合や、バウンディング シェイプのジオメトリがリジッド ボディの形状にほぼ近い場合は、バウンディング シェイプが手軽でお勧めです。衝突をチェックしつつオブジェクトの位置を絶え間なく計算するため、バウンディング シェイプを使用すると時間を大幅に節約できます。たとえば、ビリヤード台の上に散らばるビリヤードの球をシミュレートする場合は、ビリヤードの球にはバウンディング球を、ビリヤード台にはバウンディング ボックスを使用します。

バウンディング シェイプは、オブジェクトのポイントの周りで計算されます。したがって、NURBS および分割されたサーフェイスの場合は、ポイントがサーフェイスの上方に位置するため、サーフェイス上でバウンディング ボリュームが正確に定まりません。

  1. 1 つまたは複数のリジッド ボディを選択します。

  2. [Rigid Body]プロパティ エディタで、[衝突タイプ](Bounding Box)リストから[バウンディング ボックス](Bounding Sphere)[バウンディング球](Bounding Capsule)、または[バウンディング カプセル](Collision Type)を選択します。

         
     

    シェイプの精度が重要でない場合や、バウンディング シェイプのジオメトリがリジッド ボディの形状にほぼ近い場合は、バウンディング シェイプ(カプセル、球、およびボックス)が手軽でお勧めです。

凸面ハル

このオプションは、PhysX ダイナミクス エンジンに対してのみ使用可能です(「ダイナミクス エンジンの選択」を参照)。

凸面ハルはオブジェクトの実際のシェイプをすばやく概算し、シュリンクラップされているオブジェクトのような結果を生成します。リジッド ボディの凹凸や穴は計算されませんが、それを除けば元のリジッド ボディと同じ形になります。

ほとんどの場合はリジッド ボディの実際のシェイプを高い再現性で再構築し、実際のシェイプ ジオメトリを使用する場合よりも高速になるという利点があります。

黄色いラインは衝突ジオメトリを表すため、衝突が発生する場所を予測できます。ここで、黄色いラインはボウルの内側が「分離」されて衝突の一部になっていないことを示し、サクランボは単純にボウルの上部で跳ね返ります。

  1. 1 つまたは複数のリジッド ボディを選択します。

  2. [Rigid Body]プロパティ エディタで、[衝突タイプ](Convex Hull)リストから[凸面ハル](Collision Type)を選択します。

実際の形状

PhysX(「実際の形状 - PhysX」を参照)ダイナミクスエンジンのどちらを使用している場合でも、[実際の形状]を衝突ジオメトリとして設定できます。ただし、どちらを使用するかに応じてプロセスおよび結果は異なります。

実際の形状では、正確な衝突を表現できますが、バウンディング シェイプまたは凸面ハルよりも計算に時間がかかります。しかし、リジッド ボディの形状の不規則さ、穴、凹凸、尖った部分などを衝突時に考慮する場合は、実際のシェイプし使用しなければなりません。

シェイプが不規則であったり、穴、凹凸、尖った部分などを衝突時に考慮するリジッド ボディ オブジェクト(上に示す内側にさくらんぼが落ちている鉢など)には、実際の形状の衝突ジオメトリが必要です。

注:
  • インプリシット オブジェクトから作成したリジッド ボディの衝突ジオメトリとして[実際の形状]を選択すると、[バウンディング球]タイプの衝突ジオメトリに自動的に切り替えられます。これは、インプリシット オブジェクトが実際のジオメトリを持たないためです。[実際の形状]では、計算を実行するためには実際のジオメトリが必要です。

  • 実際の形状の衝突ジオメトリは、リジッド ボディの実際のジオメトリのアプロクシメーションを必要とすることがよくあります。たとえば、NURBS は三角分割に変換できます。

実際の形状 - PhysX

ダイナミクス エンジンとして PhysX を使用した[実際の形状]を選択すると、衝突データが作成され、衝突対象の各リジッド ボディのジオメトリが計算されます。この衝突データは、衝突時のリジッド ボディの実際のジオメトリに基づいて作成されます。

  1. 1 つまたは複数のリジッド ボディを選択します。

  2. [Rigid Body]プロパティ エディタで、[衝突タイプ](Actual Shape)リストから[実際の形状](Collision Type)を選択します。

  3. [ディテール](Detail)を設定して、衝突データの精度を定義した後、リジッド ボディの形状([低]、[中]、[高]、または[お茶で一服])を定義します。

  4. [サブディビジョン レベル](Subdivision Level)の値を変更することによって、衝突ジオメトリの解像度を設定します。

[実際の形状]の衝突データ

[実際の形状]タイプの衝突では、リジッド ボディの衝突データ(「ペネトレーション マップ」または「pmap」とも呼ばれます)が作成されます。衝突データは、基本的にリジッド ボディのソリッド モデル(3D マップ)です。このデータは、リジッド ボディ全体のグローバル情報に基づいて、衝突するオブジェクトがどの方向に跳ね返るべきかを指定します。

最初に行われる衝突データの計算には時間がかかりますが、計算が完了すると、高速かつ正確に衝突がシミュレートされます。別のリジッド ボディ(複製など)に同じジオメトリはある場合、それらは同じ衝突データを共有します。シミュレーションの計算時間を長引かせることなく、シーン内に多数のリジッド ボディを配置できます。

衝突データは、シミュレートする各フレームのリジッド ボディごとに作成され、シーンが開いている間はコンピュータのキャッシュに保持されます。シーンを保存すると現在のフレーム(シーンを保存するときにシミュレーションを実行していたフレーム)の衝突データのみが保存されます。これにより、多数のリジッド ボディのそれぞれに衝突データが保存されている場合などにデータが大きくなりすぎません。シーンを再ロードすると、各リジッド ボディに衝突データが再び作成されます。

注:
  • フレームの衝突データは、シーンの保存時点のものだけが保存されます。このため、アニメーション デフォーメーション付きのボディ上に保持される衝突データは、そのデフォーメーション状態の 1 フレームだけに限られます。

  • リジッド ボディのセンターを元の場所から移動するなどして操作した場合、実際の形状データに対する衝突が生じるまでに時間がかかる可能性があります。これは、シミュレーションの各フレームのポイント位置における差異分を、Softimage で再計算しなければならないためです。こうした時間のかかる計算を回避するには、リジッド ボディをフリーズしてからシミュレーションを実行するとよいでしょう。

次の 4 つの要因が、実際の形状と他のオブジェクトがどれほどうまい具合に衝突するかどうかを左右します。

高解像度のジオメトリ

実際の形状の衝突は、高解像度のジオメトリで最もうまく機能します。これは、計算に必要なオブジェクトの形状に関する情報をより多く含んでいるためです。三角形が多いほど衝突の仕上がりがよくなります。高度にテッセレートされたジオメトリを使用する利点は、サーフェイスの法線がよりスムーズになることです。この結果、より本物らしい衝突になります。

リジッド ボディに高解像度のジオメトリを作成することができます。これには、高解像度のジオメトリを通常の方法で分割する方法と、またはこのプロパティ ページで[サブディビジョン レベル](Subdivision Level)オプション(下を参照)を選択する方法があります。後者の場合、シミュレーションの外にあるジオメトリには影響は出ません。

衝突ジオメトリの詳細を十分に設定したうえで、リジッド ボディ間でファセットをだいたい同じサイズになるようにしてください。たとえば、非常に小さい三角形で構成されているリジッド ボディと非常に大きい三角形で構成されるリジッド ボディと衝突させようとしても、小さい三角形のリジッド ボディが大きい三角形のリジッド ボディを通過して衝突が発生しない可能性があります。

また、[実際の形状]タイプの衝突は、紙のように平坦なジオメトリではなく、厚みのあるジオメトリや閉じたジオメトリで良好に動作します。グリッドの使用は、一般には適切ではありません。それよりも、いくらかの厚みのある平坦な立方体を使用してください。

ディテール

[ディテール](Detail)レベルでは、衝突データの精度を定義した後、リジッドボディの形状([低]、[中]、[高]、または[お茶で一服])を定義します。

ご想像のとおり、[低]が最も速く、[お茶で一服]は最も品質がよくなります。リジッド ボディ ジオメトリに穴、凹凸、尖った部分がある場合は、一般に[ディテール]を[中]よりも高い設定にする必要があります。

設定の違いを確認するには、木を使用してください。[低]を設定すると、大きな木の形状(木の幹や枝)が描画されます。[中]では小枝や葉まで、[高]では葉が一枚一枚描画されます。木をより高い設定で描画する必要がある場合は、通常またはスムーズなオブジェクト上で[中]または[高]を設定しても、衝突データの精度には変化はありません。

このチェインのリンクは[ディテール]の[低]で調整されますが、棘のついたボールでは、おそらく[ディテール]を[中]または[高]に設定する必要があります。

ヒント:[ディテール]の[高]の設定を使っても衝突が解決しない場合、[ディテール]設定を高くして使用するよりも、[シュミレーション精度]>[サブステップ](Simulation Substeps)の数を増分することを推奨します(「リジッドボディシミュレーションの精度の設定」を参照)。フレーム毎にシュミレーション ステップを増やすことにより、衝突の計算がさらに正確になり、衝突がやや激しくなります。
サブディビジョン レベル

[サブディビジョン レベル](Subdivision Level)の値を変更することによって、衝突ジオメトリの解像度を設定できます。このオプションは単純なリニアのサブディビジョン ルールを採用しますが、シュミレーションの外にあるリジッド ボディのジオメトリには反映されません(リジッド ボディの実際のジオメトリには依存しません)。値が大きいほど衝突面がスムーズになり、衝突も正確になります。

たとえば、細身または低解像度のリジッド ボディに対してこの値を大きくすると、衝突に関する問題の解決に役立ちます。この値は衝突の精度に大きく影響しますが、衝突データの作成時間にはほとんど影響しません。

[サブディビジョン レベル]が十分に高い場合、[実際の形状]の衝突ジオメトリでは、これらのインターロッキング リングのような薄いオブジェクトとの連携動作が可能です。

  • 分割されたサーフェイスの場合、表示中のサブディビジョン レベルとは別に[サブディビジョン レベル]が衝突に使用されるサブディビジョン レベルを定義します。Catmull-Clark サブディビジョンのみをサポートします。

  • NURBS の場合、この値は衝突に使用される NURBS サーフェイスのサンプリング レベルです。ジオメトリ アプロクシメーション プロパティに使用されるサブディビジョン レベルとは別に設定されます。

実際の形状 - ODE

  1. 1 つまたは複数のリジッド ボディを選択します。

  2. [Rigid Body]プロパティ エディタで、[衝突タイプ](Actual Shape)リストから[実際の形状](Collision Type)を選択します。

このほか、衝突の精度を高める[Adaptive Substepping]オプションも使用してください。フレームあたりのサブステップ数を増やしたり、弾性を低くする方法も、実際の形状による衝突の安定性の向上につながります。

詳細については、「PhysX 対応の衝突の精度の設定」を参照してください。

衝突レイヤの設定

衝突レイヤにより、互いに衝突するリジッド ボディの排他的なグループを作成できます。衝突レイヤ番号が一致するリジッド ボディのみを互いに衝突させることができます。衝突させる必要のないリジッド ボディをそれぞれ別のレイヤに配置することにより、衝突処理時間を短縮できます。

たとえば、キャラクタのボディを構成するいくつかのオブジェクトがあるとします。これらは、互いに衝突させたいオブジェクトですが、環境内の要素ではありません。これらのオブジェクトを衝突させるには、そのキャラクタのリジッド ボディ同士に同じレイヤ番号(たとえば 1)を割り当てます。ただし、このレイヤ番号は環境内の他のリジッド ボディ(たとえばデフォルト 0)とは異なる番号にします。

注:衝突レイヤは、[Layers]パネル(メイン コマンド パネル下部の[KP/L]タブをクリック)に表示されるシーン レイヤやアニメーション レイヤには関係しません。衝突レイヤは、リジッド ボディの衝突専用として使用します。

リジッドボディに衝突レイヤ番号を割り当てるには

  1. 衝突レイヤに配置するリジッド ボディを選択します。

  2. そのリジッドボディの[Rigid Body]プロパティエディタで、[衝突対象](Collide with) [レイヤ](Layer)オプションを選択します。

  3. [レイヤ](Layer)テキスト ボックスにレイヤ番号を入力します。

デフォルトでは、すべてのリジッド ボディが衝突レイヤ 0 に割り当てられます。つまり、すべてのリジッド ボディが互いに衝突する可能性があります。

使用できるレイヤの最大数は 28(0 を含む)です。

デフォームされたリジッド ボディとの衝突

リジッド ボディには、アニメートされたデフォーメーションを適用できます。アニメートされたデフォーメーションには、ラティス、シェイプ アニメーション、エンベロープ、ウェーブなど、あらゆるデフォーム オペレータが含まれます。衝突の一部であるリジッド ボディのデフォーメーションがアニメートされている場合は、[Rigid Body]プロパティ ページで[オブジェクトの変形アニメーションに対応](Animatable Deformation)オプションを選択します。

このオプションは、時間の経過に伴ってジオメトリが実際に変形する場合にのみ必要です。アニメートされた変換(スケーリング、回転、移動)の場合は必要ありません。

  • このオプションをオンにすると、各フレームで、デフォーメーションがアニメートされているリジッド ボディ オブジェクトの現在のシェイプから、衝突が正しく検出されます。この場合、シミュレーションの速度は低下しますが、精度が向上します。このオプションはメモリを大量に消費するため、本当に必要でない限り(アニメートされたデフォーメーションの性質や、衝突に必要な精度によります)、オフにしておいてください。

  • このオプションをオフにすると、デフォームされたリジッド ボディのシェイプはシミュレーションの最初のフレームでのみ計算され、それ以降はすべての衝突に対してこれと同じシェイプが使用されます。

リジッド ボディの衝突のアクティブ化またはミュート

アクティブなリジッド ボディを作成すると、デフォルトでは衝突レイヤ番号には関係なく、すべての衝突に組み込まれます。

リジッド ボディの衝突への関与を一時的に無効に(ミュート)することができます。これは、たとえば、シミュレーション内に複数の衝突オブジェクトがあって、各オブジェクトの結果を個別にテストしたい場合に便利です。

リジッドボディの衝突をアクティブにするには

  1. すべてのレイヤ内の他のリジッド ボディと衝突させたいリジッド ボディを選択します。

  2. そのリジッドボディの[Rigid Body]プロパティエディタで、[衝突対象](Collide with) [すべて](Everything)オプションを選択します。

リジッドボディの衝突をミュートするには

  1. 衝突をミュートするリジッド ボディを選択します。

  2. そのリジッドボディの[Rigid Body]プロパティエディタで、[衝突対象](Collide with) [なし](Nothing)オプションを選択します。