前回の続きです。
前回は、USD Composerでパーティクルを発生させました。
今回は発生したパーティクルとメッシュ/プリミティブとの衝突判定を行います。
OmniGraph : Colliderを追加
この衝突判定は、OmniGraphの"collider"ノードを使用します。
emitterとsolverの間にcolliderを接続しました。
ここの入力のCollision Prim Pathに衝突で使用するプリミティブやメッシュを指定します。
衝突で使用するPrimを割り当て
Stageに配置したSphereなどのプリミティブやMeshをグラフにドラッグします。
ウィンドウが表示されるのでConstant Pathを選択します。
これはPrim Pathのみを参照するノードです。
このノードはパラメータとしてstringのみを持ちます。
そのため、専用のノードを作らなくてもConstant Stringノード(固定の文字列を指定するだけのノード)にPrimパスを手動で入れても同様に機能させることができます。
注意点として、この衝突形状はPhysicsのColliderを割り当てておく必要があります。
このPrim PathのノードをcolliderノードのCollision Prim Pathへつなぎます。
これで、指定のメッシュを使ってパーティクルと衝突が行われるようになりました。
衝突時にパーティクルを消したい
colliderノードを選択し、PropertyウィンドウでCollision Settings – Die On CollisionチェックボックスをOnします。
こうすると、パーティクルがMeshなどと衝突したときに消滅します。
以下の動画はDie On CollisionをOff/Onした時の動きを確認できます。
Offの場合はCubeに衝突して煙が跳ね返っているのに対し、Onの場合はパーティクルがCubeに衝突した時に消滅するため、跳ね返りは見えません。
複数のメッシュと衝突判定するには ?
colliderノードのCollision Prim Pathに対して、複数の衝突するプリミティブやMeshを指定できます。
もしくは、Xformに複数のPrimを入れてXformをcolliderノードのCollision Prim Pathにつなぐことで、Xform内のPrimが衝突で使用されます。
今回はパーティクルの衝突について確認しました。
パーティクルを実用的に使いたい場合、単純に煙が縦に伸びていくだけというのは味気ないですよね。
次回以降で順を追って、特定のアクションが行われたときにパーティクルを発生させる(物体が地面に衝突したときの土煙など)、という制御を行う予定です。