2020年5月5日火曜日

パーティクルの消滅に関するメモ

Mayaには初期のバージョンからダイナミクスの機能が搭載されています。
それまでTAV(The Advanced Visualizer)のオプションだったDynamation(ダイナメーション)がほぼそのままの形で移植されました。
そして現在まで長きに渡り、途中で「Nucleus」という技術で大幅に拡充されたnDynamicsが搭載されて今では「クラシックダイナミクス」という古いシステムに格下げされましたが削除されず残っています。

そのクラシックダイナミクスの機能でもパーティクルシステムをよく使います。いわゆる「粒子アニメーション」というヤツです。
炎、煙、水、その他の自然現象をシミュレーションできる、という当時は画期的な機能ではありましたが今では、FluidやBifrostやその他の専用プラグインが多数出ていますので表現では全くと言っていほど敵いません、、。しょぼいです。でも!

こんなのが出来ます!
因みに上と右下はクラシックのパーティクル、左下はnパーティクルです。

さて本題です。
このパーティクル、大量の粒子を放出してそれぞれの位置や色や形など様々な要素を随時計算していきます。それでどんどん計算時間が増えます。キャシュを取ろうもんなら場合によってはデータが数十ギカとか行きます。
それをどうにか軽くさせるためには画面から見えない、見えなくなったパーティクルの計算をやめる、いわゆる消滅させることが重要になってきます。

この消滅にはいくつか設定があり、発生から一定の時間で消えたりランダムに消えたり。個々のパーティクルに個別に時間を割り当てたり。
全てのパーティクルが画面から順番にはけて行けばなんとか「ずっと出てる」ように見えますが場合によっては画面上にずっと残さないといけないこともあり、消滅に関してはいつも四苦八苦しています。


パーティクルのライフスパンに関するアトリビュート

Live forever      -  消滅しない

Constant          -  一定時間
Randam range  -  ランダムに消す
lifespanPP only  -  個々のパーティクル単位で指示

そんな中なんとか消滅をコントロール出来ないかと色々調べました。
結果、2つの方法を見つけました。一応それぞれMayaHelpに載っていました。

その1 X、Y、Zそれぞれの軸の数値でコントロール。


例えば落ちるパーティクルなら、Y軸の5のところに来たら消える、という感じです。
MayaHelp - 個々のパーティクルを消滅させるにはどうすればいいですか?

ここのスクリプトをコピー、パーティクルの名前を必要なものに変更して再生。


スクリプトを変更している所がY軸の数値になります。マイナス3とか5とか入れて再生して結果を見ています。

その2 特定のオブジェクトに衝突したら消える。


これはかなり便利で、オブジェクトの形状に合わせて消えてくれます。

これを実行するためにMayaのコマンド、「Particle Collision Event Editor」を使います。


collision(コリジョン)とは衝突のことです。
「Particle Collision Event Editor」の設定画面はこんな感じです。パーティクルオブジェクト毎に設定できます。













←何回目の衝突でイベントが発生するかの設定

←イベントとして新たなパーティクルを発生させたり別れさせたりできる



←イベント発生時に元パーティクルを消す
←イベント発生時にスクリプトを実行

コリジョンは通常はパーティクルとの衝突を作る際に使用します。この衝突するというタイミングを使って別のパーティクルを発生させたりパーティクルを消す、ということがこのエディターで設定できます。
しかしこれがなかなか思うように行かず、パーティクルが衝突した回数だけが設定できるので自由に消滅をコントロール出来ません。

しかし、同時にスクリプトを使えば、例えばあるメインのオブジェクトの後ろで発生し続けるパーティクルをダミーのオブジェクトを配置して消していく、ということが可能になります。

衝突イベントの MEL プロシージャを作成する

そして具体的な記述も見つけました。

global proc myEventProc(string $particleName, int $particleID, string $objectName)
{
 if($objectName == "pPlaneShape1")
 {
  particle -e -attribute lifespanPP -id $particleID -floatValue 0.0 $particleName;
 }
}


設定としましてはまず最低限のパーティクルとコリジョンオブジェクトを設定しておきます。
そして、

  • パーティクルシェイプのアトリビュートでライフスパンを lifespanPP only に設定
  • Particle Collision Event Editorでイベントを作成
  • 上記のスクリプトの中でobjectNameを消すためのオブジェクトのシェイプ名に変更してスクリプト全部をスクリプトエディタで指定
  • プロシージャ名をParticle Collision Event Editorの Eventprocedure:に入力
  • Original particle dies:にはチェック入れず
基本はこれで良いのですが実はなぜか最初ちゃんと消えませんでした。
色々見回った結果、スクリプトが返してくる衝突オブジェクトの名前の前にスペースが入ってる?のを見つけました。それでスクリプトにもオブジェクト名の前にスペース入れたら動作しました!・・何やねんそれ・・

このようにすれば、objectNameで指定したオブジェクトにパーティクルが当たるとパーティクルが消えるようになります。X、Y、Zの軸単位でなく、回数指示でなく、自分の作った形で消えてくれます!
これで、作業効率がアップすること間違いなし!
と言いたいところですがそれに伴って更に他の事を追い求めることになるので作業時間的にはどうなのか疑問ですが。。

ということで今回はパーティクルの消滅に関する事でした!

Maya2022で以前のカラー管理を使う

 ~2021年6月24日追記~ RedshiftのMaya2022対応版が更新されました。バージョンは3.0.47 https://www.redshift3d.com/product/download Maya2022の新しいカラー管理にも対応!問題なく起動します! -----...