Rigid Body
剛体シミュレーション。
Rigid Bodyの作成は、Rigid Bodiesタブから RBD object 選択後、Rigid Body化するオブジェクトを選択し、Enter
Rigid Bodyの基本ノード構成
torus_object1に対してRigid Body化した直後
torus_object1の内側
通常通り、ジオメトリが作成され、restにつながっている。
restノードはソリッドテクスチャをオブジェクトへ追従させるために使うノードらしい。
dopimportノードは、別の階層にある DOP Networkへジオメトリデータを転送するのに使っている
Object Mask = dopobjscreatedby(“/obj/AutoDopNetwork/torus_object1”)
AutoDopNetworkの内側
dopimportで出力されたジオメトリデータをRBD Objectノードで受け取っている。
SOP Pathパラメータにて、どのジオメトリを受け取るか指定
SOP Path = opinputpath(“/obj/torus_object1/dopimport1”, 0)
Rigid Body Solver
実際にシミュレーションを行うノード。
Solver Engineパラメータで、使用するソルバを指定する。
おそらくBullet以外を使うことは殆ど無いんじゃないだろか
以降のコネクションには、ここでリジッドボディに関連するジオメトリをまとめるmergeノードと、重力等の外力ノードが並ぶ。
これに続けてWindノードなどをつないで外力を足すことも可能。
Ground Plane
無限遠のCollisionオブジェクトを足すことができる。
Rigid BodiesタブからGraund Plane。
Rigid Bodyオブジェクトの初期状態
各RBD ObjectノードのInitial Stateタブにて設定。
Collisionのパフォーマンス調整
RBD ObjectのCollisionsタブにて設定
Modeの変更可で処理の高速化ができそう。
Modeパラメータは、実際に各RBD オブジェクトがどのようなCollision形状を使用して衝突判定を行うかを決定する。
このCollision形状を確認するには、Show Collision Geometryをオンにし、一度初期フレームに戻る。
DivisionsパラメータでCollision形状の精度を調整する。
当然だが、極力少ない面の数で構成されるように調整するのが良い。
シミュレーションのパフォーマンス調整
AutoDopNetworkのパラメータで行う。
Sub Stepで1ステップを何分割して計算するか指定。
このへんはその他のシミュレーションツールと同じ考え方で良さそう。
剛体の振る舞い調整
RBD ObjectのPhysicalタブで行う。
このへんもMayaなどと同じ考えで設定できそう。
※Mayaにないパラメータ
Dynamic Friction Scale:静止摩擦が限界を迎えた後の摩擦係数。
説明を読む限り、Frictionは静止摩擦で、それに対してこの数値を掛けあわせた値が動摩擦係数として動作するということらしい。
よって、この値が0の場合は、滑り出したら摩擦係数0の状態で動作するようになる。逆に、1の場合は常に静止摩擦の値で摩擦係数が発生することになる。
Temperature:温度。浮力や発火の検知に用いる値らしい。
例えば、燃料オブジェクトにこの剛体が接した時、燃料オブジェクトの発火温度をこの値が上回っていたら発火させる。
この発火処理がどのように行われるかは現時点では不明。
RBD Objectの追加
追加したいオブジェクトを選択し、通常通りRBD Objectを作成すると、AutoDopNetworkにRBDオブジェクトが追加される。
RBD Objectはいったんmergeノードにまとめられた上で各ソルバノードへジオメトリの出力を行うようだ。
これは、Static RBDオブジェクトの追加も同様。
閉じていない形状のRBDオブジェクト
デフォルト設定では、RBDオブジェクトは閉じていない形状でも閉じてい状態で計算される(Bulletの制限?)
ボールはチューブの内側に落ちず、チューブが持つボリュームに乗る。
これを防ぐには、チューブの表面に厚みをもたせ、形状を閉じておく必要がある。
カーブ上に散布するオブジェクトの向き
ここでは、散布されたオブジェクトをそれぞれ次のオブジェクトに向けるある一点のオブジェクトに向いてほしい方向は「次のポイントの位置-現在のポイントの位置」で表わせる。
pointノードについてもう少し
pointノードのinput2は、ポイント参照用のオブジェクトを入力できる。
参照用オブジェクトを使用すれば、法線方向の計算などで使用することができる。
上図の例では、上見えているカーブを複製し、複製されたカーブを少し下にずらしている。
複製されたカーブなので、各頂点番号は一致している状態。
ここで、上のカーブをpointノードのinput1に、下のカーブをinput2へ接続し、pointノードのNormalに以下のエクスプレッションを仕込む。
NormalX : $TX2-$TX
NormalY : $TY2-$TY
NormalZ : $TZ2-$TZ
$TX2はinput2側の頂点位置を指す。
こうすることで、input1の各頂点法線は、input2の各頂点との差分ベクトルを持つようになる。
Dominoチュートリアル
このチュートリアルでは、まずドミノピースを並べるためにカーブを作成する。その後、カーブをResampleし、等間隔で頂点をもたせる。
最終的には、このカーブが持つ各頂点上にピースを複製して散布する。
Resample済みのカーブを受け取るSortノードを作成し、ソート方法をShiftにした上でOffsetパラメータを変更すると、各頂点番号が循環する。
ここでは、この性質を利用して、全く同じ形状で一つ頂点番号がずれたカーブを法線方向計算のための参照先として利用する。
頂点数が同じで、元の頂点の並びが同じカーブ同士なら、片方のカーブ上にある頂点番号を一つシフトすると$TXと$TX1の差は、ちょうど隣り合う頂点の位置の差分となる。
よって、この値をNormalに与えれば各頂点の法線は、強引ではあるが次の頂点方向を向くようになる。
この時、末端のポイントだけは正しい方向を向けられないので、DeleteノードをPointノードの後ろに配置し、ポイントの削除を行う。
オブジェクトの頂点上にRBDオブジェクトを散布する
任意のオブジェクトを選択した状態で以下を押す
すると、ダイアログが開く。RBD Packed〜 と RBD Point〜の違いが不明なので調べる。
その後、散布したいオブジェクトを選択し、Enterキーで決定。
散布された各オブジェクトは、通常通りRBDオブジェクトとして動くようになる。
あとは、地面を配置してドミノをスタートさせるオブジェクトを作り、最初のピースを倒すだけ。
RBD Object と RBD Fracture Object
RBD Objectは、一つのジオメトリに複数ピースのジオメトリが含まれている場合、それらが一塊でなかった場合でも一つのRigid Bodyオブジェクトとして扱われる。
RBD Fracture Objectは、1ジオメトリ内に含まれるすべてのジオメトリを個別のRigid Bodyオブジェクトとして扱う。
RBD Glue Object
糊付けされたように、もともと結合力を持っているRigid Bodyが作成できる。例えば家具など、力が加わることで破壊され、他と切り離されるまでは結合を保とうとする振る舞いが作成できる。
シェルフ内で当該機能が見つけられなかった。
別の方法で作る方法を探る。
RBD Pin(Rigid Body Constraint)
剛体に制限を与えることができる。
以下を押す。対象となる剛体オブジェクトを選んでEnter、Pinの位置を選択し、もう一度Enter
RBD同士をPinでつなぐ
RBD Pin作成時に2つのRBDを選択すれば、それぞれがPinで繋がれる
Rigid Pin Constraintノード
Constrained Objectはコンストレインをうけるオブジェクト
Goal Objectは、コンストレインを与えるオブジェクト
Goal Objectが空欄だとGoal Locationで定められた位置にゴール位置が固定される。
RBD Spring Constraint ノード
バネで剛体をつなぐコンストレイン。
Limit Forceは、バネが切れる力のしきい値のようだ。
低めの値にしておくと、一定の速度がかかった時にバネが消えて、剛体は自由落下する。
その他のRigid Body Constraint
RBD Hinge Constraintや、RBD Angular Constraint等がある。
使用するソルバによって使えるコンストレインが変わるらしい。
破壊可能なRigid Body
RBDを作成後、Make Breakableを押す
破壊のパラメータは Fracture Parameterノード内で操作する。