エミッター
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から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;
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;
- このパーティクルがエミッターによってパーティクルの発生源となる。
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];
- 現在セレクトされているパーティクル(すぐ上のparticle)をエミッター($name[0])から発生するエミッターとする。
emitterコマンドの使用例2
以下のMELスクリプトをmakeEmitter1.melというファイルに書き込んで実行できるようにせよ。
このスクリプトは球の表面からパーティクルを発生させて(-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();
スクリプトの解説
string $name[] = `sphere`;
- NURBSの球を作り、$nameに球の名前を代入しておく。
$name[0] にトランスフォーム・ノード、
$name[1] にインプット・ノードの名前が入る。
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に入れておく。
-
-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