エミッター
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];
上図はわかりやすくするためにパーティクルの 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")、
パーティクルと球をエクスプレッションで回転させるスクリプトです。
- 以下のプロシージャを 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];
}
- で makeEmitter1.mel を読み込みます。
- で以下のコマンドを実行します。
makeEmitter1();
スクリプトの解説
-
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)をコネクトします。
これによってエミッターからパーティクルが発生するようになります。
練習
- makeEmitter1.mel を参考にし makeEmitter2.mel をつくり、NURBS の球の代わりにセレクトされているオブジェクトの表面からパーティクルが発生するようにしてください。
なお、セレクトされているオブジェクトはスケールしておく必要はありません。
(使用例)
- 適当にオブジェクト(NURBS、ポリゴン)を作って、そのうちのいくつかをセレクトしておきます。
- makeEmitter2.mel をスクリプトエディタに読み込みます。
- makeEmitter2();をスクリプトエディタで実行します。
- プレイバックします。
セレクトされていたオブジェクトからエミッターによってパーティクルが発生します。
(問題点)
この makeEmitter2 は、ただ各オブジェクトにエミッターをつけただけなので
各オブジェクトと発生するパーティクルの回転の中心がずれています。
だからパーティクルが風に流されているように見えます。
練習課題
参考
Prev | Next
Home | Contents
Mail