以前説明した パーティクル はエミッターによって発生と動きのアニメーションを自動的に行なうことができるが、
同時に個々のパーティクルのアトリビュートを変化させることはできなかった。
そこで、一つ一つのパーティクルのアトリビュートを変化させながら、アニメーションを実行させるにはdynExpressionコマンドを使用する。
アトリビュートを変化させるエクスプレッションの式には
エクスプレッション
で説明したframeやtimeなどの変数が使用できる。
一つ一つのパーティクルの番号を指定するためにはparticleIdなどの変数を使用する。
(最初に作られたパーティクルの番号particleIdは0で、以下発生した順に1, 2, 3, ... と番号がついてゆく)
パーティクルの主なアトリビュートは以下の通りである。
長い名前 (短い名前) | 型 | デフォールト値 | 説明 |
---|---|---|---|
position (pos) | vectorArray | empty | Runtime における個々のパーティクルの位置 |
velocity (vel) | vectorArray | empty | Runtime における個々のパーティクルの速度 |
acceleration (acc) | vectorArray | empty | Runtime における個々のパーティクルの加速度 |
age (ag) | doubleArray | empty | 個々のパーティクルの寿命 |
particleId (id) | doubleArray | empty | 個々のパーティクルの番号 |
maxCount (mxc) | long | -1 | パーティクルの最大個数 |
renderType (rt) | enum | 3 | ハードウェアレンダリングの方法 |
パーティクルの色を赤から徐々に黒にしてゆくエクスプレッションを使ったプロシージャー。
global proc dynExpression1()
{
particle -p 0 0 0;
string $ename[] = `emitter -type "direction" -dx 0.0 -dy 1.0 -dz 0.0 -spread 0.5 -rate 10`;
string $pname[] = `particle`;
addAttr -longName rgbPP -dataType vectorArray $pname[1];
dynExpression -creation -string "rgbPP = << 1.0, 0.0, 0.0 >>;" $pname[1];
dynExpression -runtime -string "rgbPP = rgbPP * 0.995;" $pname[1];
connectDynamic -emitters $ename $pname[0];
}
particle -p 0 0 0;
パーティクルを(0, 0, 0)の位置に作る。
(パーティクルの発生源)
string $ename[] = `emitter -type "direction" -dx 0.0 -dy 1.0 -dz 0.0 -spread 0.5 -rate 10`;
そのパーティクルに対してY方向に発生・運動するエミッターを作る。
string $pname[] = `particle`;
emitterによって発生されるパーティクルを作る。
addAttr -longName rgbPP -dataType vectorArray $pname[1];
パーティクルのShapeノード($pname[1])にrgbPP(型はベクトル)というアトリビュートを加える。
(PPはPer-Pointの略)
dynExpression -creation -string "rgbPP = << 1.0, 0.0, 0.0 >>;" $pname[1];
パーティクルが発生した時(-creation)の色を赤( << 1.0, 0.0, 0.0 >> )にする。
dynExpression -runtime -string "rgbPP = rgbPP * 0.995;" $pname[1];
アニメーションが進むたび(-runtime)に色の値に0.995を乗算して色の値を小さくしてゆく。
connectDynamic -emitters $ename $pname[0];
エミッター($ename)とパーティクル($pname)をコネクトしてパーティクルを発生させる。