ダイナミック・エクスプレッション

dynExpressionコマンド

以前説明した パーティクル エミッターによって発生と動きのアニメーションを自動的に行なうことができるが、 同時に個々のパーティクルのアトリビュートを変化させることはできなかった。
そこで、一つ一つのパーティクルのアトリビュートを変化させながら、アニメーションを実行させるには dynExpression コマンドを使用する。
アトリビュートを変化させるエクスプレッションの式には エクスプレッション で説明した frametime などの変数が使用できる。
一つ一つのパーティクルの番号を指定するためには particleId などの変数を使用する。 (最初に作られたパーティクルの番号 particleId は 0 で、以下発生した順に1, 2, 3, ... と番号がついてゆく)

dynExpressionコマンドのフラグ

-string "expression"
エクスプレッションの式を定義する。
-creation
パーティクルが生成される時、エクスプレッションの式を実行する。
-runtime
アニメーションを実行している時、エクスプレッションの式を実行する。

パーティクルのアトリビュート

パーティクルの主なアトリビュートは以下の通りである。

長い名前 (短い名前) デフォールト値 説明
position (pos) vectorArray empty Runtime における個々のパーティクルの位置(ローカル座標)
worldPosition (wps) vectorArray empty Runtime における個々のパーティクルの位置(ワールド座標)
velocity (vel) vectorArray empty Runtime における個々のパーティクルの速度(ローカル座標)
worldVelocity (wvl) vectorArray empty Runtime における個々のパーティクルの速度(ワールド座標)
centroid (ctd) double3 empty パーティクルの平均位置(ローカル座標)
worldCentroid (wctn) double3 empty パーティクルの平均位置(ワールド座標)
acceleration (acc) vectorArray empty Runtime における個々のパーティクルの加速度
age (ag) doubleArray empty 個々のパーティクルの寿命
particleId (id) doubleArray empty 個々のパーティクルの番号
maxCount (mxc) long -1 パーティクルの最大個数
renderType (rt) enum 3 ハードウェアレンダリングの方法
ダイナミックアトリビュートについては dynExpression1.mel の解説を参照のこと。

dynExpressionコマンドの使用例1

パーティクルの色を赤から徐々に黒にしてゆくエクスプレッションを使ったプロシージャー。

  1. 以下のMELスクリプトを dynExpression1.mel という名前で作る。
    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];
    }
    
  2. Script EditorFile → Source Script によって dynExpression1.mel を読み込む。
  3. Script Editor の下のウインドウからdynExpression1();と打ち込んで実行する。
  4. プレイバックする。
    プレイバックさせる時はシェーディング(Flat または Smooth)をかけておかないと色が見えない事に注意すること。
    [dynExpression1(); の実行図]
    上図はわかりやすくするためにパーティクルのParticle Render TypeアトリビュートをSpheresに変えて表示している。

スクリプトの解説

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方向に発生・運動するエミッターを作る。
$ename[0] にエミッターの名前が入る。
string $pname[] = `particle`;
エミッターによって発生させられるパーティクルを作る。
$pname[0] にパーティクルの Transform ノード、 $pname[1] にパーティクルの Shape ノードが入る。
addAttr -longName rgbPP -dataType vectorArray $pname[1];
パーティクルの Shape ノード($pname[1])に dataType (アトリビュートの型)が vectorArray (ベクトルの配列)である rgbPP というアトリビュートを加える。 (PP は Per-Point の略)
この rgbPP はダイナミックアトリビュートと呼ばれるもので、ユーザがパーティクルに追加するまでは存在しない。
rgbPP は MultiPoint、MultiStreak、Points、Spheres、Sprites、および Streak に有効である。
主なダイナミックアトリビュートには以下のようなものがある。
goalPP
パーティクル単位でゴールに追従する度合を指定する。(dataType は doubleArray)
lifespanPP
パーティクル単位でパーティクルが消える時間を指定する。(dataType は doubleArray)
opacityPP
パーティクル単位の透明度を指定する。(dataType は doubleArray)
Numeric、Tube、および Blobby Surface 以外のパーティクルに有効。
radiusPP
パーティクル単位の半径を指定する。(dataType は doubleArray)
Blobby Surface、Cloud、および Sphere のみに有効。
使用例は 半径を変化させる MEL スクリプト を参照すること。
dynExpression -creation -string "rgbPP = << 1.0, 0.0, 0.0 >>;" $pname[1];
パーティクルが発生した時(-creation)の色を赤( << 1.0, 0.0, 0.0 >> )にする。
ここで << 1.0, 0.0, 0.0 >> はベクトルとよばれるもので、色の値や 3 次元空間の座標のように 3 つの数値をひとつにして表したものである。
dynExpression -runtime -string "rgbPP = rgbPP * 0.995;" $pname[1];
アニメーションが進む(-runtime)ごとに色の値に0.995を乗算して色の値を小さくしてゆく。
connectDynamic -emitters $ename $pname[0];
エミッター($ename) とパーティクル($pname) をコネクトしてパーティクルを発生させる。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail