人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

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です。

f:id:aidiary:20131126201327p:plain
f:id:aidiary:20131126201332p:plain
f:id:aidiary:20131126201335p:plain
f:id:aidiary:20131126201339p:plain
f:id:aidiary:20131126201342p:plain

なかなか美しい植物ではないでしょうか?もっとリアルな植物を描きたいときは、L-systemに葉っぱを付けたり、花をつけたりするコマンドを用意することもできるようです。Lindenmayerさんの本には、下のような花の例が載っています。

f:id:aidiary:20131126202304p:plain

この花は、下の初期状態と書き換え規則から生成されるそうです。

f:id:aidiary:20131126202336p:plain

L-systemの拡張はたくさん提案されていて、

  • 規則を文脈依存にする(書き換え規則の左側で複数文字列OK)
  • 複数の規則を確率的に選択する
  • 文字列にパラメータを導入する
  • 様々な拡張記号を導入する => L-systems: from the Theory to Visual Models of Plants (PDF)
  • 3Dで描画する
  • 遺伝的アルゴリズムで進化させる

などがあります。例えば、munimuniさんのこの動画は3Dの木の高さと広がりを適合度として遺伝的アルゴリズムで木を進化させているみたいです。けっこう自然な木ができるので驚きました。


物理エンジンで木を作った - YouTube

他にも「盲目の時計職人」で紹介されているバイオモルフのように適合度を人間が決める人為淘汰を導入するとさらに面白そうです。

盲目の時計職人

盲目の時計職人

  • 作者: リチャード・ドーキンス,日高敏隆,中島康裕,遠藤彰,遠藤知二,疋田努
  • 出版社/メーカー: 早川書房
  • 発売日: 2004/03/24
  • メディア: 単行本
  • 購入: 10人 クリック: 112回
  • この商品を含むブログ (51件) を見る

3DレンダリングソフトのBlenderには、L-systemでリアルな樹木を描くプラグインがあるので今度試してみたいと思います。Skyrimなどの3Dゲームでも普通に使われている技術なんでしょうかね?