フィールド

フィールドとは

フィールドによって自然界にある様々な力をシュミレートしてアニメーションを実行することができる。
作られたフィールドは connectDynamic -fields によってパーティクル・ソフトボディ・リジッドボディなどにコネクトする。

フィールドの種類

フィールドの使用例 (air)

以下のプロシージャーによってエミッターから発生するパーティクルがairフィールドによって飛ばされる。

  1. 以下のMELスクリプトをmakeField1.melという名前で作る。
    global proc makeField1()
    {
    	particle -p 0 5 0;
    	string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;
    	string $pname[] = `particle`;
    	connectDynamic -emitters $ename[0] $pname[0];
    	string $aname[] = `air -pos 3 0 0 -maxDistance 5.0 -magnitude 1.0 -dx -1.0 -dy 0.0 -dz 0.0`;
    	connectDynamic -fields $aname[0] $pname[0];
    }
    
  2. Script EditorFile → Source Script によって makeField1.mel を読み込む。
  3. Script Editor の下のウインドウから makeField1(); と打ち込んで実行する。
  4. プレイバックしてアニメーションを実行する。
    [makeField1.mel の実行図]
    上図はわかりやすくするためにパーティクルの Particle Render Type アトリビュートを Spheres に変えて表示している。

スクリプトの解説

particle -p 0 5 0;
パーティクルを(0, 5, 0)の位置に作る。 (パーティクルの発生源)
string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;
そのパーティクルに対してY軸に対して下方向に発生・運動するエミッターを作り、作られたエミッターの名前を $ename (配列)に代入する。
$ename[0] にエミッターの名前が入る。
string $pname[] = `particle`;
emitterによって発生させられるパーティクルを作る。
$pname[0]にパーティクルの Transform ノード、 $pname[1]にパーティクルの Shape ノードが入る。
connectDynamic -emitters $ename[0] $pname[0]; emitter($ename[0]) とパーティクル($pname[0])をコネクトする。 これでエミッターからパーティクルを発生するようになる。
string $aname[] = `air -pos 3 0 0 -maxDistance 5.0 -magnitude 1.0 -dx -1.0 -dy 0.0 -dz 0.0`;
air フィールド作る。(スタンドアローンフィールド)
作られた air フィールドの名前を $aname[0] に代入しておく。
各フラグの意味は以下の通り。
-pos 3 0 0
位置は3 0 0
-maxDistance 5.0
air の届く範囲は5.0の距離まで
(この値が -1 であればコネクトされているすべてのパーティクルに air の影響がおよぶ)
-magnitude 1.0
airのスピード
-dx -1.0 -dy 0.0 -dz 0.0
-magnitude の方向 (X軸に平行でマイナス方向)
connectDynamic -fields $aname[0] $pname[0];
air フィールド($aname)をパーティクル($pname)にコネクトする。 これでパーティクルが air フィールドによって影響されるようになる。

フィールドの使用例(newton)

以下のプロシージャーによってエミッターから発生するパーティクルが newton フィールドによって nurbsPlane の中に吸い込まれてゆく。

  1. 以下のMELスクリプトを makeField2.mel という名前で作る。
    global proc makeField2()
    {
    	particle -p 5 10 0;
    	string $ename[] = `emitter -type "direction" -dx 0.0 -dy -1.0 -dz 0.0 -spread 0.2 -rate 3`;
    	string $pname[] = `particle`;
    	connectDynamic -emitters $ename[0] $pname[0];
    	nurbsPlane;
    	scale 0 10 10;
    	string $nname[] = `newton -magnitude 1.0 -maxDistance 8.0 -attenuation 0.98`;
    	connectDynamic -fields $nname[0] $pname[0];
    }
    
  2. Script EditorFile → Source Script によって makeField2.mel を読み込む。
  3. Script Editor の下のウインドウから makeField2(); と打ち込んで実行する。
  4. プレイバックしてアニメーションを実行する。
    [makeField2.mel の実行図]
    上図はわかりやすくするためにパーティクルの Particle Render Type アトリビュートを Spheres に変えて表示している。

スクリプトの解説

スクリプトの前半はmakeField1.melと同じなので、後半のみ解説する。

nurbsPlane;
フィールドを追加するための nurbsPlane を作る。
scale 0 10 10;
アニメーションを見やすくするために、適当にスケールをかける。
string $nname[] = `newton -magnitude 1.0 -maxDistance 8.0 -attenuation 0.98`;
nurbsPlane に属するフィールドを作成する。(オブジェクトフィールド)
nurbsPlane はセレクトされた状態なので名前を指定する必要は無い。
各フラグの意味は以下の通り。
-magnitude 1.0
フィールドの強さは 1.0
-maxDistance 8.0
フィールドの作用する距離が 8.0
-attenuation 0.98
フィールドとパーティクルの距離が大きくなるに従って 0.98 乗づつ強さが小さくなる。
この値が 0 だと距離に関係なく力は一定になる。
connectDynamic -fields $nname[0] $pname[0];
newton フィールド($nname)をパーティクル($pname)にコネクトする。 これでエミッターによって作られたパーティクルが newton フィールドによって影響されるようになる。

練習

練習課題

参考


Prev | Next
Home | Contents
Mail