パーティクルインスタンス MEL スクリプト

MEL スクリプトの例

パーティクルのインスタンスの制作手順を、 MEL スクリプトで自動化してみましょう。

  1. 以下の MEL スクリプトを makeInstance1.mel という名前で作ります。
    proc string makeBrush()
    {
    	source "C:/Program Files/Autodesk/Maya8.5/brushes/feathers/featherWhite.mel";
    	string $sname = `stroke -s 0`;
    	string $bname[] = `duplicate -un featherWhite`;
    	brushStartSetup $bname[0] 1;
    	connectAttr ($bname[0] + ".outBrush") ($sname + ".brush");
    	connectAttr time1.outTime ($bname[0] + ".time");
    	string $cname = `curve -d 3 -p -0 -0 0 -p 0.2 0.2 0 -p 0.4 0.6 0 -p 0.6 0.4 0 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1`;
    	connectAttr  ($cname + ".ws") ($sname + ".pathCurve[0].curve");
    	setAttr ($sname + ".pathCurve[0].samples") 7 ;
    	setAttr ($sname + ".pathCurve[0].opposite") false  ;
    	setAttr ($bname[0] + ".globalScale") 2;
    	return $sname;
    }
    global proc makeInstance1()
    {
    	string $oname = makeBrush();
    
    	polyPlane -sw 5 -sh 5;
    	scale 20 20 20;
    	string $ename[] = `emitter -type direction -r 1 -dx 0 -dy -1 -dz 0 -speed 5 -speedRandom 5`;
    	string $pname[] = `particle`;
    	connectDynamic -em $ename[1] $pname[0]; 
    	particleInstancer -addObject -object $oname $pname[1];
    
    	select $pname[0];
    	string $aname[] = `air -pos 0 0 0 -m 20 -att 1 -dx 1 -dy -1 -dz 0 -s 5 -mxd 20`;
    	connectDynamic -f $aname[0] $pname[0];
    }
    
  2. Script EditorFile → Source Script によって makeInstance1.mel を読み込みます。
  3. Script Editor のインプットウインドウで、makeInstance1() を実行します。
    (makeInstance1() 実行後の図)
    [makeInstance1() 実行後の図]
  4. アニメーションを実行します。
    [アニメーション実行後の図]
    [レンダリング結果]

スクリプトの解説

