HEXA BLOG

研究・開発

HEXA BLOGその他研究・開発2011.6.17

【プロシージャル生成】植物生長シミュレーション

こんにちは、イワサキです。わーい(嬉しい顔)
さて、今日は技術的な話題ということで『植物のプロシージャル生成』のお話をしてみたいと思います。
昨今ですとCRY ENGINEなども搭載している機能ですね。
技術トレンドもプロシージャル生成を併用して自動化していくようになることが考えられますので
ヘキサドライブでも技術的な部分を研究を行なってみました。
植物生成をする際には一般的には「自己相似」「フラクタル」という概念を主に用います。
そのなかでも植物学者アリステッド・リンデンマイヤー(Aristid Lindenmayer)が提唱したL-systemというアルゴリズムあるようです。
詳細はWikipediaを御覧ください。
L-system (Wikipedia)
http://ja.wikipedia.org/wiki/L-system
数学的図形を再帰的に繰り返すことで植物などの形状を表現できるというものです。
そして、計算によって自動生成することをプロシージャル生成(Procedural generation)と言います。
しかしながら、単純にこれを実装すると、いかにもCG!というような規則的な形状が生成されてしまいます。
ゲームCGでは、プロシージャル生成を行なうとしても仮想世界を作る上で、よりナチュラルで現実世界に近い見た目で生成することが望ましいです。
私自身の趣味で密かにガーデニングをしているのですが、草木にふれあううちに植物の生命力の高さと巧妙さに驚きます。
まさに生命の神秘です。
2011-06-17-2.JPG2011-06-17-3.JPG
今回直接関係ない話ですが今年自宅で咲いたバラです。
植物とはどのように生命を営み、どのように生長繁茂していくのかという観点で、
今回はプログラマーとしての数学的見地ではなく、農業や生物学(理論生物学)的見地から植物生成を考えてみます。
どこかに似た文献がありそうですが、今回は計算方法などはオリジナルの手法です。
こういうのをCEDECとかで技術講演出来れば…
植物のプロシージャル生成についてはかなり以前からSpeedTreeをはじめ、多くの先駆者が研究を進めている分野です。
成長ホルモンをシミュレートするという考え方も以前から存在しており、2008年のCEDECでも講演発表されていました。
■CEDEC 2008 – コンピュータが知性でコンテンツを自動生成–プロシージャル技術とは(前編)
http://journal.mycom.co.jp/articles/2008/10/08/cedec03/001.html
動植物は設計図(DNA:デオキシリボ核酸)をもち、その設計図をもとに細胞を分裂させて増殖をして形作ります。
いろんな形の形成や動作などは分子からなる化学反応が動力になっています。
細胞の分裂や情報の伝達のきっかけは栄養素、つまり化学物質が大きな影響を及ぼしています。
今回植物生成するにあたって、普通にフラクタル再帰でモデル生成しているだけではリアルに見えないということで
上記の観点から栄養素と細胞分裂・幹細胞の変化を簡易的にシミュレートして実際に起こっている現象を再現して形状を生成したいと思います。
次のように現象を簡易モデル化したいと思います。

2010-10-14-0.png

ひらめき微量元素を省略して三大栄養素のみで構成(窒素・リン・カリウム)
ひらめき根からの吸収で各細胞へ栄養素の運搬を行なう。
各細胞で栄養素・成長(生長)ホルモンは呼吸によって消費され、余剰分が次の細胞に送られる。
ひらめき各細胞は栄養素を蓄積/消費するものとする
ひらめき仮想的な生長成長ホルモンを設定。(発根成長、幹の成長、枝の節の形成成長ホルモン、葉脈形成、葉肉形成)
各幹細胞内でこの成長ホルモンを蓄積させて濃度として管理

ひらめき一定の濃度しきい値を超えた場合に細胞は役割を変える。

2010-10-14-0.png

今回はすべてを行うと大規模なものになりますので、幹細胞は根と幹・枝に限定してワイヤーフレームでシルエットを描画してみたいと思います。
まずは実行プログラムを置いておきます。どのような具合かをみてもらったほうが解りやすいかなと思います。


