エミッター

emitterコマンド

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

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

スクリプトの解説

particle -p 1 0 0 -p 0 1 0 -p 0 0 1;
このパーティクルがエミッターによってパーティクルの発生源となる。
$name = `emitter -rate 10 -minDistance 1.5 -maxDistance 2.5`;
エミッターによって全方向(omni)に10の割合で1.5から2.5の間にパーティクルを発生させる。
$nameに作られたエミッターの名前が入る。
particle;
このパーティクルがエミッターによって発生させられるパーティクルになる。
connectDynamic -emitters $name;
現在セレクトされているパーティクル(すぐ上のparticle)をエミッター($name)から発生するエミッターとする。

emitterコマンドの使用例2

以下のMELスクリプトをmakeEmitter1.melというファイルに書き込んで実行できるようにせよ。
このスクリプトは球の表面からパーティクルを発生させて(-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 の実行結果]

スクリプトの解説

string $name[] = `sphere`;
NURBSの球を作り、$nameに球の名前を代入しておく。
scale 5 5 5;
球を大きさ(スケール)を5にしておく。
スケールしておかなくても良いのだが、パーティクル発生の様子がよくわかるように球を大きくしておく。
expression -object $name[0] -string "ry = 30 * time";
$name[0]で表される球に対してry = 30 * timeというY軸方向に回転させるエクスプレッションを定義しておく。
string $ename[] = `emitter -type "surface" -normalSpeed 1.0 -tangentSpeed 0.0 -rate 1 $name[0]`;
-type "surface"によってNURBSのオブジェクト表面からパーティクルの現れるエミッターを作る。
作られたエミッターの名前を$enameに入れておく。
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
abe@injapan.net