MELの応用1 (岩石)

岩石を作る

これからMELの応用として、岩・石を自動生成するスクリプトを作ってみよう。
最初は簡単なスクリプトから始めて徐々に複雑で実用的なものに書き直してゆく。
岩・石のようなものをMELによって自動生成するためには様々な方法が考えられる。
ここでは、まずなるべくシンプルな方法で作ってみる。

岩石を作る方法 1

適当なプリミティブを作って、それをスケール・頂点の移動などで変形して岩石らしく見せる方法を試してみよう。

ここでは以下の方法で作ってみる。

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

岩石を作るプログラム1

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

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

スクリプトの解説

float $val = rand (0.5, 2.0);
乱数を作る rand(0.5, 2.0) によって0.5から2.0までのランダムな値を $val に代入する。
string $poly[] = `polySphere -r $val`;
半径 $val のポリゴンの球を作る。
(-r $val で半径 $val の球が作られる)
配列 $poly には球の名前が入る。 ($poly[0]にtransformノード、$poly[1]にpolySphereノード)
float $x = rand(0.8, 1.5);
乱数の値(0.8から1.5の間)を $x に代入。
float $y = rand(0.8, 1.5);
乱数の値(0.8から1.5の間)を $y に代入。
float $z = rand(0.8, 1.5);
乱数の値(0.8から1.5の間)を $z に代入。
scale $x $y $z;
ポリゴンの球にスケールをかける。
string $ver[] = `polyListComponentConversion -toVertex $poly[0]`;
ポリゴンの球から頂点を取り出して配列 $ver[]に代入。
polyListComponentConversion コマンドはポリゴンのオブジェクトから頂点・フェース・エッジ・UVなどを取り出すために使用する。
返り値($ver[] に入る)はコンポーネント(pSphere1.vtx[*]などという形)なので以下の filterExpand で中身を取り出す必要がある。
string $verE[] = `filterExpand -selectionMask 31 $ver`;
コンポーネント $ver を頂点(31で表される)の配列に展開して$verE[]に代入。
for($obj in $verE)
$verE[] から、ひとつづつ頂点を取り出し $obj に代入してループの中の処理を行なう。
以下は for 文内のコマンド。
$x = rand(-0.1, 0.1);
乱数の値(-0.1から0.1)を $x に代入。
$y = rand(-0.1, 0.1);
乱数の値(-0.1から0.1)を $y に代入。
$z = rand(-0.1, 0.1);
乱数の値(-0.1から0.1)を $z に代入。
select -r $obj;
$obj だけをセレクトする。
move -r $x $y $z;
セレクトされている頂点を、その位置から $x, $y, $z だけ移動する。

練習

参考

練習課題


Prev | Next
Home | Contents
Mail