草原作成 MEL スクリプト

MEL スクリプトの例

paintEffect を使用して、オブジェクトの表面のランダムな位置にストロークを作成し、 違う種類のブラシをアタッチしてゆく MEL スクリプトを作成してみましょう。

  1. 以下の MEL スクリプトを paintRandom1.mel という名前で作ります。
    global proc paintRandom1()
    {
    	int $i;
    	string $n;
    
    	string $brush[] = {"riceAutumn", "astroturf"};
    	float $scale[] = {1.0, 5.0};
    	string $path = "C:/Program Files/Autodesk/Maya8.5/brushes/grasses/";
    	string $name[] = `nurbsPlane -axis 0 1 0`;
    	scale 20 20 20;
    	int $size = size($brush);
    	for($i = 0; $i < $size; $i++)
    	{
    		string $file = $path + $brush[$i];
    		eval("source \"" + $file + "\"");
    		select $name[0];
    		seed($i);
    		paintRandom(4, 4, 5, 0.52, 1, 1, 0, 0, 1, 1);
    		string $sname[] = `ls -sl -type stroke`;
    		for($n in $sname)
    		{
    			setAttr ($n + ".displayPercent") 5;
    		}
    		string $bname[] = `listConnections ($n + ".brush")`;
    		setAttr ($bname[0] + ".globalScale") $scale[$i];
    	}
    }
    
  2. Script EditorFile → Source Script によって paintRandom1.mel を読み込みます。
  3. Script Editor のインプットウインドウで、paintRandom1() を実行します。
    (paintRandom1() 実行後の図)
    [paintRandom1() 実行後の図]
    [レンダリング実行図]

スクリプトの解説

global proc paintRandom1()
paintRandom1 というプロシージャの定義です。
int $i;
for 文で使用するための int の変数 $i の宣言です。
string $n;
文字列 $n の宣言です。
後で、ストロークの名前を代入するために使用します。
string $brush[] = {"riceAutumn", "astroturf"};
使用するブラシの種類を string の配列の要素として初期化します。
float $scale[] = {1.0, 5.0};
各ブラシの globalScale の値を float の配列の要素として初期化します。
string $path = "C:/Program Files/Autodesk/Maya8.5/brushes/grasses/";
string の変数にブラシのスクリプトが存在するパスを代入しておきます。
string $name[] = `nurbsPlane -axis 0 1 0`;
ストロークをアタッチするための NURBS プレーンを作成します。
-axis 0 1 0
NURBS プレーンの法線方向を 0 1 0 にします。
scale 20 20 20;
NURBS プレーンのスケール値を 20 20 20 にします。
int $size = size($brush);
配列 $brush の要素の個数を調べて int 変数 $size に代入します。
for($i = 0; $i < $size; $i++)
配列 $brush の要素の個数文だけ for 文を実行します。
string $file = $path + $brush[$i];
string 変数 $file に、 フォルダのパスとブラシのスクリプトファイル名を結合した文字列を代入します。
eval("source \"" + $file + "\"");
ブラシのスクリプトを読み込みます。
select $name[0];
NURBS プレーンを選択します。
seed($i);
毎回、違った位置にストロークを作成するために乱数を $i を使用して初期化します。
paintRandom(4, 4, 5, 0.52, 1, 1, 0, 0, 1, 1);
NURBS プレーン上のランダムな位置にストロークを作成し、 現在のブラシをアタッチします。
ここでは、作成される複数のストロークで、 ひとつのブラシを共有しています。
paintRandom() は MEL スクリプトになっていて、 Maya 8.5 では C:\Program Files\Autodesk\Maya8.5\scripts\paintEffects\paintRandom.mel に存在します。
global proc paintRandom(
	int $udensity, // スパン U
	int $vdensity, // スパン V
	float $strokeLength, // ストロークの長さ
	float $randOffset, // ランダムオフセット
	float $sampleDensity, // サンプル密度
	int $arcLengthDensity, // 均一化 (0 または 1)
	float $surfaceOffsetMin, // サーフェスの最小オフセット
	float $surfaceOffsetMax, // サーフェスの最大オフセット
	int $doClip, // エッジのクリップ (0 または 1)
	int $shareOneBrush ) // 1 のブラシを共有 (0 または 1)
string $sname[] = `ls -sl -type stroke`;
paintRandom() によって作成されたストローク名を、 ls コマンドを使用して文字列配列 $sname に代入します。
-sl
選択されているオブジェクトを返します。
-type stroke
ノードの種類がストロークであるものだけを返します。
for($n in $sname)
paintRandom() によって作成されたストローク名を、 ひとつづつ $n に代入して for 文を実行してゆきます。
setAttr ($n + ".displayPercent") 5;
ストロークの displayPercent アトリビュートに 5 を設定します。 これによって、シーン上のブラシ表示を軽くします。
string $bname[] = `listConnections ($n + ".brush")`;
ストロークにアタッチされているブラシの名前を調べます。
for 文が終了した後で実行しているのは、 すべてのストロークがひとつのブラシを共有する設定で作成しているので、 最後のひとつだけ調べればよいからです。
setAttr ($bname[0] + ".globalScale") $scale[$i];
ブラシの globalScale アトリビュートに $scale[$i] を設定します。

練習

練習課題

参考


Prev
Home | Contents
Mail