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

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 の解説を参照してください。
上の表にある、doubleArray や vectorArray は実数やベクトルの配列を表します。

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. スクリプト エディタファイル → ソーススクリプト によって dynExpression1.mel を読み込みます。
  3. スクリプト エディタ のインプットウインドウにdynExpression1();と打ち込んで実行します。
  4. プレイバックを実行します。
    プレイバックさせる時はシェーディング(フラット または スムース)をかけておかないと色が見えない事に注意してください。
    [dynExpression1(); の実行図]
    上図はわかりやすくするためにパーティクルの パーティクルのレンダータイプ アトリビュートを 球体 に変えて表示しています。

スクリプトの解説

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] に、 rgbPP というアトリビュートを追加します。
rgbPP は、アトリビュートの型 dataType がベクトルの配列 vectorArray です。
rgbPP アトリビュートの PP は Per-Point の略です。
この rgbPP はダイナミックアトリビュートと呼ばれるもので、 パーティクルに追加されるまでは存在しません。
rgbPP は、 レンダータイプが マルチポイント、マルチストリーク、ポイント、球体、スプライト、および ストリーク の場合に有効です。
主なダイナミックアトリビュートには、以下のようなものがあります。
goalPP
パーティクル単位で、ゴールに追従する度合を指定 (dataType は doubleArray)
lifespanPP
パーティクル単位で、パーティクルが消える時間を指定 (dataType は doubleArray)
opacityPP
パーティクル単位の透明度を指定 (dataType は doubleArray)
数値、チューブ、および メタボール サーフェス 以外のパーティクルに有効です。
radiusPP
パーティクル単位の半径を指定 (dataType は doubleArray)
メタボール サーフェス、クラウド、および 球体 のみに有効です。
使用例は 半径を変化させる MEL スクリプト を参照してください。
dynExpression -creation -string "rgbPP = << 1.0, 0.0, 0.0 >>;" $pname[1];
パーティクルが発生した直後に実行するエクスプレッションの式を定義します。
実行される式は -string の右の "rgbPP = << 1.0, 0.0, 0.0 >>;" です。 この式によって、パーティクルの色をエミッターから発生した直後に 赤( << 1.0, 0.0, 0.0 >> )にします。
ここで << 1.0, 0.0, 0.0 >> はベクトルとよばれるもので、 色の値や座標値のような 3 つの数値を 1 つにして表したものです。 << と >> 間の 3 つの数値が、 それぞれ赤・緑・青を表します。 色の値は、最小値 0.0、最大値 1.0 です。
dynExpression -runtimeAfterDynamics -string "rgbPP = rgbPP * 0.995;" $pname[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