リジッド ボディ パーティクルおよび障害物の衝突ジオメトリ

 
 
 

[リジッド ボディのシミュレート](Simulate Rigid Bodies)および[バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)ノードは、衝突ジオメトリのサイズおよびシェイプに基づいて、リジッド ボディ衝突を計算します。サイズおよびシェイプは、パーティクルまたは障害物の実際のジオメトリ シェイプと同じである必要はありません。使用される衝突ジオメトリは、パーティクルや障害物のものとは異なります。

リジッドボディパーティクルの衝突ジオメトリ

パーティクルのシェイプのタイプ(基本パーティクル シェイプのバウンディング シェイプまたはインスタンス化されたシェイプの凸面ハル近似)に応じて、リジッド ボディ パーティクルの衝突ジオメトリには、さまざまなタイプのシェイプが使用されます。

基本パーティクル シェイプの衝突ジオメトリ

パーティクルがリジッド ボディになると、バウンディング シェイプが自動的にパーティクルに割り当てられます。このとき、[放出](Emit)コンパウンドなどで設定された現在のパーティクルの[シェイプ](Shape)属性に最も近いバウンディング シェイプ(バウンディング球、バウンディング ボックス、バウンディング カプセル、バウンディング円錐など)が使用されます。バウンディングシェイプは詳細なジオメトリを計算する必要がないので、短い時間でパーティクルの衝突を計算したい場合に役立ちます。

   

バウンディングボックスは、ボックス、円盤、および矩形シェイプで使用されます。

バウンディング球は、球およびブロブ シェイプで使用されます。ポイントはごく小さな球で近似されます。

   

バウンディング カプセルは、カプセル、円柱、およびセグメント シェイプで使用されます。また、[リジッド ボディのシミュレート](Simulate Rigid Bodies)ノードによって円錐シェイプにも使用されます。

バウンディング円錐は、[バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)ノードによって円錐シェイプにも使用されます。バウンディング円錐の質量の中心は、円錐であることをより表せる回転が衝突の間に生じるように、(カプセル用のバウンディング シェイプが中間であるのに対して)その底面近くに設定されます。

インスタンス化されたシェイプの衝突ジオメトリ

リジッド ボディ パーティクルでインスタンス化されたシェイプを使用している場合(「ICE パーティクルインスタンス」を参照)、パーティクルの衝突ジオメトリで使用可能なものは、使用している[シミュレート](Simulate)ノードにより異なります。

凸面ハル

パーティクルのインスタンス化されたシェイプの凸面ハルは、障害物の凸面ハルと同じように作用します(以下を参照)。凸面ハルの計算は、特にパーティクルが多い場合、バウンディング ボックスよりも少し長くかかりますが、インスタンス化されたジオメトリをより正確に表現します。

[バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)ノードを使用している場合は、凸面ハルを使用するには、Instance Shape(シェイプのインスタンス化)またはSet Instance Geometry(インスタンスジオメトリの設定)ノードで、[凸面ハル(バレット RBD のみ)](Convex Hull (Bullet RBDs Only))[RBD タイプ](RBD Type)として選択します。

凸面ハルは、[リジッド ボディのシミュレート](Simulate Rigid Bodies)ノードではサポートされていません。

この画像では、穀類のピースが凸面ハル近似を使用しています。穴は衝突ジオメトリと見なされませんが、外側の輪郭は見なされます。これにより、かなりの精度で積み重なることができるようになります。

バウンディングボックス

バウンディング ボックスは、インスタンス化されたジオメトリの周りにボックス シェイプを作成しますが、それらの輪郭または凹面は考慮しません。これにより素早く作成ができますが、精度が欠けたリジッド ボディ シミュレーションになります。

