スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
特に nParticle などで Dynamics 計算を行っている場合、
lifespan を時間ではなく座標でコントロールしたいと思うことは多いです。

Maya では Houdini の Sink にあたるようなものがないので
Particle Experssion を使います。

まずシンプルな方法として
particle の shape ノードの Lifespan Mode を lifespanPP only にし、
Particle Expression の Runtime after dynamics に以下のように記述すれば一応できます。

float $limit = 0.0;
vector $pos = nParticleShape1.position;

if($pos.y < $limit)
nParticleShape1.lifespanPP = 0;


出力先が『lifespanPP』なので、実は「(もし Y 座標が0を下回れば)殺す」ではなく
「(もし Y 座標が0を下回れば)生まれた瞬間に死んでいたとする」
という少々奇妙な意味になりますが
これでも問題なく実行できます(もっと適切な方法があるのでしょうか?)。

今まで個人的には液体のシミュレーションなどをする際に
こぼれ落ちて不要なパーティクルに対して余計な計算をしないよう
フレームアウトしてから消えるように設定していたため
このようにして突然消えるようにしても問題はなかったのですが、
今回同僚に相談されてフェードアウトするようなものを考えてみました。

例として mia_material をマテリアルとして使用します。
下図のように particleSamplerInfo ノードを作成し、接続します。
これらのマテリアルの透明度は単一アトリビュートなので
(説明するまでもありませんが lambert などは R,G,B の三重アトリビュート)、
particleSamplerInfo の opacityPP から reverse ノードを介して
接続する方がスマートかも知れませんが
outTransparency のいずれかの子を接続しても問題ありません。
(この辺りもいまいち理解不足。何か明確な違いがあるのでしょうか)

110825_1.png

そして particle の shape ノードの Lifespan Mode を lifespanPP only にして
Particle Expression の Runtime after dynamics に以下のように記述します。

float $max = 0.0;
float $min = -30.0;
vector $pos = nParticleShape1.position;

nParticleShape1.opacityPP = smoothstep($min, $max, $pos.y);
if(nParticleShape1.opacityPP == 0)
nParticleShape1.lifespanPP = 0;


ちなみに smoothstep 関数は Hermite 補完アルゴリズムを使って正規化する関数ですね。
線形補間の linstep 関数を使用しても結果はほとんど変わりません。

最後の if 文は無くても一見結果は同じに見えますが
これが無いと透明なだけで dynamics の計算はしっかりとされてしまいますので
完全に透明になったら殺すようにきちんと設定します。

ビュー上では以下の通り。

110825_2.png

レンダリングしても問題なくできています。

110825_3.png

差し当たり想定していたものはできましたが、
今回の一件で Particle についての知識がまだまだ浅いことを思い知らされました。

個人的にこれから Particle や Fluid 関連の仕事が増えそうなので
もっと勉強しなければならないと感じました。
コメント
管理者のみ閲覧可能にする
Profile
HN らい

都内某社テクニカルディレクター
都内某専門学校講師
都内某企業講師
元中国某社S3Dスーパーバイザー
Contact
(ENGLISH OK. 可以用中文。)
Categories
Archives
RSS Link
QR Code