フィールドによって、
自然界にある様々な力をシュミレートして、アニメーションさせることができます。
フィールドは、ソフトボディ・リジッドボディ・パーティクルに作用します。
ソフトボディ・リジッドボディについての詳しいことは、
Maya ヘルプまたは、他の章を参照してください。
MEL において、オブジェクトにフィールドを作用させるためには、
以下のコマンドでパーティクル・ソフトボディ・リジッドボディなどにコネクトする必要があります。
connectDynamic -fields フィールド名 オブジェクト名
エミッターから発生するパーティクルが、 大気 フィールドによって飛ばされるアニメーションを、 以下のプロシージャによって作ってみましょう。
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];
}
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];
エミッターから発生するパーティクルが、 NURBS プレーン の中に吸い込まれてゆくアニメーションを作ってみましょう。
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];
}
スクリプトの前半は makeField1.mel と同じなので、後半のみ解説します。
nurbsPlane;
scale 0 10 10;
string $nname[] = `newton -magnitude 1.0 -maxDistance 8.0 -attenuation 0.98`;
connectDynamic -fields $nname[0] $pname[0];
以下に、air と newton 以外のフィールドの作成例を挙げておきます。
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];
}
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];
}
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];
}
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];
}
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];
}
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];
}