エミッター

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`;
エミッターを作成します。
-type フラグが使用されていないので、 デフォールトの omni (全方向)が有効になります。
各フラグの意味は以下のとおりです。
-rate 10
毎秒 10 個の割合で、パーティクルを発生させます。
-minDistance 1.5
エミッターからの距離が、 1.5 より遠い距離でパーティクルが発生します。
-maxDistance 2.5
エミッターからの距離が、 2.5 より近い距離でパーティクルが発生します。
-minDistance-maxDistance によって、 エミッターからの距離が、 1.5 から 2.5 の間の位置にパーティクルを発生させます。

$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. ファイル → ソーススクリプト で makeEmitter1.mel を読み込みます。
  3. スクリプトエディタ のインプットウインドウで以下のコマンドを実行します。
    makeEmitter1();
    [makeEmitter2.mel の実行結果]

スクリプトの解説

global proc makeEmitter1()
makeEmitter1() というプロシージャの宣言です。
string $name[] = `sphere`;
NURBS の球体を作り、$name に球体の名前を代入します。
$name[0] にトランスフォーム・ノード、 $name[1] にインプット・ノードの名前が代入されます。
scale 5 5 5;
球体を大きさ(スケール X, スケール Y, スケール Z)を 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