HEXA BLOG

研究・開発

HEXA BLOGその他研究・開発2009.8.27

空気や水の対流を表現してみよう

こんにちは!イワサキですわーい(嬉しい顔)
とろけるような暑さがあると水!プール!海!な感じな私です。
川で泳いだりするときの水の流れや扇風機であ゛~としているとき風の涼しさを感じる機会がある季節です。
特に冷え症の方では冷房空調で空気の流れが気になったり、淀んだ場所は暑くなったりと室温のムラを感じることもありそうです。
ここ数日多少ましになってきましたがまだまだ暑い日は続きますね!
風や水流台風っていったいどんな風になっているんだろう?
そんなわけで今回はそんな興味から、お題は『空気・液体の流れのシミュレーション』をやってみたいと思います。
最近のゲームをプレイすると水面などはチャポチャポ揺れるものはあっても川に落ちた落ち葉の流れなんかが自然に流れていく、といったものはまだあまり正確に表現されていません。
これはもちろん現在のゲーム機自体の性能でそういった表現にパワーを割く余裕がないから省略されているわけですが、この「流れ」自体にゲーム性を持たせられないかなぁ?と思ったりもしています。
以前に流体シミュレーションということでSPH法を使った粒子法を紹介しました。今後MPS法にも挑戦してみたいと思います!
粒子法のようなパーティクルベースの流体では「水しぶき表現が柔軟に実現可能」というメリットがあります。
今回は粒子法ではなく、別の方法を紹介してみようということで格子形状を使ったグリッドベースの実装をしてみたいと思います。
グリッドを使ったシミュレーションはシミュレーションする領域が均一に広がるということや流れの解析にメリットがあります。
(もちろん粒子法のMPS法でもこのような表現は可能です)
個人的にはゲームの中で、舞い散る落ち葉の動きや、空気が淀んだ場所には吹き溜まりができていたり、水流で物が流れていったり等インタラクティブに表現できたら良いなぁ…と思っています。
今回、実験で作成したのは『格子ボルツマン法(Lattice Boltzmann Method)』と言われる手法です。
読んでみる書籍としては書籍は下記のものがお勧めです(とはいえ内容は数式に満ちていますが…)

■格子気体法・格子ボルツマン法―新しい数値流体力学の手法

2009-08-27-book.jpg

蔦原 道久 (著), 片岡 武 (著), 高田 尚樹 (著)
構造は実にシンプルです。
空間を格子で区切り、それぞれに圧力(気圧)情報を持たせて高い圧力の部分から隣接する低い圧力の部分へ流れ込むように流れが変化するという格子気体モデルという考え方です。
圧力を均一に保とうとする自然界の物理現象をシミュレートします。
「流れ込む分子量」と「押し出される分子量」の合計でその領域の速度を決定するというアルゴリズムです。

2009-08-27-lbm0.png2009-08-27-lbm1.png2009-08-27-lbm2.png

他の技術系の話と違ってこのアルゴリズムは日本語の文献が多くて助かりますね。

2009-08-27-lbm.png

技術的な計算部分は割愛しますが、今回は3次元27速度(D3Q27)モデルを使っています。

2009-08-27-st1.png2009-08-27-st2.png2009-08-27-st3.png
【格子ボルツマン法の計算フロー】流体は衝突を繰り返しながら直進(並進)します。

Youtubeに同様に流体のシミュレーションをしている動画がありましたのでご紹介しておきます。

大抵このようなシミュレーション系の計算のために文献を読むと難しそうな数式が並びます。
例えば今回のものの中から抜粋するとこんな感じです。
2009-08-27-lbm_math.png
難しそうに書いてありますが、実はC言語で記述すると大して難しい計算ではありません。次のようになります。
2009-08-27-source.png
私個人的にはこの数式たちが理解の敷居を高くしてしまっているような気がするんですよね(もちろん演算の意味を伝えるためにスマートに書くのに適しているというメリットもあるようですが)
この式が今回の挙動計算の肝になっています。
流れの具合がよくわかるように中にパーティクルを配置して流れに乗せて動かしてみます。
これで渦や流れがよくわかるようになります
書籍では「GPU Gems 2」にもこのアルゴリズムが紹介されています。
【参照】Chapter47. 複雑な境界を持つ流れのシミュレーション p687


