MELの応用3 (岩石)

岩石を作る 3

前回までとは違う方法で岩・石を自動生成するスクリプトを作ってみる。
今回のスクリプトは水晶のような形の岩・石を作るものである。

岩石を作る方法 3

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

  1. 適当な大きさでシリンダーを作る。
  2. シリンダーの底の形を変える。
    底の各頂点(0 〜 5)に対して以下を実行する。
    1. 乱数を 2 つ作る。
    2. その乱数で X, Z 方向に頂点を移動する。
  3. シリンダーの天井の形を変える。
    天井の各頂点(6 〜 11)に対して以下を実行する。
    1. 乱数を 1 つ作る。
    2. その乱数で Y 方向に頂点を移動する。
  4. 乱数を 1 つ作る。
  5. その乱数で Y 方向に天井の真ん中の頂点を移動する。

岩石を作るプログラム3

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

  1. 以下のプロシージャをmakeRock7.melと言う名前でファイルに書き込む。
    global proc makeRock7()
    {
    	int $i;
    	float $x, $y, $z;
    
    	string $poly[] = `polyCylinder -radius 1.0 -height 2.0 -subdivisionsX 6 -subdivisionsY 1 -subdivisionsZ 1`;
    	string $ver[] = `polyListComponentConversion -toVertex $poly[0]`;
    	string $verE[] = `filterExpand -selectionMask 31 $ver`;
    	for($i = 0; $i < 6; $i++)
    	{
    		$x = rand(-0.2, 0.2);
    		$z = rand(-0.2, 0.2);
    		select -r $verE[$i];
    		move -r $x 0 $z;
    	}
    	for($i = 6; $i < 12; $i++)
    	{
    		$y = rand(-0.3, 0.3);
    		select -r $verE[$i];
    		move -r 0 $y 0;
    	}
    	$y = rand(0.5, 1.0);
    	select -r $verE[13];
    	move -r 0 $y 0;
    }
    
  2. File → Source Script でmakeRock7.melを読み込む。
  3. Script Editor で以下のコマンドを実行してみる。
    makeRock7();
    [makeRock7()の実行結果]

スクリプトの解説

int $i;
変数 $i の宣言。
float $x, $y, $z;
変数 $x, $y, $z の宣言。
string $poly[] = `polyCylinder -radius 1.0 -height 2.0 -subdivisionsX 6 -subdivisionsY 1 -subdivisionsZ 1`;
ポリゴンのシリンダーを作る。
$polyにシリンダーの名前が入る。 (poly[0]にtransformノード、poly[1]にpolyCylinderノード)
-radius 1.0
シリンダーの半径
-height 2.0
シリンダーの高さ
-subdivisionsX 6
X方向の分割数
-subdivisionsY 1
Y方向の分割数
-subdivisionsZ 1
Z方向の分割数
string $ver[] = `polyListComponentConversion -toVertex $poly[0]`;
ポリゴンの球から頂点を取り出して$ver[]に代入。
polyListComponentConversionコマンドはポリゴンのオブジェクトから頂点・フェース・エッジ・UVなどを取り出すために使用する。
返り値($ver[]に入る)はコンポーネントなので以下のfilterExpandで中身を取り出す必要がある。
string $verE[] = `filterExpand -selectionMask 31 $ver`;
$verの中から頂点(31で表される)を配列に展開して$verE[]に代入。
for($i = 0; $i < 6; $i++)
以下のループを$iが0から5まで6回実行する。
0から5番目の頂点(シリンダーの底にある頂点)を乱数によって移動する。
$x = rand(-0.2, 0.2);
乱数の値(-0.2から0.2)を$xに代入。
$z = rand(-0.2, 0.2);
乱数の値(-0.2から0.2)を$zに代入。
select -r $verE[$i];
$i番目の頂点(シリンダーの底にある頂点)をセレクトする。
move -r $x 0 $z;
セレクトされている頂点を、その位置から$x, 0.0, $zだけ移動する。
Y方向には移動しないことに注意。
for($i = 6; $i < 12; $i++)
以下のループを$iが6から11まで6回実行する。
6から11番目の頂点(シリンダーの天井にある頂点)を乱数によって移動する。
$y = rand(-0.3, 0.3);
乱数の値(-0.3から0.3)を$yに代入。
select -r $verE[$i];
$i番目の頂点(シリンダーの天井にある頂点)をセレクトする。
move -r 0 $y 0;
セレクトされている頂点を、その位置から0.0, $y, 0.0だけ移動する。
X, Z方向には移動しないことに注意。
$y = rand(0.5, 1.0);
乱数の値(0.5から1.0)を$yに代入。
select -r $verE[13];
13番目の頂点(シリンダーの天井の中心にある頂点)をセレクトする。
move -r 0 $y 0;
セレクトされている頂点を、その位置から0.0, $y, 0.0だけ移動する。
X, Z方向には移動しないことに注意。

練習

参考

練習課題


Prev | Next
Home | Contents
abe@injapan.net