所以我理解L系统的规则,并且我设法创建了一个Sierpinski三角形。我现在正在制作不同风格的树木。
这个的基本规则是:
F: Draw forward
+: Rotate right by angle
-: Rotate left by angle
[: Push stack
]: Pop stack
我正在使用Maya这样做,我不确定如何推送和弹出堆栈。我知道如何使用列表创建基本堆栈,因为Maya没有默认堆栈,但我究竟会推送/弹出什么?
我似乎无法推动对象的世界矩阵。如果没有先创建对象就无法做到,L-System进程就出错了。作为一个基本的例子:
F[+F]
...由于没有创建要推/旋转的对象而无法工作。
任何提示都非常有用,因为这一直困扰着我。
答案 0 :(得分:2)
首先,让我向您指出Maya确实有这样的图形堆栈。它只是因为Maya不是立即模式绘图工具,所以这个堆栈实际上是一棵树。该树称为DAG,或者换句话说是对象父层次结构。该树用于与L系统描述的堆栈相同的目的。然而,这可能会或可能不会对您有所帮助,因为它不会直接用于您的评估。
因此,让我们看一下简单的L系统渲染在Maya中的样子。让我们从How to Think Like a Computer Scientist借用基本代码,让我们使用更激动人心的规则:
F -> F[-<<<<F][+>>>>F]
其中&gt;和&lt;是围绕轴的旋转。使用基本公理:
F
进行4次迭代,角度为30度,结果为:
请注意,生产规则集有点多余,并且在每次迭代时都会绘制许多词干。但我的目标是理解简单而不是优雅。使用的代码:
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
并将X
更改为[+FX][<<<<+FX][>>>>+FX]
,则会产生较少的冗余。由于Maya撤消更新速度非常慢,因此在没有撤消的情况下运行代码会使其快几年。因此,您可以更多次运行规则集以获得更复杂的结果。为生成规则添加了一些缩放操作,并得到了这个: