MELの応用2 (岩石)

岩石を作る 2

前回のスクリプトを少し改良して岩・石を自動生成するスクリプトを作ってみる。

岩石を作る方法 2

基本的な考え方は前回と同じだが、ポリゴンの分割数を変えて最後にスムースをかけることによって、全体がゆがんだ形になるようにしている。

今回の作り方は以下の通り。

  1. 分割数を少なめにしてポリゴンの球を作る。
  2. 乱数を 3 つ発生させる。
  3. その乱数で X, Y, Z 方向にスケールをかける。
  4. ポリゴンの各頂点に対して以下の処理を繰り返す。
    1. 乱数を 3 つ発生させる。
    2. その乱数で頂点を X, Y, Z 方向に移動させる。
  5. ポリゴンにスムースをかける。

岩石を作るプログラム2

まず、1個岩石を作るスクリプトを作ってみる。

  1. 以下のプロシージャをmakeRock4.melと言う名前でファイルに書き込む。
    global proc makeRock4()
    {
    	string $poly[] = `polySphere -subdivisionsX 5 -subdivisionsY 5`;
    	float $x = rand(1.0, 2.0);
    	float $y = rand(1.0, 2.0);
    	float $z = rand(1.0, 2.0);
    	scale $x $y $z;
    	string $ver[] = `polyListComponentConversion -toVertex $poly[0]`;
    	string $verE[] = `filterExpand -selectionMask 31 $ver`;
    	for($obj in $verE)
    	{
    		$x = rand(-0.2, 0.2);
    		$y = rand(-0.2, 0.2);
    		$z = rand(-0.2, 0.2);
    		select -r $obj;
    		move -r $x $y $z;
    	}
    	string $polyS[] = `listRelatives -shapes $poly[0]`;
    	polySmooth -divisions 2 -continuity 0.5 $polyS[0];
    }
    
  2. File → Source Script でmakeRock4.melを読み込む。
  3. Script Editor で以下のコマンドを実行してみる。
    makeRock4();
    [makeRock4() の実行例]

スクリプトの解説

string $poly[] = `polySphere -subdivisionsX 5 -subdivisionsY 5`;
ポリゴンの球を作る。
アサインによって$polyに球の名前が代入される。 (poly[0]にtransformノード、poly[1]にpolySphereノード)
-subdivisionsX 5
横方向の分割数を 5 にする。
-subdivisionsY 5
縦方向の分割数を 5 にする。
float $x = rand(1.0, 2.0);
乱数の値(1.0から2.0)を$xに代入。
float $y = rand(1.0, 2.0);
乱数の値(1.0から2.0)を$yに代入。
float $z = rand(1.0, 2.0);
乱数の値(1.0から2.0)を$zに代入。
scale $x $y $z;
$x, $y, $z によってポリゴンの球にスケールをかける。
string $ver[] = `polyListComponentConversion -toVertex $poly[0]`;
ポリゴンの球から頂点を取り出して$ver[]に代入。
polyListComponentConversionコマンドはポリゴンのオブジェクトから頂点・フェース・エッジ・UVなどを取り出すために使用する。
返り値($ver[]に入る)はコンポーネントなので以下のfilterExpandで中身を取り出す必要がある。
string $verE[] = `filterExpand -selectionMask 31 $ver`;
$verの中から頂点(31で表される)を配列に展開して$verE[]に代入。
for($obj in $verE)
$verE[]から、ひとつづつ頂点を取り出して$objに代入してループの中の処理を行なう。
$x = rand(-0.2, 0.2);
乱数の値(-0.2から0.2)を$xに代入。
$y = rand(-0.2, 0.2);
乱数の値(-0.2から0.2)を$yに代入。
$z = rand(-0.2, 0.2);
乱数の値(-0.2から0.2)を$zに代入。
select -r $obj;
$obj(ひとつの頂点)だけをセレクトする。
move -r $x $y $z;
セレクトされている頂点を、その位置から$x, $y, $zだけ移動する。
string $polyS[] = `listRelatives -shapes $poly[0]`;
ポリゴンのトランスフォームノードの子ノードからシェープノード(メッシュ)を得る。
listRelatives コマンドによってtransformノード($poly[0])の子ノードになっているshapeノードを得て、$polySに代入している。
以下でポリゴンにスムースをかけるために必要である。
polySmooth -divisions 2 -continuity 0.5 $polyS[0];
ポリゴンメッシュにスムースをかける。
$polyS[0]には上のlistRelativesコマンドによって得られたshapeノードが入っている。 (スムースをかけるにはshapeノードが必要)
-divisions 2
何回再帰的にスムースをかけるかを決める。
ここでは 2 回スムースをかけている。 (デフォールトは 1)
-continuity 0.5
スムースの度合を表す。
値が大きい程スムースになる。
0.0 〜 1.0 の範囲で指定する。 (ここでは 0.5)
(デフォールトは 1.0)

練習

参考

練習課題


Prev | Next
Home | Contents
Mail