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

dynExpression コマンド

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

dynExpression コマンドのフラグ

-string expression
エクスプレッションの式 expression を文字列で定義します。
-creation
パーティクルの生成時に、エクスプレッションの式を実行します。
-runtimeBeforeDynamics
パーティクルの生成後、ダイナミクスが実行される前にエクスプレッションの式を実行します。
-runtimeAfterDynamics
パーティクルの生成後、ダイナミクスが実行された後でエクスプレッションの式を実行します。

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

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

長い名前 (短い名前) デフォールト値 説明
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 -runtimeAfterDynamics -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 に変えて表示しています。

スクリプトの解説

global proc dynExpression1()
dynExpression1() というプロシージャーの宣言です。
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] にパーティクルオブジェクトのトランスフォームノード、 $pname[1] にパーティクルオブジェクトのシェープノードが代入されます。
addAttr -longName rgbPP -dataType vectorArray $pname[1];
パーティクルのシェープノード $pname[1] にアトリビュートの型 dataType がベクトルの配列 vectorArray である rgbPP というアトリビュートを追加します。 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 フラグがついているので、 パーティクルが発生した時に -string の後ろのエクスプレッションの式 "rgbPP = << 1.0, 0.0, 0.0 >>;" が実行されます。 この式によってパーティクルの色を最初、 赤( << 1.0, 0.0, 0.0 >> )にします。
ここで << 1.0, 0.0, 0.0 >> はベクトルとよばれるもので、 色の値のような 3 つの数値をひとつにして表したものです。 << と >> 間の 3 つの数値が、 それぞれ赤・緑・青を表します。 最小値 0.0、最大値 1.0 です。
dynExpression -runtimeAfterDynamics -string "rgbPP = rgbPP * 0.995;" $pname[1];
-runtimeAfterDynamics フラグがついているので、 アニメーションが 1 フレーム進むごとにダイナミクスが実行された後に -string の後ろのエクスプレッションの式 "rgbPP = rgbPP * 0.995;" が実行されます。
ベクトル rbgPP に 0.995 を乗算すると、 3 つの数値それぞれに 0.995 が乗算されます。 この場合、緑と青の数値は最初から 0.0 なので、 赤の値 1.0 が 1 フレームごとに 0.995 が乗算されて少しづつ小さい値になってゆきます。
1 フレーム目 << 1.0, 0.0, 0.0 >> * 0.995<< 0.995, 0.0, 0.0 >>
2 フレーム目 << 0.995, 0.0, 0.0 >> * 0.995<< 0.990, 0.0, 0.0 >>
3 フレーム目 << 0.990, 0.0, 0.0 >> * 0.995<< 0.985, 0.0, 0.0 >>
connectDynamic -emitters $ename $pname[0];
エミッター $ename とパーティクル $pname をコネクトしてパーティクルを発生させます。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail