2017-02-15 1 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

あなたは純粋なPythonでこれを実装していた場合には、あなたは現在の位置と見出しを格納します。前にMayaを使用したことがないので、私はあなたがそこで何をするか分かりません。 – Kevin

答えて

2

まず、Mayaに実際にこのようなグラフィックススタックがあることを指摘しておきます。 Mayaは即時モード描画ツールではないので、このスタックは実際にはツリーです。このツリーはDAG、つまりオブジェクトの親階層と呼ばれます。このツリーは、Lシステムで記述されたスタックと同じ目的を果たします。しかし、これはあなたの評価のために多くの利用が直接ではないので、あなたを助けるかもしれません。

ここで、単純なLシステムレンダリングがMayaのように見えるようにしましょう。

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

>と<は、軸の周りに回転している:How to Think Like a Computer Scientistから基本コードを借りて、私たちは少しより多くのエキサイティングなルールを使用してみましょうことができます。 4回の反復と30度の結果の角

F 

:ベース公理使用

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