山里ぽん太

L-System First Step

18 August 2018

山里ぽん太はL-Systemの勉強を始めました。


Chapter 1 L-System
リンデンマイヤーさんが提唱したL-Syatem は、「形式文法の一種で、植物の成長プロセスを初めとした様々な自然物の構造を記述・表現できるアルゴリズム」なのだそうです。なんだかムズイです。
Houdini には、「L-System」ノードがあって、亀さんが歩いた足跡で絵を描く「タートル・グラフィクス」が使えます。
というわけで、「L-System」というよりも、「Houdini の L-Syatem ノード」の勉強を始めました。
まずは、Houdini のリファレンスの「L-System geometry node」のページを読んで、書かれている作例やなんかを実際に作ってみることにしました。
Chapter 2 リファレンスの作例その1
というわけで、最初の作例です。
三歩進む
右を向く
一歩進む
右を向く
二歩進む
左を向く
一歩進む
右を向く
一歩進む
右を向く
二歩進む

という作図をします。
これを、L-System の文法で書くと、こうなります。
PremiseFFF+F+FF-F+F+FF

これを、Houdini の L-System ノードのパラメータに書くと、こんな絵を描いてくれます。

Chapter 3 リファレンスの作例その2
次は、「置き換え」の文法です。
文法と言っても、テキストエディタの「置換 replace」機能です。
「A」と一文字だけ書かれたテキストファイルがあるとします。
そのテキストの中の「A」の文字を「F+A」という文字に置き換えます。
すると、「F+A」とだけ書かれたテキストファイルになります。
もう1回置換します。
すると、「F+F+A」とだけ書かれたテキストファイルになります。
もう1回置換します。
すると、「F+F+F+A」とだけ書かれたテキストファイルになります。
こーんな感じです。
もとのテキストA
1回置換F+A
2回置換F+F+A
3回置換F+F+F+A

で、「A」「F」「+」に、こんな意味づけをします。
「A」は「なにもしない」
「F」は「一歩進む」
「+」は「右を向く」
こんな感じになります。
もとのテキストAなにもしない
1回置換F+A一歩進んで、右を向いて、なにもしない
2回置換F+F+A一歩進んで、右を向いて、一歩進んで、右を向いて、なにもしない
3回置換F+F+F+A一歩進んで、右を向いて、一歩進んで、右を向いて、一歩進んで、右を向いて、なにもしない

Houdini の L-System ノードのパラメータに書くとこんな感じです。
PremiseA
Rule 1A=F+A

7回繰り返すと、こんな絵を描いてくれます。

Chapter 4 リファレンスの作例その3
次の作例は「コッホ曲線」です。
PremiseF-F-F-F
Rule 1F=F-F+F+FF-F-F+F

二次のコッホ曲線です。

リファレンスには、「指数関数的に生成される数が増えていくので、Houdiniでこのコッホ曲線を試す際は、 Generations パラメータを3よりも大きくしないでください。」と書かれています。
うっかり Generations パラメータを「7」(デフォルト)で試してしまったのですが、あちらの世界へ行って帰ってきてくれなくなりました(笑)。
Chapter 5 リファレンスの作例その4
次の作例は、「枝分かれ」です。
'[ ]'で囲ってあげると、その部分は、「枝」になります。
作例はこんな感じです。
PremiseA
Rule 1A=F[+F]F[+F][-F]

幹が一歩進む
右に枝を作る
幹が一歩進む
右に枝を作る
左に枝を作る

となります。
こんなのを描いてくれます。

Chapter 6 リファレンスの作例その5
次の作例です。
PremiseA
Rule 1A=F[+F][-F]F[+F]-FF


地味です(笑)。
学校の授業中は睡眠学習をしていた僕は眠くなります(眠)。
ところで、「F」とか「+」とかは、「タートル・コマンド」と言うそうです。
Chapter 7 リファレンスの作例その6
次の作例です。
ようやっと 3D です(笑)。
3D 用のタートル・コマンドが登場します。
が、しかし、コマンドというよりは、「記号」です(笑)。
PremiseFFFA
Rule 1A="[&FFFA]////[&FFFA]////[&FFFA]

