vfxvelocity

VFXエフェクトのトピックス、CG最新情報を発信していきます

Thinking Particle 第7回 オブジェクトをパーティクル化してみて色々やってみよう~! その2

こんにちは、コンドウ タカシです。
早いもので、もう年が明けてから10日近く経ってしまいましたね。昨日から仕事の人も居るかと思いますがお互い頑張っていきましょう!!
さて今回は前回の「オブジェクトをパーティクル化してみて色々触ってみよう」の続きをやっていこうと思います。

えっっと確か、、、 前回はこんな感じの組み方で終わっていましたよね

前回の最終結果としては、「red」のグループに対して「blue」のグループがめり込んでいます。
「おもいっきしめり込んどるがなー!」という訳で修正していこうと思います。

まず、「SC」という名称のグループを作って「red」「activePrt」「force」のグループを子供に入れてあげます。

次に、「SC」とう名称のDynamicSetを作り、「Operators」→「SharpeCollision」→「SC」ノードを作ります。
SCというのは衝突シミュレーションをするノードでパラメーターロールアウトのGroupの項目に入っているグループが
シミュレーションの対象になります。

なので、「SC」グループを選んであげます。
こうすることによって、「SC」グループの子供である「red」「activatePrt」「force」「blue」グループも対象になります。

ちょっと、タイムスライダーをスクラブ(進めて)あげて確認してみます。
ん~~~

ちゃんと衝突シミュレーションをしているんですが、球体「activatePrt」グループも弾かれてどっかに吹っ飛んでしまっています。
「red」グループと「activatePrt」グループは”衝突判定をしているんだけど、動いて欲しくない”ので
「red」グループを選択して、右端に現れるパラメーターロールアウトに目を向けると、

「Active」「Neutron」「Frozen」という項目があります。

これは何なのかと言うと、パーティクル化したオブジェクトが衝突時に「どういう状態?」かを決める場所で

「Active」なら衝突判定してなおかつ自分も動いてしまう物(デフォルトではActiveになっています)
「Neutron」なら衝突判定するけど自分は微動だにしない物
「Frozen」なら衝突判定して自分がある一定の力が掛かったら動いてしまう物
になります。

なので、「red」グループと「activatePrt」グループは「Neutron」に変更してあげます。

ちなみに、「Elasticity」「DynamicFriction」「Static Friction」も大事な項目で

「Elasticity」弾性 値を大きくするとポンポンとバウンドします。
「DynamicFriction」パーティクル同士が衝突した瞬間の時の摩擦で、高い値だと収まった動きになります。
「Static Friction」パーティクル同士が連続して接している時の摩擦で、低い値だと氷が滑っているような動きになります。

再度、タイムスライダーを動かして確認してみます。今度はちゃんと球体が弾かれずに衝突している事が確認出来ました。
ですが、よく見てみてみると球体が当たる前から重力が破片が落ちていってしまってます。

それもそのはず
だって、「blue」グループになった時に「force」グループの子供になっているから
「red」から「blue」にグループが変わった瞬間に重力が掛かってしまうからです。

なので、それを防ぐ為「force」DynamicSetの所で「force」グループが”衝突を受けたらその時はじめて重力が掛かる”様にしていきます。
「force」グループの”Velocity”アウトプットから「Threshold」の”Value”インプットに繋いで、”Out”アウトプットから「Force」ノードの”On”インプットに
繋いであげます。

「Threshold」のパラメーター Threshold1には1、Threshold2には9999の値を入力いていて「Inside(内側)」をチェックしています。
こうすることによって「force」グループのVelocity(速度)が1を超えた時(つまり衝突でちょっと動かされた時)に重力が掛かる様になります。

どや!
ということで、球体が衝突する迄重力が掛からなくなりました。

ちょっと、衝突の勢いに欠けるので球体の飛んでいる速度が影響する様にします。
「attack」という名称のDynamicSetを作り、下図の様にノードを繋げていきます。

ここでは何をしているかというと「blue」グループに対して球体「activatePrt」のVelocity(方向を持った速度)が適用される様にしています。

これで、球体の衝撃がより伝わるようになりました。

ちょっと視点を変えて見てみます。
すると、当然ですが瓦礫「blue」グループが重力によって下に落ちていっています。
この位の個数なら別に問題ないですが、量が増えてくるとシーンが重くなってきたりキャッシュの容量が増えたりするので、
カメラの視野外にあるパーティクルは「削除」していきましょう。

「killByInmesh」という名称のDynamicSetを作り、以下の様にノードを組んでいきます。
ここでは何をしているかというと「InMesh」ノードというノードを使って
指定したオブジェクトの中にパーティクルが入ったら「ParticleDie」ノードというパーティクルが消えるノードがオンになる様にしています。
「Node」ノードには別途作ったBoxをピックしています。

こうすることにより、Boxに「blue」グループがめり込んだら、パーティクルが消えました。

最後にキャッシュ(計算した結果をファイルとして出力)を書き出してみましょう。
キャッシュを出力することによって2回目以降の再生がスムーズになります。
やり方は簡単でキャッシュを書き出したいDynamicSetの左にあるアイコン(下図の赤く囲っている所)を右クリックして
「Cache Record」をクリックするだけです。

PS:「ここをこうしたら良いんじゃない?」とかご意見、ご感想はツイッターで頂けると幸いです。

 

 

関連記事