ダイナミック・エクスプレッション
dynExpression コマンド
パーティクル は、
エミッターによって発生と動きのアニメーションを自動的に行なうことができますが、
同時に個々のパーティクルのアトリビュートを変化させることはできません。
そこで、 1 つ 1 つのパーティクルのアトリビュートを変化させながら、
アニメーションを実行させるには dynExpression コマンドを使用します。
アトリビュートを変化させるエクスプレッションの式には、
エクスプレッション
で説明した frame や time などのキーワードが使用できます。
それ以外に、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
エミッターから発生したパーティクルの色を、
赤から徐々に黒にしてゆくダイナミック・エクスプレッションを作成してみましょう。
- 以下の 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();と打ち込んで実行します。
- プレイバックを実行します。
プレイバックさせる時はシェーディング(フラット または スムース)をかけておかないと色が見えない事に注意してください。
上図はわかりやすくするためにパーティクルの パーティクルのレンダータイプ アトリビュートを 球体 に変えて表示しています。
スクリプトの解説
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 をコネクトしてパーティクルを発生させます。
練習
- 上の 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