ただし、([データをセット](Set Data)ノードの)[CollisionShape]属性を設定して、パーティクルの衝突ジオメトリのシェイプをボックスまたは球に変更することもできます。たとえば、バウンディング球が、使用しているインスタンス化されたジオメトリのシェイプをより正確に反映する場合、バウンディング球を使用することがあります。この場合は、パーティクルジオメトリのサイズを正確に反映させるために、[CollisionSize]属性の設定も必要になります(以下を参照)。

  • [バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)ノードを使用している場合、インスタンス化されたジオメトリにバウンディング ボックスを使用するには、Instance Shape(シェイプのインスタンス化)またはSet Instance Geometry(インスタンスジオメトリの設定)ノードの[BBox][RBD タイプ](RBD Type)として選択します。

  • [リジッド ボディのシミュレート](Simulate Rigid Bodies)ノードを使用している場合、インスタンス化されたジオメトリ シェイプにはバウンディング ボックスのみがサポートされます。

この画像では、穀類のピースがバウンディング ボックスを使用しており、凸面ハルと同じ精度では積み重なりませんが、シミュレーションは速くなります。

注:特にカメラの近くに来る「主役となる」ピースについて、衝突するパーティクルが、インスタンス化されたジオメトリの実際の形状である必要がある場合、非 ICE リジッド ボディ システム(「リジッド ボディ」を参照)を使用することがあるかもしれません。

パーティクルの衝突サイズとスケールにオフセットを設定する

リジッドボディパーティクルは、薄いスキンで覆われています。これは多くの場合、オブジェクトが衝突せずに通過してしまう問題や、グリッドおよび平面オブジェクトを障害物として使用する場合の問題を回避するのに役立ちます。ただし、スキンはリジッドボディとの小規模な相互浸透が発生する原因ともなります。

この問題を解決するために、[CollisionSize]および[CollisionScale]という 2 つのパーティクル属性が用意されています。これらの属性を設定することで、パーティクルの衝突ジオメトリのサイズを設定できます。

パーティクルの[スケール](Scale)および[CollisionScale]属性と同様に、[CollisionSize]属性が定義されていない場合は、パーティクルの[サイズ](Size)属性が衝突に使用されます。

  • [CollisionSize]はパーティクルの衝突ジオメトリのサイズです。

    パーティクルの衝突ジオメトリのサイズをパーティクルのサイズよりも大きくなるように設定して、スキンにより発生する相互貫通を阻止することができます。[CollisionSize]値を大きくすると、実際のパーティクルサイズは小さく保たれたままで、衝突の可能性が高くなります。

  • [CollisionScale]は、各 X、Y、X 軸上のパーティクル衝突ジオメトリのサイズです。

    この属性は、[サイズ](Size)または[CollisionSize]だけでは定義できない楕円形のシェイプの作成に役立ちます。

これらの属性を設定する場合は、[データのセット](Set Data)ノードを作成して、そこに各属性を外部公開します。手順については、「ICE パーティクル属性を取得および設定する」を参照してください。

この[データのセット](Set Data)ノードの[実行](Execute)出力を[放出](Emit)コンパウンドの[放出で実行](Execute on Emit)ポートに接続して、この値を一度だけ設定します。または、これを[シミュレーション ルート](Simulation Root)ノード([バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)または[リジッド ボディのシミュレート](Simulate Rigid Bodies)ノードの上)の[実行](Execute)ポートに接続して、フレームごとにデータを更新します。

リジッド ボディの障害物の衝突ジオメトリ

リジッド ボディのシミュレートに使用している[シミュレート](Simulate)ノードに応じて、障害物のジオメトリの実際の形状または凸面ハルのいずれかを使用することができます。

実際の形状

実際の形状は、障害物のジオメトリの実際の形状が衝突ジオメトリとして使用されるものです。これにより、凹面の障害物(ボウルやボックスなど)を使用できるようになります。最良の結果となるように、障害物はボリュームがある必要があります。これは、オブジェクトの実際の形状を計算するために、バレット物理エンジンが、ボリュームに基づいてオブジェクトを分解して複数の凸面ハルにするためです。

障害物のジオメトリは、(シェイプ アニメートするなど)時間とともに変形させ、衝突は正確なままにできます。ただし、シェイプがフレームごとに再計算されるので、シミュレーションの時間が増えることがあります。

[バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)ノードを使用している場合、障害物の実際の形状を使用するには、[バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)ノードの[正確なシェイプ](Exact Shape)オプション(障害物ごと)を選択します。

実際の形状は、[リジッド ボディのシミュレート](Simulate Rigid Bodies)ノードではサポートされていません。

