フィールド

フィールドとは

フィールドを使うことによっては、 自然界にある様々な力をシュミレートしてアニメーションを実行することができます。
フィールドは、ソフトボディ・リジッドボディ・パーティクルに作用します。 ソフトボディ・リジッドボディについての詳しいことは、 マニュアルまたは、他の章を参照してください。
MEL において、オブジェクトにフィールドを作用させるためには、 以下のコマンドでパーティクル・ソフトボディ・リジッドボディなどにコネクトする必要があります。
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 に変えて表示しています。

スクリプトの解説

global proc makeField1()
makeField1() というプロシージャーの宣言です。
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] にパーティクルのトランスフォームノード、 $ename[1] にエミッターノードの名前が代入されます。
string $pname[] = `particle`;
emitter によってパーティクルが追加されてゆくパーティクルオブジェクトを作ります。
$pname[0]にパーティクルのトランスフォームノード、 $pname[1]にパーティクルのシェープノードが代入されます。
connectDynamic -emitters $ename[0] $pname[0];
エミッター($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 フィールドの力の届く範囲は、 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[0])をパーティクル($pname[0])にコネクトします。 これでパーティクルが 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 だと距離に関係なく力は一定になります。 (デフォールトの値は 0 です)
connectDynamic -fields $nname[0] $pname[0];
newton フィールド($nname)をパーティクル($pname)にコネクトします。 これでエミッターによって作られたパーティクルが newton フィールドによって影響されるようになります。

その他のフィールドの使用例

gravity コマンドの使用例

global proc makeGravity()
{
	string $ename[] = `emitter -pos 0 0 0 -type "direction" -dx 0 -dy 1 -dz 0 -spread 0.2 -speed 15.0 -rate 100`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8 -dx 0 -dy -1 -dz 0`;
	connectDynamic -f $gname[0] $pname[0];
}

dragコマンドの使用例

global proc makeDrag()
{
	string $ename[] = `emitter -pos 0 0 0 -type "direction" -dx 0 -dy 1 -dz 0 -spread 0.2 -rate 3`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	string $dname[] = `drag -pos 0 0 0 -magnitude 0.3 -dx 0 -dy 1 -dz 0`;
	connectDynamic -f $dname[0] $pname[0];
}

radialコマンドの使用例

global proc makeRadial()
{
	string $ename[] = `emitter -pos 0 0 0 -type "direction" -dx 0 -dy 1 -dz 0 -spread 0.2 -rate 3`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	string $rname[] = `radial -pos -2 5 0 -magnitude -2.0 -maxDistance 3.0`;
	connectDynamic -f $rname[0] $pname[0];
}

turbulenceコマンドの使用例

global proc makeTurbulence()
{
	string $ename[] = `emitter -pos 0 0 0 -type "direction" -dx 0 -dy 1 -dz 0 -spread 0.2 -rate 3`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	string $tname[] = `turbulence -pos 0 5 0 -magnitude 2.0 -maxDistance 3.0`;
	connectDynamic -f $tname[0] $pname[0];
}

uniformコマンドの使用例

global proc makeUniform()
{
	string $ename[] = `emitter -pos 0 0 0 -type "direction" -dx 0 -dy 1 -dz 0 -spread 0.2 -rate 3`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0] $pname[0];
	string $uanme[] = `uniform -pos -2 5 0 -magnitude 2.0 -maxDistance 3.0`;
	connectDynamic -f $uanme[0] $pname[0];
}

vortexコマンドの使用例

global proc makeVortex()
{
	string $ename[0] = `emitter -pos 0 0 0 -type "direction" -dx 0 -dy 1 -dz 0 -spread 0.2 -rate 50`;
	string $pname[] = `particle`;
	connectDynamic -emitters $ename[0];
	string $vname[] = `vortex -pos 0 0 0 -magnitude 0.15 -maxDistance 30.0 -ax 0 -ay 1.0 -az 0`;
	connectDynamic -f $vname[0] $pname[0];
}

練習

練習課題

参考


Prev | Next
Home | Contents
Mail