スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
今アルバイト先で深海のシーンを作っています。

特定の時間でうまくループできるように
水中の塵を表現する必要があったので
今まであまり縁の無かった Particle expression について調べました。

Particle expression ではループ関数などを使わなくても
(もともと Expression 内 でループは回せませんが)、
各 Particle 毎に1つずつ適用してくれます。

また、Particle expression の中でも Creation expression と Runtime expression の
2種類があり、これらを上手に使い分ける事で様々な事ができます。

本日作ったものがこちらです。
解り易くするために Particle の数を極端に減らすなどしています。


createLoopParticles;

global proc createLoopParticles()
{
currentUnit -t "ntsc";
playbackOptions -e -min 1 -max 120 -ps 0 -mps 1;
currentTime 1;

string $par[] = `particle -jbp 0 0 0 -nj 100 -jr 12 -c 1`;
setAttr ($par[1] + ".particleRenderType") 4;

addAttr -ln userScalar1PP -dt doubleArray $par[1];
addAttr -ln "opacityPP" -dt doubleArray $par[1];

dynExpression -c -s
("int $startFrame =`playbackOptions -q -min`;\n" +
"int $endFrame = `playbackOptions -q -max`;\n\n" +
"seed(" + $par[1] + ".particleId);\n\n" +
$par[1] + ".velocity = sphrand(5)\n;" +
$par[1] + ".position = <<rand(-12, 12), rand(-12, 12), rand(-12, 12)>>;\n" +
$par[1] + ".userScalar1PP = int(rand($startFrame, $endFrame));") $par[1];

dynExpression -rbd -s
("float $playbackSpan=(`playbackOptions -q -max` - `playbackOptions -q -min`)/30;\n\n" +
"if(" + $par[1] + ".userScalar1PP == frame) " + $par[1]
+ ".position -= (" + $par[1] + ".velocity * $playbackSpan);\n" +
"if(" + $par[1] + ".userScalar1PP-20 < frame && frame < " + $par[1]
+ ".userScalar1PP) " + $par[1] + ".opacityPP -=0.05;" +
"if(" + $par[1] + ".userScalar1PP < frame && frame < " + $par[1]
+ ".userScalar1PP+20) " + $par[1] + ".opacityPP +=0.05;") $par[1];
}

実行し、Smooth shade 表示で再生してみてください。
パーティクルがうまくループするハズです。


当初は Creation expression で、
Seed を使用せずに Velocity と Position に値を格納していきました。
もちろん出力毎に結果は異なりますが、レンダリングをすればうまくループします。

しかし今回は多視点による立体ディスプレイのプロモーション映像なので、
カメラ毎に異なる Seed でランダム関数が回ると異なる結果になってしまうこの方法は
多視点でのレンダリングに対応しない事に気がつきました。

そこで Seed を固定しようと思い、単純に seed(1) などと入力しようとしましたが
当然それでは全ての Particle がこの Seed になるためランダムに配置されません。

調べてみると『particleId』という内部の変数があり、
これを使用すると Particle 毎に編集ができるとの事でした。
(かなり基本的な事なのだと思いますが、何せ Particle Expression は
今回が殆ど初めてなので、知りませんでした。。)
使用法は time や frame と同じように、
ドル記号($)をつけずに文中に置くだけで良いようです。

これは生成された順に Particle 毎に割り当てられた 0, 1, 2 …という個体値だとの事です。
これが解れば話は簡単でした。
最初から Particle 毎に異なる値をもっているのならそれを Seed にすればいいのだと思い、
上記の通り seed(particleId) という形にして完成しました。

欲を言えば動きに不規則性が欲しかったところではありますが、
実際に 4000 もの Particle を深海シーンに置いてみたところ
それらしく見える事ができたのでひとまずOKとしました。

Particle Expression は発想次第ではかなり面白い事ができそうなので
もう少し理解を深めてみたいです。
コメント
管理者のみ閲覧可能にする
Profile
HN らい

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