エミッター

emitter コマンド

パーティクルを自動的に発生させるためには emitter コマンドを使用します。
emitter コマンドによって点・面などから発生させたパーティクルのアトリビュートをキーフレームやエクスプレッションによって変化させてアニメーションさせることができます。
また、個々のパーティクルにおける色などのアトリビュートをアニメーションさせたい場合は、 dynExpression を使用します。

emitter コマンドのフラグ

-type string
発生させるパーティクルのタイプを決めます。
タイプ(string)の種類
omni
全方向にパーティクルが発生します。(デフォールト)
direction または dir
ある方向だけにパーティクルが発生します。
-directionX, -directionY, -directionZなどで方向を定める。
surface または surf
オブジェクト(NURBS、ポリゴン)の表面からパーティクルが発生します。
curve または curv
カーブ上またはその近くからパーティクルが発生します。
volume
ある空間領域からパーティクルが発生します。
-directionX float
パーティクルの発生する方向の X 成分を決めます。(-type が direction の場合のみ有効です)
-directionY float
パーティクルの発生する方向の Y 成分を決めます。(-type が direction の場合のみ有効です)
-directionZ float
パーティクルの発生する方向の Z 成分を決めます。(-type が direction の場合のみ有効です)
-minDistance float
パーティクルが発生を始める距離を決めます。
-maxDistance float
パーティクルの発生が終る距離を決めます。
-minDistance から -maxDistance までの距離の間でパーティクルが発生します。
-position float float float
エミッターのワールド座標における位置を定めます。
-rate float
パーティクルを発生させる割合です。
この値が大きいほど発生する個数が増加します。
-spread float
パーティクルを発生させる角度です。(-type が direction の場合のみ有効です)
0.0 から 1.0 の値を指定します。
-speed float
パーティクルの速度です。
もとの速度にこの値を乗じた値が結果の速度になります。 例えば、0.5 にするともとの速度の半分の速度になります。
-normalSpeed float
パーティクルの法線方向の速度です。(-type が surface の場合のみ有効です)
-tangentSpeed float
パーティクルの接線方向の速度です。(-type が surface の場合のみ有効です)
例えば、-normalSpeed floatが 1 で -tangentSpeed float が 0 だとオブジェクトの面と垂直方向にパーティクルが発生します。
逆に、-normalSpeed float が 0 で -tangentSpeed float が 1 だとオブジェクトの面と水平方向にパーティクルが発生します。

emitterコマンドの使用例 1

以下の MEL コマンドをスクリプトエディタに打ち込んで実行すると 3 つのパーティクルが作られ、その 3 つのパーティクルからエミッターによって全方向(omni)にパーティクルが発生します。

particle -p 1 0 0 -p 0 1 0 -p 0 0 1;
string $name[] = `emitter -rate 10 -minDistance 1.5 -maxDistance 2.5`;
particle;
connectDynamic -emitters $name[0];
[makeEmitter2.mel の実行結果]
上図はわかりやすくするためにパーティクルの Particle Render Type アトリビュートを Spheres に変えて表示しています。

スクリプトの解説

particle -p 1 0 0 -p 0 1 0 -p 0 0 1;
この particle コマンドによって作られる 3 つのパーティクルが、 エミッターによってパーティクルの発生源となります。
string $name[] = `emitter -rate 10 -minDistance 1.5 -maxDistance 2.5`;
エミッターによって全方向(omni)に毎秒 10 個の割合で、 エミッターからの距離が 1.5 から 2.5 の間にパーティクルを発生させます。
-type フラグが使用されていないので、 デフォールトの omni が有効になります。
$name に作られたエミッターの名前が代入されます。
particle;
このパーティクルにエミッターがパーティクルを追加してゆきます。
connectDynamic -emitters $name[0];
現在セレクトされているパーティクルをエミッター($name[0])から発生するエミッターとします。
セレクトされているのは直前の particle コマンドで作られたパーティクルです。
このコマンドを実行しないとエミッターが有効になりません。

emitterコマンドの使用例2

以下は、球の表面からパーティクルを発生させて(-type "surface")、 パーティクルと球をエクスプレッションで回転させるスクリプトです。

  1. 以下のプロシージャを makeEmitter1.mel と言う名前でファイルに書き込みます。
    global proc makeEmitter1()
    {
    	string $name[] = `sphere`;
    	scale 5 5 5;
    	expression -object $name[0] -string "ry = 30 * time";
    	string $ename[] = `emitter -type "surface" -normalSpeed 1.0 -tangentSpeed 0.0 -rate 1 $name[0]`;
    	string $pname[] = `particle`;
    	expression -object $pname[0] -string "ry = 30 * time";
    	connectDynamic -emitters $ename $pname[0];
    }
    
  2. File → Source Script で makeEmitter1.mel を読み込みます。
  3. Script Editor で以下のコマンドを実行します。
    makeEmitter1();
    [makeEmitter2.mel の実行結果]

スクリプトの解説

global proc makeEmitter1()
makeEmitter1() というプロシージャーの宣言です。
string $name[] = `sphere`;
NURBS の球を作り、$name に球の名前を代入します。
$name[0] にトランスフォーム・ノード、 $name[1] にインプット・ノードの名前が代入されます。
scale 5 5 5;
球を大きさ(scaleX, scaleY, scaleZ)を 5 にします。
スケールしておかなくても実行に支障はありませんが、 パーティクル発生の様子がよくわかるように球を大きくしておきます。
expression -object $name[0] -string "ry = 30 * time";
作った球($name[0])に対して ry = 30 * time という Y 軸方向に回転させるエクスプレッションを定義しておきます。 これによって、球が 1 秒間に 30 度回転するアニメーションになります。
string $ename[] = `emitter -type "surface" -normalSpeed 1.0 -tangentSpeed 0.0 -rate 1 $name[0]`;
-type "surface" によって NURBS のオブジェクト表面からパーティクルの現れるエミッターを作ります。
作られたエミッターの名前は $ename に代入しておきます。
-normalSpeed 1.0
法線方向のスピードは 1.0 です。
-tangentSpeed 0.0
接線方向のスピードは 0.0 です。
-rate 1
毎秒、単位面積あたり 1 個づつパーティクルが放出されます。
string $pname[] = `particle`;
空のパーティクルを作り、 作られたパーティクルの名前を $pname に代入しておきます。
エミッターによってこのパーティクルオブジェクトにパーティクルが追加されてゆきます。
expression -object $name[0] -string "ry = 30 * time";
$pname[0] で表されるパーティクルに対して ry = 30 * time という Y 軸方向に回転させるエクスプレッションを定義しておきます。 これは、上で球に対して定義したエクスプレッションと同じものです。
connectDynamic -emitters $ename $pname[0];
$pname[0] で表されるパーティクルに対してエミッター($ename)をコネクトします。
これによってエミッターからパーティクルが発生するようになります。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail