フィールド

フィールドとは

フィールドによって、 自然界にある様々な力をシュミレートして、アニメーションさせることができます。
フィールドは、ソフトボディ・リジッドボディ・パーティクルに作用します。 ソフトボディ・リジッドボディについての詳しいことは、 Maya ヘルプまたは、他の章を参照してください。
MEL において、オブジェクトにフィールドを作用させるためには、 以下のコマンドでパーティクル・ソフトボディ・リジッドボディなどにコネクトする必要があります。
connectDynamic -fields フィールド名 オブジェクト名

フィールドの種類

フィールドの使用例 (大気)

エミッターから発生するパーティクルが、 大気 フィールドによって飛ばされるアニメーションを、 以下のプロシージャによって作ってみましょう。

  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. スクリプト エディタファイル → ソース スクリプト によって makeField1.mel を読み込みます。
  3. スクリプト エディタ のインプットウインドウに makeField1(); と打ち込んで実行します。
  4. プレイバックしてアニメーションを実行します。
    [makeField1.mel の実行図]
    上図は、わかりやすくするために、 パーティクルの レンダータイプ アトリビュートを 球体 に変えて表示しています。

スクリプトの解説

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] にエミッターノードの名前が代入されます。
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`;
スタンドアローンフィールドの 大気 フィールド作ります。
作られた 大気 フィールドの名前を $aname[0] に代入しておきます。
各フラグの意味は、以下の通りです。
-pos 3 0 0
位置は(3, 0, 0)です。
-maxDistance 5.0
大気 フィールドの力の届く範囲は、 大気 フィールドから 5.0 の距離までになります。
この値が -1 であれば、 コネクトされているすべてのパーティクルに 大気 の影響がおよぶようになります。
-magnitude 1.0
大気 フィールドの力の強さです。
-dx -1.0 -dy 0.0 -dz 0.0
大気 フィールド の力の方向です。
ここでは、 X 軸に平行でマイナス方向です。
connectDynamic -fields $aname[0] $pname[0];
大気 フィールド($aname[0])をパーティクル($pname[0])にコネクトします。 これで、パーティクルが 大気 フィールドによって影響されるようになります。

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

エミッターから発生するパーティクルが、 NURBS プレーン の中に吸い込まれてゆくアニメーションを作ってみましょう。

  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. スクリプト エディタファイル → ソース スクリプト によって makeField2.mel を読み込みます。
  3. スクリプト エディタ の下のウインドウから makeField2(); と打ち込んで実行します。
  4. プレイバックしてアニメーションを実行します。
    [makeField2.mel の実行図]
    上図は、 わかりやすくするためにパーティクルの レンダータイプ アトリビュートを 球体 に変えて表示しています。

スクリプトの解説

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

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

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

以下に、air と 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