PyMELの応用 (岩石)
岩石を作る
ラティスデフォーマを利用した岩石を自動生成するスクリプトを作成してみましょう。
岩石を作る方法
ポリゴンにデフォーマをかけて全体がゆがんだ形になるようにしてみます。
今回の作り方は以下の通りです。
- ポリゴンの球を作ります。
- ラティスデフォーマを作成します。
- 乱数を 3 つ発生させます。
- その乱数で X, Y, Z 方向に、ラティスデフォーマにスケールをかけます。
- ラティスデフォーマの各制御点に対して以下の処理を繰り返します。
- 乱数を 3 つ発生させます。
- その乱数で制御点を X, Y, Z 方向に移動させます。
岩石を作るプログラム 2
まず、1 個だけ岩石を作るスクリプトを作ってみましょう。
- 以下のプロシージャを makeRock1.py と言う名前でファイルに書き込みます。
import pymel.core as pm
import random
def makeRock1():
pm.polySphere()
lattice = pm.lattice(divisions=(2, 5, 2), objectCentered=True)
x = random.uniform(1.0, 3.0)
y = random.uniform(1.0, 3.0)
z = random.uniform(1.0, 3.0)
pm.scale([x, y, z])
for p in lattice[1].pt:
x = random.uniform(-0.6, 0.6)
y = random.uniform(-0.6, 0.6)
z = random.uniform(-0.6, 0.6)
pm.select(p, r=True)
pm.move([x, y, z], r=True)
- スクリプト エディタ の によって makeRock1.py を読み込んで、テンキーの Enter キーなどで実行します。
- で以下のコマンドを実行してみます。
makeRock1()
スクリプトの解説
import pymel.core as pm
- pymel.core モジュールをインポートしてpmという名前で使用できるようにします。
import random
- random モジュールをインポートします。
uniform() 関数を使うために必要です。
def makeRock1():
- makeRock1 という名前の関数を宣言します。
pm.polySphere()
- ポリゴンの球体を作ります。
poly には球の名前が代入されます。
(poly[0] にトランスフォームノード、poly[1] にインプットノード)
lattice = pm.lattice(divisions=(2, 5, 2), objectCentered=True)
- ラティスデフォーマを作成します。
lattice[0] に ffd ノード名、lattice[1] にトランスフォーム名(ffd1Lattice など)、
lattice[2] にトランスフォーム名(ffd1Base など)が入ります。
ffd ノードは、入力オブジェクトのコンポーネントを変形するノードです。
- divisions=(2
- X, Y, Z方向のラティススライス数を設定します。
ここでは、X 方向に 2 分割、
Y 方向に 5 分割、
Z 方向に 2 分割しています。
- objectCentered=True
- 選択されているポリゴンオブジェクトにラティスがセンタリングされます。
デフォルトは False なので、
このフラグをつけないとラティスデフォーマが原点でセンタリングされてしまいます。
x = random.uniform(1.0, 3.0)
- 1.0 から 3.0 の乱数の値をxに代入します。
y = random.uniform(1.0, 3.0)
- 1.0 から 3.0 の乱数の値をyに代入します。
z = random.uniform(1.0, 3.0)
- 1.0 から 3.0 の乱数の値をzに代入します。
pm.scale([x, y, z])
- x, y, zの値でラティスデフォーマをスケールします。
for p in lattice[1].pt:
- ラティスデフォーマの各制御点に対して、以下の処理を行います。
x = random.uniform(-0.6, 0.6)
- -0.6 から 0.6 の乱数の値を$xに代入します。
y = random.uniform(-0.6, 0.6)
- -0.6 から 0.6 の乱数の値を$yに代入します。
z = random.uniform(-0.6, 0.6)
- -0.6 から 0.6 の乱数の値を$zに代入します。
pm.select(p, r=True)
- 制御点(p)を選択します。
pm.move([x, y, z], r=True)
- ラティスデフォーマの制御点を、元の位置から x, y, z 移動します。
r フラグによって相対位置での移動になります。
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 #
練習
- 上の makeRock1.pyを参考にしてmakeRock2.pyを作り、
岩石の個数と岩石が作られる範囲を指定できるようにしてみましょう。
(プロシージャの名前と引数)
def makeRock2(num, xRange, yRange, zRange)
- num
- 岩石の個数
- xRange
- X 方向の範囲
この値にマイナスを掛けた値から、この値までの範囲に岩石を作るようにします。
例えば、この値が 5.0 なら -5.0 から 5.0 の範囲にしてください。
以下の Y, Z も同じです。
- yRange
- Y 方向の範囲
- zRange
- Z 方向の範囲
(使用例)
makeRock5.pyを読み込んで、makeRock2(5, 10.0, 12.0, 7.0)と実行すると5個の岩石が、
X方向に-10.0から10.0まで、
Y方向に-12.0から12.0まで、
Z方向に-7.0から7.0までの範囲でランダムな位置に作られます。
(提出フォルダ)
\Class-AD\Class-group\2-nen\MEL応用\makeRock2
参考
- Maya
Maya, MEL, Maya関係のコマンドなどのページ。
Prev | Next
Home | Contents
Mail