proc string makeBrush()
makeBrush というプロシージャの宣言です。
このプロシージャは string がついているので文字列を返します。 返される名前はストロークの名前です。 また、この MEL スクリプト内のみで使用する前提なので、 global がついていません。
source "C:/Program Files/Autodesk/Maya8.5/brushes/feathers/featherWhite.mel";
featherWhite を作成する MEL プロシージャを読み込みます。
string $sname = `stroke -s 0`;
ペイントエフェクトのためのストロークを作成します。
$sname には strokeFeatherWhite1 などの作成されたストロークの名前が入ります。
string $bname[] = `duplicate -un featherWhite`;
featherWhite.mel によって作成されたブラシを複製します。
複製されたブラシの名前を $bname に代入します。
brushStartSetup $bname[0] 1;
brushStartSetup というプロシージャを使用して、 複製されたブラシをセットアップします。
プロシージャ brushStartSetup は MEL スクリプト C:/Program Files/Autodesk/Maya8.5/scripts/paintEffects/brushStartSetup.mel にあります。
connectAttr ($bname[0] + ".outBrush") ($sname + ".brush");
ブラシのアトリビュート outBrush とストロークのアトリビュート brush を接続します。
connectAttr time1.outTime ($bname[0] + ".time");
time ノードのアトリビュート outTime とブラシのアトリビュート time を接続します。
string $cname = `curve -d 3 -p -0 -0 0 -p 0.2 0.2 0 -p 0.4 0.6 0 -p 0.6 0.4 0 -k 0 -k 0 -k 0 -k 1 -k 1 -k 1`;
ストロークのための NURBS カーブを作成します。
connectAttr ($cname + ".ws") ($sname + ".pathCurve[0].curve");
NURBS カーブのアトリビュート ws とストロークのアトリビュート pathCurve[0].curve を接続します。
setAttr ($sname + ".pathCurve[0].samples") 7 ;
ストロークのアトリビュート pathCurve[0].samples に 7 を設定します。
setAttr ($sname + ".pathCurve[0].opposite") false ;
ストロークのアトリビュート pathCurve[0].opposite に false を設定します。
setAttr ($bname[0] + ".globalScale") 2;
ブラシのアトリビュート globalScale に 2 を設定します。
この数値は、作成されたブラシを見て適当な数値に変更します。
return $sname;
このプロシージャで作成されたストロークの名前を返します。
global proc makeInstance1()
makeInstance1 というプロシージャの宣言です。
string $oname = makeBrush();
上で定義された makeBrush を使用してストロークとブラシを作成し、 作成されたストロークの名前を変数 $oname に代入します。
(注意)
このプロシージャ makeBrush をほかのプロシージャに置き換えれば、 そのプロシージャで作成されるオブジェクトがインスタンスになります。 そのとき、そのプロシージャは 作成されたオブジェクトの名前を返すプロシージャである必要があります。
polyPlane -sw 5 -sh 5;
パーティクルを発生させる元になるポリゴン平面を作成します。
-sw
X 方向の分割数
-sx (-subdivisionsX)でも有効です。
-sh
Y 方向の分割数
-sy (-subdivisionsY)でも有効です。
scale 20 20 20;
ポリゴン平面の scaleX, scaleY, scaleZ を 20, 20, 20 にします。
string $ename[] = `emitter -type direction -r 1 -dx 0 -dy -1 -dz 0 -speed 5 -speedRandom 5`;
ポリゴン平面にエミッターを作成します。
ポリゴンの頂点からパーティクルが発生するようになります。
変数 $ename[0] にはポリゴン平面の名前、 $ename[1] にはエミッターの名前が入ります。
-type direction
エミッターのタイプを direction にします。 これによって一方向へパーティクルが発生します。
-r 1
パーティクルを発生させる割合を 1 秒に 1 頂点あたり 1 個に設定します。
-dx 0 -dy -1 -dz 0
パーティクルが放出される方向を (0, -1, 0) にします。
-speed 5
パーティクルのスピードを 5 に設定します。
-speedRandom 5
スピードのランダムな範囲を 5 に設定します。
スピードが 5 なので、5 - (5/2) から 5 + (5/2) まで、 つまり 2.5 から 7.5 の間でランダムなスピードでパーティクルが発生します。
string $pname[] = `particle`;
エミッターから発生させるためのパーティクルを作成します。
変数 $pname[0] にはパーティクルの transform ノードの名前、 $pname[1] にはパーティクルシェイプの名前が入ります。
connectDynamic -em $ename[1] $pname[0];
エミッターからパーティクルが発生するように設定します。
particleInstancer -addObject -object $oname $pname[1];
ストロークをパーティクルにインスタンスコピーします。
-addObject -object $oname
変数 $oname に入っているストロークを、 パーティクル $pname[1] のインスタンス化したオブジェクトとして使用します。
select $pname[0];
air フィールドを作用させるためにパーティクルを選択します。
string $aname[] = `air -pos 0 0 0 -m 20 -att 1 -dx 1 -dy -1 -dz 0 -s 5 -mxd 20`;
air フィールドを作成します。
-pos 0 0 0
air フィールドを(0, 0, 0)の位置に作成します。
-m 20
air の速さ(-magnitude)を 20 にします。
-att 1
air の減衰率(-attenuation)を 1 にします。 減衰率とは air の最大距離(-mxd)に到達するまでに減衰する割合です。
-dx 1 -dy -1 -dz 0
air の方向を (1, -1, 0) にします。
-s 5
air のスピード(-speed)を 5 にします。
-mxd 20
air の最大距離(-maxDistance)を 20 にします。 air フィールドの位置から 20 より遠くでは air の力は 0 になります。
connectDynamic -f $aname[0] $pname[0];
air フィールドをパーティクル $pname[0] に作用させます。

練習

練習課題

参考


Prev
Home | Contents
Mail