今回のデモではちょっとゲームっぽくインタラクティブにするためにリアルタイムでいじれるようにしてあります。
2009-08-27-flow_1.jpg2009-08-27-flow_2.jpg
区切られた部屋の中にポンプや扇風機のように流れを強制的に発生させます。
そして、その影響を受けて複雑な対流が発生します。
壁仕切りや球体などの障害物も設置できるようにしました。
技術デモは下記よりダウンロード可能です。
◎動作可能な環境
GeForce 6800シリーズ以降
Radeon X1000シリーズ以降
基本的にはシェーダーモデル3.0以降で動作します。
レイトレーシングなど特殊なレンダリング手法を用いていますのでドライバの不具合などで一部動作しない環境があるかもしれません。
なるべく最新のデバイスドライバで実行してください。
Download
HexaFlow.zip (約2.0MB)
【動作確認済ハードウェア】
nVIDIA GeForce9800GT
AMD RadeonHD4350
【操作方法】
画面左クリック&ドラッグ    視点を回転
    パーティクル配置を初期化
    ポンプ ON/OFF
    横仕切り板 ON/OFF
    縦仕切り板 ON/OFF
    球体 ON/OFF
2009-08-27-flow_3.jpg2009-08-27-flow_4.jpg


実行環境を持っていない方のために動画を用意しました。
HD解像度で閲覧可能です。


複雑な流れで渦巻く様子が楽しいでするんるん
こういう動くものは眺めているだけで面白いですよね。もう少しビジュアル面を強化してスクリーンセーバーにしてみるのも良いかもしれませんね。
「ゲームCG」を切り口にこのような解析系の技術を応用するのは今後増えてきそうです。
最たる例は最近のゲームでは当たり前のように使われている剛体物理シミュレーションです。リアルにするには現実に起こる物理現象をシミュレートする必要が出てきますので、あらゆる分野の知識が求められます。
今回は数値流体力学(Computational Fluid Dynamics)の分野を取り上げてみました。今後は別の分野もご紹介できればいいなと思います。
剛体シミュレーションがメジャーになってきて、今後流体やソフトボディのような柔らかいものが流行りそうな雰囲気です。
CG関連の国際会議SIGGRAPHでの発表論文の中にもゲームに応用できる内容が沢山ありますので注目です!
実はこのデモのGPU版も作成してあります。今回のデモではCPUで約6万個のパーティクルで実験しましたが、GPU版では30倍以上の約209万個(128^3個)でも楽に60fpsが維持できていました。
ということは、数万個程度であればGPUの力を借りることができればゲームにも比較的軽く組み込めるということになります。
この技法を応用することで舞い上がる砂埃や吹雪、落ち葉、煙などの動きがリアルに表現できます。『爆発で周辺のチリが吹き飛ぶ』などの表現も可能になります。
このようにゲームでは今まで無かったような表現が他の分野では当たり前のように利用されていることがあります。
クリエイティブな職種ですのでゲーム業界を超えた他の業種・職種を知ることも大切だと思います。
どこに「ゲームやCG表現のヒントひらめき」が隠されているかわかりませんからネぴかぴか(新しい)ぴかぴか(新しい)ぴかぴか(新しい)
ちなみに以前の流体デモもそうですが、私はこの手の分野を専門的に研究しているわけではありません。
たまたま『見た目が面白そうだったから』という好奇心でちょっと作ってみたものです。
ですので流体以外でもゲームに使えそうで面白そうなものがあればどしどし紹介していきたいと思いますわーい(嬉しい顔)
ヘキサドライブでは自社内製ゲームエンジン「ヘキサエンジン」を開発しています。
共にゲーム作品を作っていきませんか?目
新卒・中途ともにご応募お待ちしています

RECRUIT

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

RECRUIT SITE