[Omniverse] パーティクルを使う – 衝突

  • by

前回の続きです。
前回は、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が衝突で使用されます。

今回はパーティクルの衝突について確認しました。

パーティクルを実用的に使いたい場合、単純に煙が縦に伸びていくだけというのは味気ないですよね。
次回以降で順を追って、特定のアクションが行われたときにパーティクルを発生させる(物体が地面に衝突したときの土煙など)、という制御を行う予定です。