この画像では、穀類のボックスおよびボウルの両方の実際の形状が使用されています。パーティクルは、ボックス内部のボリューム シェイプから放出されます。

凸面ハル

凸面ハルは、衝突ジオメトリに使用されるオブジェクトの実際の形状の近似を迅速に出し、プラスティックでシュリンクラップされたオブジェクトと類似した結果となります。凸面ハルは、リジッド ボディ ジオメトリ内のくぼみや穴を計算しませんが、それ以外は、リジッド ボディの元のシェイプと同じです(基本的な外側の輪郭が重視されます)。

  • [バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)ノードを使用している場合、凸面ハルを使用するには、[バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)ノードの[正確なシェイプ](Exact Shape)オプション(障害物ごと)を選択解除します。

  • [リジッド ボディのシミュレート](Simulate Rigid Bodies)ノードを使用している場合、障害物のシェイプの凸面ハル近似のみを使用できます。ただし、障害物オブジェクトを個別のプロキシ ジオメトリに分解し、それらをグループ化して、そのグループを障害物として使用することで、独自の非凸面障害物を「作成」することができます。

この画像では、ボウルの内側が「分離」されて衝突の一部になっていないため、穀類のピースはシュリンクラップされたように、単純に上部で跳ね返ります。ただし、穀類のピースはボウルの外側と正しく衝突します。

うまく衝突させるためのヒント

  • 衝突させるオブジェクトが極端に薄い場合は、衝突がうまく表現されません。そのため、障害物としてのグリッドの使用は、一般には適切ではありません。それよりも、地面やテーブルで作成するような、いくらか厚みのある平坦な立方体を使用してください。2D ポリゴン メッシュ オブジェクトに素早くボリュームを持たせるために、Apply Thickness(厚みを適用)ツールを使用することができます。必要となる厚みは、パーティクルのサイズ、速度、およびシミュレーションの精度によって異なります。

  • 速度の速い小さなパーティクル(特に球体のもの)は、衝突オブジェクトを通過してしまう場合があります。これを修正するために、[リジッド ボディのシミュレート](Simulate Rigid Bodies)または[バレット リジッド ボディのシミュレート](Simulate Bullet Rigid Bodies)プロパティ エディタの[精度](Precision)パラメータを設定できます。このパラメータを使用して、衝突の検出時および動作の解決時に行われるサブステップの反復回数を設定できます。デフォルトでは、精度は 60 に設定されています(サブステップの反復が 1/60 秒を超えた長さになることはありません)。

  • より正確な衝突のために、パーティクルのサブフレーム サンプル値を増やすこともできます(「ICE シミュレーションのサブフレーム サンプリング」を参照)。

  • リジッド ボディ パーティクルが発生したときに衝突オブジェクトから突き出ないようにするには、エミッタ オブジェクトが衝突オブジェクトから少なくとも最大のパーティクル半径の半分離れているようにします。

  • リジッド ボディ パーティクルが発生すると、衝突ジオメトリはオーバーラップすることがあります。オーバーラップすると、シミュレーションの最初のフレームでの速度を上げながら互いに反発します。この問題を減らすために、衝突ジオメトリのサイズを小さくすることができます([CollisionSize]属性をパーティクルの[サイズ](Size)よりも小さくします。上記を参照)。サイズは、リジッド ボディ パーティクルが互いに顕著に貫通するほど小さくならないようにします。

    時間または衝突ジオメトリのオーバーラップに基づいて、パーティクルごとに衝突を選択的にミュートすることもできます。パーティクルが非常に新しいときに単純に衝突をミュートすると、近傍から離れる時間が十分にとることができ、発生するときの「吹き飛ばし」を避けることができます。

  • パーティクルが衝突するときに跳ね返りすぎる場合は、[弾性](Elasticity)属性を低い値に設定するか、衝突オブジェクトの[弾性](Elasticity)値を低くするかその両方を行います(「弾性と摩擦の設定」を参照)。パーティクルの速度を下げることもできます(「ICE パーティクル速度」を参照)。これも互いに衝突したときの跳ね返り方に効果があります。