gpt4 book ai didi

python - L-Systems 和 Maya 中的堆栈

转载 作者:行者123 更新时间:2023-12-01 03:18:16 25 4
gpt4 key购买 nike

所以我了解了 L 系统的规则,并且我成功地创建了一个谢尔宾斯基三角形。我现在开始制作不同风格的树木。

基本规则是:

F: Draw forward
+: Rotate right by angle
-: Rotate left by angle
[: Push stack
]: Pop stack

我正在使用 Maya 来执行此操作,但我不确定如何推送和弹出堆栈。我知道如何使用列表创建基本堆栈,因为 Maya 没有默认堆栈,但我到底要推送/弹出什么?

我似乎无法插入对象的世界矩阵。由于如果不先创建对象就无法执行某些操作,L-System 过程就会出错。作为一个基本示例:

F[+F] 

...由于未创建要插入/旋转的对象而无法工作。

任何提示都会非常有用,因为这已经困扰我一段时间了。

最佳答案

首先,让我向您指出,Maya 确实有这样的图形堆栈。只是由于 Maya 不是即时模式绘图工具,因此该堆栈实际上是一棵树。该树称为 DAG,或者换句话说,对象父层次结构。该树与 L 系统描述的堆栈具有相同的用途。然而,这可能对您有帮助,也可能没有帮助,因为它对您的评估没有直接的用处。

让我们看看 Maya 中简单的 L 系统渲染是什么样子。让我们借用 How to Think Like a Computer Scientist 的基本代码让我们使用稍微更令人兴奋的规则:

F -> F[-<<<<F][+>>>>F]

其中 > 和 < 是绕轴旋转。使用基本公理:

F

4 次迭代和 30 度角的结果是:

enter image description here

请注意,生产规则集有点多余,并且往往会在每次迭代时绘制许多词干。但我的目标是理解的简单性而不是优雅。使用的代码:

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 撤消更新速度相当慢,运行不撤消的代码使其速度快了好几光年。因此,您可以多次运行规则集以获得更复杂的结果。在生成规则中添加了一些缩放操作并得到了这个:

enter image description here

关于python - L-Systems 和 Maya 中的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42257676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com