[Houdini]L-System 初步了解

 L-System語法

緣由

經過朋友分享Houdini的學習過程時,了解到裡面可以使用Lindenmayer個系統,也就是L-System,他是由荷蘭生物學和植物學家Aristid Lindenmayer所提出的數學模型,可以廣泛應用於植物生長過程的研究,而在3D軟體,則可以依照這些規則來產生需要的植物。

符號

F   往前一步,並畫一條線
f    往前一步,不畫線
+    左轉δ
-    右δ
[    開始一個分支
]    完成一個分支
X,Y  為變數,變數不畫線,但是要記得他們的存在

有其他語法不過目前我們先用這些就好
依 維基百科 所寫L-System應該會像:
變數:AB
常量:
公理(Axiom):A
規則:(A->AB),(B->A)

所謂的公理,就是系統的初始點,像是這裡的公理為A,所以我們由A開始走
然後再依規則進行疊代。

示範

矩形路徑

下面來簡單的示範
我們的δ在此設為90度,也就是我們目前的轉彎都是單純的正左轉正右轉。
n = 3  
F
F->F[-XF]F
X->F[x]
開始畫吧:

n = 0

因為我們的公理定為 F,所以一開始為向前走一步並且有畫線。
我們以紅色為起點向前走一步吧!

n = 1

進行第一次疊代,這時我們要依照給的兩條規則來執行。

由於沒有X在場上,所以我們這次只跟隨規則 F->F[-XF]F

注意一點是,我們有箭頭符號對吧。
你可以把他想成變身,我們的F變身成F[-XF]F了,所以會直接取代原本的F,
而不是繼續畫上去。
在這張圖我用了3步驟來解釋是怎麼變成最右邊那張圖的,便更好的解釋規則語法。
F[-XF]F
a. : 我們裡所當然的畫一條線F1
b. [-XF] : 中括號的意思就是分支,也就是新的樹枝,我們想像在目前位置跟目前的方向,開啟一個獨立的工作站,且不會影響到本體。
我們再來看他的要求是什麼:
指令是 -XF,所以我們先向右轉,並且在地上丟下一個標記變數X1,然後依照指令 F 再向前走一步F2
c.由於分支完成符號(]),所以我們回到原本的世界,以原本的位置,原本的方向,依照指令 F 再畫了一條線F

n = 2

進行第二次疊代,這時我們除了有F1、F2、F3還有上一次增加的變數標記X,所以這時我們要遵守的規則多了一條

F->F[-XF]F
X->F[X]

a.首先我們先看到F1的線段,他的拓展方法如同我們第一次疊代一樣。
b.同理我們的F3也是一樣為其展開線段與加上標記。
c.再來是我們的重頭戲F
  我們會看到第一次疊代時加上的位置標記X,我們依照規則:
    I.先以同方向畫上一條F,再來開啟一個分支並給予X標記。
    II.而原本F2有畫上的F則如同F1F3一樣拓展開來。
完成後的圖如下

n = 3

好了我就畫到第三次疊代,會越畫越多的,一樣把規則補上這樣就不用往上滑了
F->F[-XF]F
X->F[X]
將各自的部分依照規則來展開,由於篇幅的問題,在這裡不逐一展開了,建議可以拿紙筆自己畫一次,蠻好玩的。

完成後會如下圖。

你自己展開後可能會發現FbFc之間是不是少了一段 F ? 也就是從X2展開的那個。
對,我們細看會發現,X2本身是一段新的分支,但他又跟本體重疊,所以他既不會影響到本體,又會被本體蓋住,所以我們得出來的圖才會長這樣。


樹形

接下來我們試著展開樹型的看看吧
L-System
n=7,δ=20°
X
X->F[+X]F[-X]+X
F->FF
這是由<The Algorithmic Beauty of Plants>一書中,圖1.24第d項所提供的算式
一樣是一變數,只是這次我們每次轉彎所轉的角度為20度,理解這個前提後就好畫了

n=0

由於他的Axiom是變數X,所以我們放了一個X在場上結束這一回合。

n=1

X->F[+X]F[-X]+X

n=2

X->F[+X]F[-X]+X
F->FF


n=3

X->F[+X]F[-X]+X
F->FF
請容許我沒有照書上的式子要算到第7次,真的太多了,經過了上面的兩個式子的繪圖過程,希望大家已經了解如何以它的規則來畫,樹會如何生長。

還有一件事,我們這裡為了繪圖方便所以只使用了+和-這個左右轉的運算子,這樣的話我們只是在2D進行樹的成長。
如果是在胡迪尼或是其他3D軟體內,由於建模的東西是立體的,所以我們的樹枝規則就會要使用到以下這種其他方向的運算符號:
    \:左傾
    /:右傾
    ^:上仰
    &:下俯
角度可以在規則中進行設定。

參考










留言

這個網誌中的熱門文章

[Unity] 關於Android 的環境設定,使用自己的SDK/JDK/NDK

[Godot] Sprite Sheet 使用以及HDR Glow 發光效果

[Godot] 起始之初,編輯器認識:關聯Rider IDE