このデモは以下からダウンロードすることができます。
地面を模して、根の形状と枝の形状をシミュレートします。
プロシージャル生成していますので、作る度に形状が変化します。
又、成長がほぼ止まった状態になっても、そのまま放置すると樹齢を重ねていきます。
年月の進行によって幹の太さや比率に味が出てきます。
(本当は先端の生長点も樹齢シミュレーションしたら、より良いのですが今回は省略しています)

◎動作可能な環境
 <動作条件>
 WindowsXP以降、DirectX9.0c
 ShaderModel 2.0 以降
2011-06-17-A.png2011-06-17-9.png
Download
HexaPlant.zip (約944KB)
───2011-06-20 追記
■節の形状の影響の計算を改良しました
■地上部への窒素供給量が本来よりも多かったためを修正しました。
■必要なシェーダー条件をShaderModel2.0に引き下げました。
───2011-06-21 追記
■幹の太さをマーカー表示するように追加しました。
───2011-07-15 追記
■成長時の栄養素消費量を減らして全体の流量を調整しました。
(以前よりも成長しやすくなっています)
■幹の太さを反映してラインで輪郭を簡易描画するようにしました。
───
【動作確認済ハードウェア】
NVIDIA GeForce GT 420
【操作方法】
マウスのドラッグで視点を回転
十字キー↑↓…肥料吸収量を増減
Zキー  … 幹・枝の太さ表示ON/OFF
スペースキー…リセット/再シミュレーション


木に身近に触れることがある方だとこの枝ぶりの生な感覚をなんとなく感じ取っていただけるかなと思います。
今回のデモの動作原理についてご紹介します。

2010-10-14-0.png

まずは原点座標に起点となる『種子』を置きます。ここから発芽し、根の生育と共に地面から栄養素を吸収して生長して行きます。
この仮想的な植物が吸収する総吸収窒素肥料量として、左側のバーにグラフで表示しています。十字キー上下で増減操作ができます。
肥料が少ないと矮小な貧弱なものになりますし、多いと果樹くらいの大きさになります。
ここで吸収する肥料は三大栄養素の窒素(N) リン(P) カリウム(K)です。これが元になって成長ホルモンが作成されます。
プログラム内ではVector3でNPKをxyzに入れて使用しています。
根から吸収された栄養素は成長ホルモンに変化し、道管を通じて各枝まで届けられます。
懐かしい…「維管束」とかあったっけ…理科テストに出たよな…
2011-06-17-4.png
各細胞内を通過する際にこの成長ホルモンを細胞に吸収させ加算します。呼吸によって消費もします。
残りの余剰分を次の先にある細胞へ送ります。
2011-06-17-5.png
上記の実装によって、根元ほど成長ホルモンが豊富にあり、根の先や枝葉にはその過程で消費した残りのものが存在することになります。
幹は富栄養、枝先は貧栄養になります。
枝(ノード)は成長ホルモンを吸収し生長します。枝自体の長さが伸びます。
最初は枝の太さは細く、生長が活発です。
植物の先端は「生長点」と呼び、徐々に幹の太さが太くなればなるほどその部分の伸びる能力が鈍り、幹を太くする方に栄養素が消費されます。
(プログラム上では幹の半径を大きくしながら、その太さを伸長係数に利用しています。)
2011-06-17-7.png2011-06-17-6.png
枝生成成長ホルモンが一定のしきい値を超えた場合にはノードを生成して分岐させます。
このとき、本流と支流の2方向に分けます。
この本流と支流の太さの比率も植物によって異なります。分岐ノードは栄養素を幹の太さの割合によって分配します。
これによって、枝分けが繰り返すうちに細くなり、枝の先端の栄養素量が薄くなります。
枝分けには形状生成に必要な閾値をつかって分岐設定します。
この閾値が『DNA』に相当します。DNAは生物の完全な設計図ではなく、幹細胞の分裂しきい値をもったものと言われています。
人間の指が5本だったり、左右対称だったり、いろいろDNAにフラクタル圧縮されてますよね。
今回は次のようなものを設定します。

2010-10-14-0.png

