MELの応用 2 (岩石)
岩石を作る 2
前回の岩石を自動生成するスクリプトを、
ラティスデフォーマを利用したものに改良してみましょう。
岩石を作る方法 2
基本的な考え方は前回と同じですが、ポリゴンにデフォーマをかけて全体がゆがんだ形になるようにしてみます。
今回の作り方は以下の通りです。
- ポリゴンの球を作ります。
- ラティスデフォーマを作成します。
- 乱数を 3 つ発生させます。
- その乱数で X, Y, Z 方向に、ラティスデフォーマにスケールをかけます。
- ラティスデフォーマの各制御点に対して以下の処理を繰り返します。
- 乱数を 3 つ発生させます。
- その乱数で制御点を X, Y, Z 方向に移動させます。
岩石を作るプログラム 2
まず、1 個だけ岩石を作るスクリプトを作ってみましょう。
- 以下の MEL スクリプトを Python スクリプトに書き直して、
makeRock4.py という名前で保存します。
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.py を読み込んで、テンキーの Enter キーなどで実行します。
- で以下のコマンドを実行してみます。
makeRock4()
Tips (seed)
random.uniform() 関数を使用すると、実行するたびに違う数値がかえってきますが、
常に同じ数値を返すようにしたい場合があります。
そのようなときには、以下のように random.seed() 関数を使用します。
random.seed(1)
random.uniform(1.0, 2.0)
# 結果: 1.1343642441124011 #
random.uniform(1.0, 2.0)
# 結果: 1.8474337369372327 #
random.seed(1)
random.uniform(1.0, 2.0)
# 結果: 1.1343642441124011 #
random.uniform(1.0, 2.0)
# 結果: 1.8474337369372327 #
練習
- 上の makeRock4.pyを参考にしてmakeRock5.pyを作り、
岩石の個数と岩石が作られる範囲を指定できるようにしてみましょう。
(プロシージャの名前と引数)
makeRock5(num, xRange, yRange, zRange)
- num
- 岩石の個数
- xRange
- X 方向の範囲
この値にマイナスを掛けた値から、この値までの範囲に岩石を作るようにします。
例えば、この値が 5.0 なら -5.0 から 5.0 の範囲にしてください。
以下の Y, Z も同じです。
- yRange
- Y 方向の範囲
- zRange
- Z 方向の範囲
(使用例)
makeRock5.pyを読み込んで、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