ダイナミック・エクスプレッション
dynExpression コマンド
パーティクル は、
エミッターによって発生と動きのアニメーションを自動的に行なうことができますが、
同時に個々のパーティクルのアトリビュートを変化させることはできません。
そこで、 1 つ 1 つのパーティクルのアトリビュートを変化させながら、
アニメーションを実行させるには dynExpression コマンドを使用します。
アトリビュートを変化させるエクスプレッションの式には
エクスプレッション
で説明した frame や time などの変数が使用できます。
1 つ1 つのパーティクルの番号を指定するためには particleId などの変数を使用します。
最初に作られたパーティクルの番号 particleId は 0 で、
以下発生した順に 1, 2, 3, ... と番号がついてゆきます。
dynExpression コマンドのフラグ
jDT>-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
エミッターから発生したパーティクルの色を、
赤から徐々に黒にしてゆくダイナミック・エクスプレッションを使ったプロシージャーを作ってみましょう。
- 以下の 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];
}
- の によって dynExpression1.mel を読み込みます。
- の下のウインドウからdynExpression1();と打ち込んで実行します。
- プレイバックを実行します。
プレイバックさせる時はシェーディング(Flat または Smooth)をかけておかないと色が見えない事に注意してください。
上図はわかりやすくするためにパーティクルの 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 をコネクトしてパーティクルを発生させます。
練習
- 上の dynExpression1.mel を参考にして、dynExpression2.mel を作り引数によって最初の色を指定できるようにしてください。
(プロシージャーの名前と引数)
dynExpression2(float 赤, float 緑, float 青);
(使用例)
dynExpression2(0.0, 0.0, 1.0);
最初、青色から黒色に変化してゆきます。
dynExpression2(1.0, 1.0, 0.0);
最初、黄色から黒色に変化してゆきます。
練習課題
参考
Prev | Next
Home | Contents
Mail