まず、Mayaに実際にこのようなグラフィックススタックがあることを指摘しておきます。 Mayaは即時モード描画ツールではないので、このスタックは実際にはツリーです。このツリーはDAG、つまりオブジェクトの親階層と呼ばれます。このツリーは、Lシステムで記述されたスタックと同じ目的を果たします。しかし、これはあなたの評価のために多くの利用が直接ではないので、あなたを助けるかもしれません。
ここで、単純なLシステムレンダリングがMayaのように見えるようにしましょう。
F -> F[-<<<<F][+>>>>F]
>と<は、軸の周りに回転している:How to Think Like a Computer Scientistから基本コードを借りて、私たちは少しより多くのエキサイティングなルールを使用してみましょうことができます。 4回の反復と30度の結果の角
F
:ベース公理使用
注生産ルールセットは、ビット冗長であり、多くが各反復でステム描画する傾向があります。しかし、私は優雅さではなく、わかりやすさを目指しています。使用コード:
import maya.cmds as cmds
def applyRules(lhch):
rhstr = ""
if lhch == 'F':
rhstr = 'F[+F][<<<<+F][>>>>+F]'
else:
rhstr = lhch # no rules apply so keep the character
return rhstr
def processString(oldStr):
newstr = ""
for ch in oldStr:
newstr = newstr + applyRules(ch)
return newstr
def createLSystem(numIters, axiom):
startString = axiom
endString = ""
for i in range(numIters):
endString = processString(startString)
startString = endString
return endString
def drawLsystem(instructions, angle, distance):
parent = cmds.createNode("transform", n="L_Root_#")
saved=[]
for act in instructions:
if act == 'F':
cyl = cmds.cylinder(r=0.1, ax=[0,1,0], hr=1/0.1*distance)
cyl = cmds.parent(cyl[0], parent, r=1)
cmds.move(0, (distance/2.0), 0, cyl[0], os=1)
parent = cmds.createNode("transform", p=parent)
cmds.move(0, (distance), 0, parent, os=1)
if act == '-':
parent = cmds.createNode("transform", p=parent)
cmds.rotate(angle, 0, 0, parent, os=1)
if act == '+':
parent = cmds.createNode("transform", p=parent)
cmds.rotate(-angle, 0, 0, parent, os=1)
if act == '<':
parent = cmds.createNode("transform", p=parent)
cmds.rotate(0, angle, 0, parent, os=1)
if act == '>':
parent = cmds.createNode("transform", p=parent)
cmds.rotate(0, -angle, 0, parent, os=1)
if act == '[':
saved.append(parent)
if act == ']':
parent = saved.pop()
drawLsystem(createLSystem(4, "F"),30,1)
PS:あなたはFX
に公理を変更し、[+FX][<<<<+FX][>>>>+FX]
するX
を支配している場合、それはあまり冗長性を生成します。元に戻すことなくコードを実行すると、更新がかなり遅くなり、Mayaの処理が遅くなっています。結果として、より複雑な結果を得るためにルールセットをさらに実行することができます。生成ルールにはいくつかのスケールの操作を追加し、これを得た:
あなたは純粋なPythonでこれを実装していた場合には、あなたは現在の位置と見出しを格納します。前にMayaを使用したことがないので、私はあなたがそこで何をするか分かりません。 – Kevin