ここに MCG で Bullet Physics ノードを使用して、リジッド ボディ シミュレーションを作成するための基本的な手順の概要を示します。
ワールドを作成する
バレット物理システムは、「ワールド」と呼ばれます。ワールドはシミュレーション中にキャッシュして更新する必要があり、シミュレーションに関与するすべてのリジッド ボディがそのコンストレイントと関係とともに含まれている必要があります。
ワールドにリジッド ボディを追加する前に、ワールド自体を作成する必要があります。初期時間が必要となり、通常、これはシーンの開始時間です。また、ワールドの重力を設定することもできます。
ダイナミック オブジェクトを追加する
他のオブジェクトが潜在的な衝突オブジェクトとしてのみ機能するのに対して、ダイナミック オブジェクトは、その変換がバレット物理エンジンによって更新されるリジッド ボディです。
- アニメーション コントローラでは、1 つの変換のみを出力できるため、ダイナミック オブジェクトを 1 つだけ持つことができます。
- 他の状況では、複数のダイナミック オブジェクトを持つことができます。たとえば、ボリューム内に変換を分布して、メッシュの複数コピーをインスタンス化するために、それらを使用してジオメトリを作成できます。このような場合、ワールドに同じダイナミック プロパティを持つ複数のリジッド ボディを追加するには、変換の配列で[凝集](Aggregate)オペレータを使用することができます。
ワールドにダイナミック オブジェクトを追加するには、次の基本的な手順に従います。
- リジッド ボディのダイナミック プロパティを設定します。
ダイナミック オブジェクトでは、質量はゼロ以外の正の値である必要があります。
- リジッド ボディを作成するには、ダイナミック プロパティを使用します。
- ダイナミック オブジェクトでは、isKinematic ポートを False に設定する必要があります。
- [凸型ハル](convexHull)は、衝突探知に使用されるメッシュです。これは隙間のない必要があり、凹面がある場合は、その凸面ハルのみを使用します。オブジェクトのレンダリングされたシェイプに使用されたメッシュと同じである必要はありません。たとえば、衝突の計算を速くするために単純化されたメッシュを使用したり、密接にパックされたオブジェクトの相互浸透が原因で発生する爆発のフォースを回避するために小さいメッシュを使用することができます。
- 必要に応じて、オブジェクトの初期速度を設定し、さらにコンストレイントを作成することができます。
- ワールドにダイナミック オブジェクトを追加します。
後でワールドから変換値を取得するには、ダイナミック オブジェクトのインデックスが必要になります。ワールドとその順序に追加したダイナミック オブジェクトの数を記録しておきます。ワールドに追加した最初のオブジェクトはインデックス 0 を、2 番目のオブジェクトはインデックス 1 を持ちます。以降のオブジェクトも同様に続きます。
衝突オブジェクトを追加する
バレット物理エンジンはダイナミック オブジェクトの衝突に衝突オブジェクトを使用しますが、その変換は更新されません。通常、これらは床や壁などの物に使用されますが、アニメートすることもできます。
衝突オブジェクトの追加は、ダイナミック オブジェクトの追加に似ていますが、もっと簡単です。
- isKinematic を true にする必要があります。このことは衝突オブジェクトが必ずしもアニメートされることを意味するわけではありませんが、アニメートされた場合は、ワールドを順方向に進める前に、グラフによってその変換を更新する必要があります。
- 質量は無視されます(常にゼロ)。
- 速度およびコンストレイントは適用されません。
ここでも、配列を使用して複数の衝突オブジェクトを追加することができます。
ワールドのキャッシュを作成する
最後のリジッド ボディを追加した後、結果の関数を使用して、ワールドのキャッシュの初期状態を設定します。
ワールドのキャッシュを更新する
次に、各フレームのキャッシュを更新する方法を定義する必要があります。これには 2 つの手順があります。
- 衝突オブジェクトをアニメートする場合は、新しい変換でワールドを更新します。
- ワールドを時系列の順方向に進めます。
衝突オブジェクトの変換を更新する
衝突オブジェクトの変換を更新するには、シーン内の INodes からの現在の変換マトリックスを取得し、インデックスによってワールド内の対応するリジッド ボディの変換を設定する必要があります。以前と同様に、複数のオブジェクトに配列を使用できます。
時系列の順方向に進める
シーンの現在の時間と最後のシミュレーション時間の差に基づいて、シミュレーションを順方向に進めます。結果の関数を CreateCache ノードの updateFunc ポートに接続します。
更新された変換を取得する
最後の手順として、インデックスによってキャッシュされたワールドからシミュレートされた変換値を取得し、それらを何らかの方法で使用します。
- コントローラの場合は、単一の変換が出力されます。
- ジオメトリのように、変換の配列上でメッシュのコピーをインスタンス化できます。