L-systemで植物を描く
L-system入門(2013/11/26)の続き。
前回は、L-systemで有名なフラクタルを描きましたが、今回は植物を描いてみます。植物を描くためには前回導入した記号に加えて次の2つの記号を新たに導入します。
[ : 亀の状態(位置と向き)をスタックにプッシュ ] : 亀の状態をスタックからポップ
この2つだけです。スタックからポップするときは、亀の位置が変わりますが、その間は線を引きません。NetLogoで書くと下のようなコードになります。ここで、(xcor, ycor)が亀の位置、headingが亀の向いている方向です。
; タートルの状態をプッシュ if action = "[" [ let turtle-state (list xcor ycor heading) set stack lput turtle-state stack ] ; タートルの状態をポップ if action = "]" [ pen-up let turtle-state last stack set stack but-last stack set xcor item 0 turtle-state set ycor item 1 turtle-state set heading item 2 turtle-state ]
この2つの記号を使って、植物のような絵を描いてみます!初期文字列はすべてFです。
なかなか美しい植物ではないでしょうか?もっとリアルな植物を描きたいときは、L-systemに葉っぱを付けたり、花をつけたりするコマンドを用意することもできるようです。Lindenmayerさんの本には、下のような花の例が載っています。
この花は、下の初期状態と書き換え規則から生成されるそうです。
L-systemの拡張はたくさん提案されていて、
- 規則を文脈依存にする(書き換え規則の左側で複数文字列OK)
- 複数の規則を確率的に選択する
- 文字列にパラメータを導入する
- 様々な拡張記号を導入する => L-systems: from the Theory to Visual Models of Plants (PDF)
- 3Dで描画する
- 遺伝的アルゴリズムで進化させる
などがあります。例えば、munimuniさんのこの動画は3Dの木の高さと広がりを適合度として遺伝的アルゴリズムで木を進化させているみたいです。けっこう自然な木ができるので驚きました。
他にも「盲目の時計職人」で紹介されているバイオモルフのように適合度を人間が決める人為淘汰を導入するとさらに面白そうです。
- 作者: リチャード・ドーキンス,日高敏隆,中島康裕,遠藤彰,遠藤知二,疋田努
- 出版社/メーカー: 早川書房
- 発売日: 2004/03/24
- メディア: 単行本
- 購入: 10人 クリック: 112回
- この商品を含むブログ (51件) を見る
3DレンダリングソフトのBlenderには、L-systemでリアルな樹木を描くプラグインがあるので今度試してみたいと思います。Skyrimなどの3Dゲームでも普通に使われている技術なんでしょうかね?