Houdini sidefx official Lesson11 Dynamics

Rigid Body

剛体シミュレーション。
Rigid Bodyの作成は、Rigid Bodiesタブから RBD object 選択後、Rigid Body化するオブジェクトを選択し、Enter

Rigid Bodyの基本ノード構成

20140428_01_0

torus_object1に対してRigid Body化した直後

torus_object1の内側

20140428_01_1

通常通り、ジオメトリが作成され、restにつながっている。
restノードはソリッドテクスチャをオブジェクトへ追従させるために使うノードらしい。

dopimportノードは、別の階層にある DOP Networkへジオメトリデータを転送するのに使っている

20140428_01_4

Object Mask = dopobjscreatedby(“/obj/AutoDopNetwork/torus_object1”)

AutoDopNetworkの内側

20140428_01_2

dopimportで出力されたジオメトリデータをRBD Objectノードで受け取っている。

SOP Pathパラメータにて、どのジオメトリを受け取るか指定

20140428_01_3

SOP Path = opinputpath(“/obj/torus_object1/dopimport1”, 0)

Rigid Body Solver

実際にシミュレーションを行うノード。

20140428_01_5

Solver Engineパラメータで、使用するソルバを指定する。
おそらくBullet以外を使うことは殆ど無いんじゃないだろか

以降のコネクションには、ここでリジッドボディに関連するジオメトリをまとめるmergeノードと、重力等の外力ノードが並ぶ。
これに続けてWindノードなどをつないで外力を足すことも可能。

Ground Plane

無限遠のCollisionオブジェクトを足すことができる。

Rigid BodiesタブからGraund Plane。

20140428_01_6

20140428_01_7

Rigid Bodyオブジェクトの初期状態

各RBD ObjectノードのInitial Stateタブにて設定。

Collisionのパフォーマンス調整

RBD ObjectのCollisionsタブにて設定

20140428_01_8

Modeの変更可で処理の高速化ができそう。
Modeパラメータは、実際に各RBD オブジェクトがどのようなCollision形状を使用して衝突判定を行うかを決定する。

このCollision形状を確認するには、Show Collision Geometryをオンにし、一度初期フレームに戻る。

20140428_01_9

20140428_01_11

20140428_01_10

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オブジェクトが追加される。

20140428_01_12

RBD Objectはいったんmergeノードにまとめられた上で各ソルバノードへジオメトリの出力を行うようだ。

これは、Static RBDオブジェクトの追加も同様。

20140428_01_13

閉じていない形状のRBDオブジェクト

デフォルト設定では、RBDオブジェクトは閉じていない形状でも閉じてい状態で計算される(Bulletの制限?)

20140428_01_14

ボールはチューブの内側に落ちず、チューブが持つボリュームに乗る。
これを防ぐには、チューブの表面に厚みをもたせ、形状を閉じておく必要がある。

カーブ上に散布するオブジェクトの向き

ここでは、散布されたオブジェクトをそれぞれ次のオブジェクトに向けるある一点のオブジェクトに向いてほしい方向は「次のポイントの位置-現在のポイントの位置」で表わせる。

pointノードについてもう少し

pointノードのinput2は、ポイント参照用のオブジェクトを入力できる。
参照用オブジェクトを使用すれば、法線方向の計算などで使用することができる。

20140428_01_15

上図の例では、上見えているカーブを複製し、複製されたカーブを少し下にずらしている。
複製されたカーブなので、各頂点番号は一致している状態。

ここで、上のカーブをpointノードのinput1に、下のカーブをinput2へ接続し、pointノードのNormalに以下のエクスプレッションを仕込む。

NormalX : $TX2-$TX
NormalY : $TY2-$TY
NormalZ : $TZ2-$TZ

$TX2はinput2側の頂点位置を指す。
こうすることで、input1の各頂点法線は、input2の各頂点との差分ベクトルを持つようになる。

Dominoチュートリアル

20140428_01_16

このチュートリアルでは、まずドミノピースを並べるためにカーブを作成する。その後、カーブをResampleし、等間隔で頂点をもたせる。
最終的には、このカーブが持つ各頂点上にピースを複製して散布する。

Resample済みのカーブを受け取るSortノードを作成し、ソート方法をShiftにした上でOffsetパラメータを変更すると、各頂点番号が循環する。

ここでは、この性質を利用して、全く同じ形状で一つ頂点番号がずれたカーブを法線方向計算のための参照先として利用する。

20140428_01_17

頂点数が同じで、元の頂点の並びが同じカーブ同士なら、片方のカーブ上にある頂点番号を一つシフトすると$TXと$TX1の差は、ちょうど隣り合う頂点の位置の差分となる。

よって、この値をNormalに与えれば各頂点の法線は、強引ではあるが次の頂点方向を向くようになる。

この時、末端のポイントだけは正しい方向を向けられないので、DeleteノードをPointノードの後ろに配置し、ポイントの削除を行う。

オブジェクトの頂点上にRBDオブジェクトを散布する

任意のオブジェクトを選択した状態で以下を押す

20140428_01_18

すると、ダイアログが開く。RBD Packed〜 と RBD Point〜の違いが不明なので調べる。

その後、散布したいオブジェクトを選択し、Enterキーで決定。

散布された各オブジェクトは、通常通りRBDオブジェクトとして動くようになる。

あとは、地面を配置してドミノをスタートさせるオブジェクトを作り、最初のピースを倒すだけ。

RBD Object と RBD Fracture Object

RBD Objectは、一つのジオメトリに複数ピースのジオメトリが含まれている場合、それらが一塊でなかった場合でも一つのRigid Bodyオブジェクトとして扱われる。

20140428_01_19

RBD Fracture Objectは、1ジオメトリ内に含まれるすべてのジオメトリを個別のRigid Bodyオブジェクトとして扱う。

20140428_01_20

RBD Glue Object

糊付けされたように、もともと結合力を持っているRigid Bodyが作成できる。例えば家具など、力が加わることで破壊され、他と切り離されるまでは結合を保とうとする振る舞いが作成できる。

シェルフ内で当該機能が見つけられなかった。
別の方法で作る方法を探る。

RBD Pin(Rigid Body Constraint)

剛体に制限を与えることができる。
以下を押す。対象となる剛体オブジェクトを選んでEnter、Pinの位置を選択し、もう一度Enter

20140428_01_21

RBD同士をPinでつなぐ

RBD Pin作成時に2つのRBDを選択すれば、それぞれがPinで繋がれる

20140428_01_22

Rigid Pin Constraintノード

20140428_01_23

Constrained Objectはコンストレインをうけるオブジェクト
Goal Objectは、コンストレインを与えるオブジェクト

Goal Objectが空欄だとGoal Locationで定められた位置にゴール位置が固定される。

RBD Spring Constraint ノード

バネで剛体をつなぐコンストレイン。

20140428_01_24

20140428_01_25

Limit Forceは、バネが切れる力のしきい値のようだ。
低めの値にしておくと、一定の速度がかかった時にバネが消えて、剛体は自由落下する。

20140428_01_26

20140428_01_27

その他のRigid Body Constraint

RBD Hinge Constraintや、RBD Angular Constraint等がある。
使用するソルバによって使えるコンストレインが変わるらしい。

破壊可能なRigid Body

RBDを作成後、Make Breakableを押す

20140428_01_28

破壊のパラメータは Fracture Parameterノード内で操作する。

20140428_01_29

20140428_01_30

20140428_01_31