MELの応用 2 (岩石)
岩石を作る 2
前章の岩石を自動生成するスクリプトを、
ラティスデフォーマを利用したものに改良してみましょう。
岩石を作る方法 2
基本的な考え方は前章と同じですが、ポリゴンにデフォーマをかけて全体がゆがんだ形になるようにしてみます。
今回の作り方は、以下の通りです。
- ポリゴンの球体を作ります。
- ラティスデフォーマを作成します。
- 乱数を 3 つ発生させます。
- その乱数で X, Y, Z 方向に、ラティスデフォーマにスケールをかけます。
- ラティスデフォーマの各制御点に対して、以下の処理を繰り返します。
- 乱数を 3 つ発生させます。
- その乱数で制御点を X, Y, Z 方向に移動させます。
岩石を作るプログラム 2
まず、1 個だけ岩石を作るスクリプトを作ってみましょう。
- 以下のプロシージャを makeRock4.mel と言う名前でファイルに書き込みます。
global proc makeRock4()
{
polySphere;
string $lname[] = `lattice -divisions 2 5 2 -objectCentered true`;
float $x = rand(1.0, 3.0);
float $y = rand(1.0, 3.0);
float $z = rand(1.0, 3.0);
scale $x $y $z;
string $points[] = `filterExpand -selectionMask 46 ($lname[1] + ".pt[0:1][0:4][0:1]")`;
for($obj in $points)
{
$x = rand(-0.6, 0.6);
$y = rand(-0.6, 0.6);
$z = rand(-0.6, 0.6);
select -r $obj;
move -r $x $y $z;
}
}
- で makeRock4.mel を読み込みます。
- で以下のコマンドを実行してみます。
makeRock4();
スクリプトの解説
global proc makeRock4()
- makeRock4 という名前のプロシージャを宣言します。
polySphere;
- ポリゴンの球体を作成します。
string $lname[] = `lattice -divisions 2 5 2 -objectCentered true`;
- ラティスデフォーマを作成します。
$lname[0] に ffd ノード名、$lname[1] にトランスフォーム名(ffd1Lattice など)、
$lname[2] にトランスフォーム名(ffd1Base など)が入ります。
ffd ノードは、入力オブジェクトのコンポーネントを変形するノードです。
- -divisions 2 5 2
- X, Y, Z方向のラティススライス数を設定します。
ここでは、X 方向に 2 分割、
Y 方向に 5 分割、
Z 方向に 2 分割しています。
- -objectCentered true
- 選択されているポリゴンオブジェクトにラティスがセンタリングされます。
デフォルトは false なので、
このフラグをつけないと、ラティスデフォーマが原点でセンタリングされてしまいます。
float $x = rand(1,0, 3,0);
- 1.0 から 3.0 の乱数の値を$xに代入します。
float $y = rand(1.0, 3.0);
- 1.0 から 3.0 の乱数の値を$yに代入します。
float $z = rand(1.0, 3.0);
- 1.0 から 3.0 の乱数の値を$zに代入します。
scale $x $y $z;
- 3 つの乱数によって、ラティスデフォーマにスケールをかけます
string $points[] = `filterExpand -selectionMask 46 ($lname[1] + ".pt[0:1][0:4][0:1]")`;
- ラティスデフォーマ $lname[0]
の制御点全部 .pt[0:1][0:4][0:1] を配列に展開して
$points[] に代入します。
-selectionMask の 46 はラティスデフォーマの制御点を表します。
.pt[0:1][0:4][0:1] は、以下の 2 * 5 * 2 = 20 個の制御点を表します。
.pt[0][0][0]
.pt[0][0][1]
.pt[0][1][0]
.pt[0][1][1]
.
.
.pt[1][4][0]
.pt[1][4][1]
$lname[1] に入っているラティスデフォーマの名前を ffd1Lattice とすると、
$points[] には、以下のように ffd1Lattice の制御点の名前が代入されます。
$points[0] = "ffd1Lattice.pt[0][0][0]"
$points[1] = "ffd1Lattice.pt[0][0][1]"
$points[2] = "ffd1Lattice.pt[0][1][0]"
$points[3] = "ffd1Lattice.pt[0][1][1]"
.
.
$points[18] = "ffd1Lattice.pt[1][4][0]"
$points[19] = "ffd1Lattice.pt[1][4][1]"
for($obj in $points)
- ラティスデフォーマの各制御点に対して、以下の処理を行います。
$x = rand(-0.6, 0.6);
- -0.6 から 0.6 の乱数の値を$xに代入します。
$y = rand(-0.6, 0.6);
- -0.6 から 0.6 の乱数の値を$yに代入します。
$z = rand(-0.6, 0.6);
- -0.6 から 0.6 の乱数の値を$zに代入します。
select -r $obj;
- 制御点($obj)を選択します。
move -r $x $y $z;
- ラティスデフォーマの制御点を、元の位置から $x, $y, $z 移動します。
-r フラグによって相対位置での移動になります。
Tips (seed コマンド)
rand コマンドを使用すると、実行するたびに違う数値がかえってきますが、
常に同じ数値を返すようにしたい場合があります。
そのようなときには、以下のように seed コマンドを使用します。
seed 1;
rand(1, 2);
// 結果: 1.90019 //
rand(1, 2);
// 結果: 1.772618 //
seed 1;
rand(1, 2);
// 結果: 1.90019 //
rand(1, 2);
// 結果: 1.772618 //
練習
- 上の makeRock4.melを参考にしてmakeRock5.melを作り、
岩石の個数と、岩石が作られる範囲を指定できるようにしてみましょう。
(プロシージャの名前と引数)
makeRock5(int $num, float $xRange, float $yRange, float $zRange)
- $num
- 岩石の個数
- $xRange
- X 方向の範囲
この値にマイナスを掛けた値から、この値までの範囲に岩石を作るようにします。
たとえば、この値が 5.0 なら -5.0 から 5.0 の範囲にしてください。
以下の Y, Z も同様にしてください。
- $yRange
- Y 方向の範囲
- $zRange
- Z 方向の範囲
(使用例)
makeRock5.melを読み込んで、makeRock5(5, 10.0, 12.0, 7.0)と実行すると5個の岩石が、
X方向に-10.0から10.0まで、
Y方向に-12.0から12.0まで、
Z方向に-7.0から7.0までの範囲で、ランダムな位置に作られます。
参考
練習課題
Prev | Next
Home | Contents
Mail