「"」は、置き換えのたびに小さくして〜、っていう呪文です。
「&」は、垂直に曲がって〜、っていう呪文です。
「/」は、回転して〜、っていう呪文です。
描くとこうなります。
2次、つまり置き換えを2回した絵です。

7次、つまり置き換えを7回した絵です。

Chapter 8 リファレンスの作例その7
次の作例です。
タートルコマンド「{」は、ポリゴンを作ってくれます。
スゴイです。
L-System で Houdini をコントロールできちゃいます。
「.」は、ポイントを作って〜、っていう呪文です。
PremiseA
Rule 1A={.F+.F+.F+.F+.F+.}


Chapter 9 リファレンスの作例その8
次の作例です。
タートル・コマンド「J」「K」「L」は、「Copy to Point」ノードみたいに、ジオメトリをスタンプしてくれます。
L-System で作った枝に、L-System で作った葉っぱと花を散りばめてみました。
キレイです。
ちょっとだけ目が覚めました(笑)。
PremiseA
Rule 1A=[&FA[f(.01,0,0,0)K]]/////[&FA[f(.01,0,0,0)J]]///////[&FA[f(.01,0,0,0)J]]
Rule 2F=S/////
Rule 3S=F


Chapter 10 リファレンスの作例その9
次の作例です。
「エッジの書き換えというテクニック」だそうです。
これを書いている時点では、「エッジの書き換えというテクニック」が、どんなテクニックなのか、わかりません(笑)。
リファレンスに書いてある通りに試してみると、こんなことになります。
PremiseF(1,1,3,3,0)
Rule 1F(i,j,k,l,m):m=0=F(i,j,k,l,0)+F(i,j,k,l,1)+
Rule 2F(i,j,k,l,m):m=1=-F(i,j,k,l,0)-F(i,j,k,l,1)


Chapter 11 リファレンスの作例その10
次の作例です。
メタボールの境界で、L-Syatem の成長を止める、というものです。
いやー、メタボールって、初めて使いました(笑)。
そういえば、ボリューム関係は、ぜんぜん勉強していないです(笑)。
こんな感じです。
PremiseFA
Rule 1A:in(x,y,z)=F[+FA]-FA:80
Rule 2A:!in(x,y,z)=A%


Chapter 12 おわりに
というわけで、「L-System geometry node」のページに書かれた作例は、以上です。
超簡単ですが、これで終わります(笑)。
終わりますが、L-System はこれで終わりではありません。
Chapter 13 メモ
① 「L-System」ノードは、ほかのジオメトリノードを代替できそうです。
たとえば、「Curve」ノードの丸い絵を描く機能は「L-System」ノードで実現できますし、「Copy to Points」のスタンプ機能も、ある程度は「L-System」ノードで代替できます。
とは言うものの、ノードを一目見て、どんな機能を実現しているかがわかる、という点では、「Curve」ノードなどの専門家のノードを使う意味がありますし、「Copy to Points」ノードの「Pack and Instance」機能は「L-System」ノードでは代替できません。
そして、おそらく、スピードが速いとか、メモリの使用量が少ないとかでは、「Curve」ノードや「Copy to Points」ノードなどの専門家のノードのほうが、ずっと優れていることでしょう。

② L-System を使いこなすのはちょっとたいへんそうですが、タートル・グラフィクスは、すぐに使えそうです。
たとえば、周囲にぎざぎざのついた葉っぱとかは、Adobe Illustrator だと描くのをためらってしまったり、報酬額を見てしまったり(笑)してしまいますが、タートル・グラフィクスなら、数回の試行錯誤で描けてしまいそうです。
しかも、Houdini の中で描けてしまうので、すぐにポリゴンにして、厚みをつけたり、反らせたり、すぐにダイナミクスで舞わせてみたり、と、いろんなことができちゃいそうです。
Chapter 14 最後にひとこと
to be continued .