ラティスデフォーマを利用した岩石を自動生成するスクリプトを作成してみましょう。
ポリゴンにデフォーマをかけて全体がゆがんだ形になるようにしてみます。
今回の作り方は以下の通りです。
まず、1 個だけ岩石を作るスクリプトを作ってみましょう。
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)
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)
random.uniform() 関数を使用すると、実行するたびに違う数値がかえってきますが、 常に同じ数値を返すようにしたい場合があります。 そのようなときには、以下のように random.seed() 関数を使用します。
スライダーを、以下の図の値にして 作成 ボタンを押した結果です。
shname = pm.shadingNode('lambert', asShader=True)
setname = pm.sets(renderable=True, noSurfaceShader=True, empty=True)
shname.outColor >> setname.surfaceShader
pm.select(lambertがアサインされるオブジェクト, r=True)
pm.sets(setname, e=True, forceElement=True)
fname = pm.shadingNode('rock', asTexture=True)
pname = pm.shadingNode('place3dTexture', asUtility=True)
pname.wim[0] >> fname.pm
pm.connectAttr(fname.outColor, shname.color, f=True)
r = random.uniform(Color1Min, Color1Max)
g = random.uniform(Color1Min, Color1Max)
b = random.uniform(Color1Min, Color1Max)
fname.color1R.set(r)
fname.color1G.set(g)
fname.color1B.set(b)
r = random.uniform(Color2Min, Color2Max)
g = random.uniform(Color2Min, Color2Max)
b = random.uniform(Color2Min, Color2Max)
fname.color2R.set(r)
fname.color2G.set(g)
fname.color2B.set(b)
pname.sx.set(5)
pname.sy.set(5)
pname.sz.set(5)
(提出フォルダ)