2017-02-15 6 views
1

그래서 L-System의 규칙을 이해하고 Sierpinski Triangle을 만들었습니다. 나는 이제 다른 스타일의 나무를 만들기 위해 움직이고 있습니다. 나는이 작업을 수행하는 마야를 사용하고L-Systems 및 Maya의 스택

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

내가 밀고 스택 터지는 대해 이동하는 방법을 확실 :이의

기본 규칙이 될 것입니다. Maya는 기본 스택이 없기 때문에 목록을 사용하여 기본 스택을 작성하는 방법을 알고 있지만 정확하게 밀어 넣을까요?

개체의 세계 행렬을 밀어 넣을 수 없습니다. 그리고 먼저 객체를 만들지 않고는 할 수 없으므로 L- 시스템 프로세스가 잘못됩니다. 기본 예 :

F[+F] 

... 푸시/회전 할 개체를 만들지 않아 작동하지 않습니다.

팁이 정말 유용 할 것입니다. 잠시 나마 당황한 것 같습니다.

+0

당신은 순수 파이썬이 구현 된 경우, 당신은 현재의 위치와 제목을 저장하는 것입니다. 이전에 Maya를 사용 해본 적이 없으므로 나는 당신이 무엇을 할 것인지 전혀 모른다. – Kevin

답변

2

먼저, 마야는 실제로 이와 같은 그래픽 스택을 가지고 있음을 지적하겠습니다. Maya가 직접 모드 드로잉 도구가 아니기 때문에이 스택은 실제로는 트리입니다. 이 트리를 DAG 또는 개체 부모 계층 구조라고합니다. 이 트리는 L 시스템에서 설명한 스택과 동일한 용도로 사용됩니다. 그러나 이것은 귀하의 평가에 직접적으로 많이 사용되지 않았기 때문에 도움이 될 수도 도움이되지 않을 수도 있습니다.

그래서 간단한 L 시스템 렌더링이 Maya에서 어떻게 보이는지 살펴 보겠습니다.

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

>와 <는 축을 중심으로 회전됩니다 How to Think Like a Computer Scientist에서 기본 코드를 빌려 우리가 조금 더 흥미로운 규칙을 사용 할 수 있습니다.

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에 공리를 변경하고 [+FX][<<<<+FX][>>>>+FX]하는 X을 지배하면 덜 중복을 생성합니다. 실행 취소하지 않고 코드를 실행하면 Maya가 업데이트 속도가 매우 느려지므로 작업 속도가 빨라집니다. 결과적으로 더 복잡한 결과를 위해 규칙 세트를 더 많이 실행할 수 있습니다. 생성 규칙 일부 규모의 작업을 추가하고이있어 :

enter image description here

+0

고마워요. 저는 DAG 계층 구조에 대해 아직도 배우고 있었기 때문에 Maya를 처음 접했습니다. 나는 그것에 대한 연구를 해왔으므로 그것을 이해하는 것이 점점 나아졌습니다. 제안한대로 DAG 계층 구조를 사용하여 코드를 수정했습니다. 도움이 많이 필요합니다! – TheCoder95