ICEスプリングと[Simulate Rigid Bodies]ノードを使用して、オブジェクト上のポイント同士を接続することができます。これらのスプリングはフックの法則に基づいています。フックの法則とは、スプリングが発生させる力は、スプリングの伸び(長さ)に正比例するというものです。
また、スプリングに対する抵抗力を持つダンパーを作成して、スプリングの力を弱めることもできます。ダンパーは実際にはスプリングとは別になっており、ポイント間の速度を低下させるために単独で使用できます。
ポイントクラウド、ポリゴンメッシュ、NURBSサーフェイスまたはカーブ、ラティスのポイント間に、スプリングやダンパーを作成できます。これによって、ソフトボディシミュレーションなどのさまざまなデフォーメーションエフェクトを作成したり、あらゆる種類の衝突を作成して、そこでスプリングの動作を発生させることができます。
ICEスプリングは、ポイントごとに設定可能な以下の属性に基づいています。データは、これらの属性の配列でも、単一の値でも構いません。
[ConnectionIndices]は、ポイントインデックスまたはインデックスの配列です。これを使用して、ICEスプリングの接続を作成できます。これがマスタ配列です。
[SpringLengths]は、シミュレーション中にスプリングが戻ろうとする自然長(停止長さ)です。
[SpringCoeffs]は、ICEスプリングの強さを決める定数(フックの法則におけるスプリング定数)です。この値にスプリングの長さと自然長の差を乗算すると、ポイントのセットごとに発生する力を求めることができます。
[DamperCoeffs]は、ポイント間の速度を低下させる反対向きの力です(スプリングから発生する速度など)。基本的に、2つのポイントが互いに相対的に移動しないようにします。スプリングとは別にダンパーを使用することができますが、両方を組み合わせることによって、シミュレーションを安定させることができる場合もあります。
[ConnectionMute]は、スプリングやダンパーのエフェクトをミュートします。
ここでは、単純なオブジェクトを使用して、ICEスプリングおよびダンパーを使用する場合のワークフローをご紹介します。
スプリングやダンパーの作成に必要な最小限のデータは、以下のとおりです。
スプリングを作成するオブジェクトで、[Simulate Rigid Bodies]ノード、フォース、(オプションで)障害物を持つシミュレートICEツリーを作成します。
スプリングを作成するには、少なくとも[ConnectionIndices]属性に接続を1つ、[SpringLengths]属性に長さを1つ定義し、[SpringCoeffs]にゼロ以外の値を設定する必要があります。これらの属性は、多くの場合シミュレートされていないICEツリーで定義されています。
ダンパーを作成するには、少なくとも[ConnectionIndices]属性に接続を1つ定義し、[DamperCoeffs]にゼロ以外の値を設定する必要があります。これらの属性は、多くの場合シミュレートされていないICEツリーで定義されています。
リジッド ボディ パーティクル放出を作成します(「ICE リジッドボディ パーティクル放出を作成する」参照)。ただし、[リジッド ボディのシミュレート](Simulate Rigid Bodies)ノードを使用して行います。必ずフォースを含め、オプションで障害物も含めてください。
オブジェクトまたはパーティクルの[Mass]属性を0より大きい値に設定します。
フレームごとにこの値を更新する場合はシミュレートICEツリーで、同じ値のままにする場合はシミュレートされていないICEツリーで設定します。
放出コンパウンドを介してパーティクルを作成している場合は、デフォルトで1の質量がパーティクルに設定されています。他の方法や他のタイプのオブジェクトでパーティクルを作成している場合は、[Set Data]ノード内などで、個別にこれを設定する必要があります。
同じポイントクラウドまたはオブジェクトで、ジオメトリにスプリングやダンパーを定義するためのシミュレートされていないICEツリーを作成します。
通常はシミュレーション中にスプリングやダンパーの属性値を変化させるため(フレームごとのリセットは不要)、このツリーをシミュレートされていないICEツリーにすることが望ましいでしょう。
ただし、計算を行うために属性値が前のフレームのデータを必要とする場合は、スプリングやダンパーの属性をシミュレートツリーで定義することもできます。たとえば、スプリングの強度を変化させるために、[SpringCoeffs]の値を継続的に変化させることができます。
[Set Particle RBD(パーティクルRBDの設定)]コンパウンドを取得し、そこでスプリングとダンパーの属性([ConnectionIndices]、[SpringLengths]、[SpringCoeffs]、オプションで[DamperCoeffs])を指定します。
必要に応じて、[データのセット](Set Data)ノードにこれらを設定することもできます。
スプリングとは別に[DamperCoeffs]を設定する場合は、[ConnectionIndices]属性も一緒に指定する必要があります。
スプリングで接続するオブジェクトのポイントの接続データを取得し、[Connection Indices]ポートに接続します。データは、この属性の配列でも、単一の値でも構いません。
オブジェクトの複雑さや、作成するスプリングの接続のタイプに応じて、さまざまな方法があります。考えられる方法は、以下の3つです。
単純なオブジェクトの場合は、1つのオブジェクト上のすべてのポイントを接続する[Build Array from Per Point Data]コンパウンドを使用します。
複雑なオブジェクトの場合は、[Get Data]ノードを使用し、[Self.PointNeighbors]属性を指定して隣接するポイントを取得します。
ポイントクラウドの場合は、[Get Neighboring Particles]コンパウンドを使用してから、影響を受けるポイントをフィルタリングします。これによって、スプリングをアタッチするインデックス配列に複数のポイントが作成されますが、[Get Neighboring Particles]コンパウンドで指定したポイントの距離や数によってフィルタリングされます。
スプリングの自然長を必要な値に設定し、[Spring Lengths]ポートに接続します。データは、この属性の配列でも、単一の値でも構いません。
たとえば、以下のツリーでは、オブジェクト内の隣接するポイント間の現在の距離にスプリングの長さを設定する方法を示しています。
スプリングの強度を設定し、この値を[Spring Coeffs]ポートに接続します。データは、この属性の配列でも、単一の値でも構いません。
この場合、スプリング係数の強度を定義するために、単純なスカラノードが使用されます。
[Damper Coeffs]属性を指定した場合は、ダンパーの強度を設定し、この値を[DamperCoeffs]ポートに接続します。データは、この属性の配列でも、単一の値でも構いません。
この場合、ダンパー係数の強度を定義するために、単純なスカラノードが使用されます。この値は、[SpringCoeffs]の値よりも低く設定する必要があります。
ダンパーはスプリングに不可欠ではありませんが、ダンパーを使用することによってシミュレーションが安定する場合があります。
[Set Particle RBD]コンパウンドで[Connection Mute]オプションを選択して、スプリングごとに接続をミュートすることもできます。
必要に応じて、これを[If]または[State]ノードのセットアップに接続し、状況に応じてアクティブ/アクティブの状態を制御することもできます。