ひらめき枝振りの決定要素として、成長ホルモンの運搬経路と濃度変化を考慮する
 植物の栄養素は「道管」と呼ばれる経路を通り、各細胞へ運搬されます。
 枝や茎には、ぐるりと一周分「道管」が通っています。
 ここに節ができて枝分かれした場合は、その表面を通っていた栄養素は分岐した方へ流れます。
 そうすると、必然的にそのすぐ真上の側面は栄養素が薄くなります。
 次の節が形成される場合には成長ホルモンが薄くなっている場所には付かずに、濃いほうにつきます。
2011-06-17-8.png
 
 この原理で、植物は枝葉の位置が偏らず、たがい違いに枝をつけて生長します。
 生命の偶然の神秘はすごいですね。
 プログラムではこの道管内の濃度分布をシミュレートし、栄養素の濃いほうには節を付けるように補正します。
ひらめき太陽の方向がよく育つ
 太陽光を受けることで光合成します。光合成の栄養素は葉が最も多く、そこから道管で運搬されます。
 成長ホルモン濃度も日の当たるほうが濃くなります。
(プログラム上では真上に太陽があると仮定します)
ひらめき細胞の精度はバラつきがある
 各種しきい値は誤差が多く、各細胞で個体差が生まれます。
 これによって形状に揺らぎが出ます。(プログラム上ではある程度乱数範囲を持って対応します)
ひらめき枝は重力を受け、水平な枝は栄養素が片方に偏る
 つるバラなどはこの現象によって水平な枝に花が付きやすいと言われます。
 又、枝が空へ向かって伸びるのもこの影響があります。水平な枝は、下側の生長が早くなり、枝が上を向くように曲がってゆきます。
     2011-06-17-B.png
 プログラムでは道管の姿勢方向によって節の出来る方向をコントロールします。
ひらめき枝は分岐したあとでもその部分の生長を続けられるが、根は土中を広がっていくため、一度分岐したらその先しか生長していかないようにする。

2010-10-14-0.png

大まかですが以上のような現象をこのデモではシミュレートしています。
これによって、何回生成しても結構それっぽい形が出ているのではないでしょうか。
枝の分岐は栄養素の値のみで判定して分岐方向を決定しているだけですが、わりとそれらしいです。
※もちろんこの見た目や成長の具合は植物によって多種多様で、全ての植物に当てはまるわけではありません。
をつけるにもこれと同じ方法で付けることができます。
幹で特定の成分が消費された栄養素は葉に到達する頃には一部分の栄養素がなくなった状態で届きます。
その残りの栄養素の比率がしきい値となり、葉の形成細胞へ変化します。
これをシミュレートすると今回のデモで葉をつけることもできそうです。ぴかぴか(新しい)
又、剪定したり、枝が折れたりした場合の変化もこの技法では栄養素の動きを変化させることで表現できますので
それに合わせた生長の変化も表現することができてしまいます。ぴかぴか(新しい)ぴかぴか(新しい)
盆栽剪定シミュレーションゲーム』とか作れそうですね
剪定には「ヤゴ、幹ぶき、からみ枝、逆枝、ふところ枝、立て枝」など好ましくない向きの枝を切り落とすときれいな樹形になり良いという定石のようなものがあるのですが、これをゲーム内で表現してしまったりできると別のゲームになりそうです。
この手法だとこの逆枝のような現象も実際に今回のデモの画面内に自然現象として観察することができます。
内部的には枝や根の太さや、他のDNA的なパラメータを持っていますので、これを簡単に調整できる仕組みを作ればゲームに適用していけると思います。グッド(上向き矢印)
擬似的にいろいろ頑張って苦労するよりもがっつりシミュレーションしたほうが楽にリアリティが出せる例でした手(チョキ)


ヘキサドライブでは自社内製ゲームエンジン「ヘキサエンジン」を開発しています。
いろいろな技術を取り込んでゲーム開発を力強く加速させてみませんか?
新卒・中途ともにご応募お待ちしています。
皆さんに会えることを心待ちにしています手(パー)ぴかぴか(新しい)ぴかぴか(新しい)ぴかぴか(新しい)

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE