LAB
研究室
デモプログラム
【対流シミュレーション(格子ボルツマン法)】 – Flow simulation (Lattice Boltzmann Method) –
粒子法のようなパーティクルベースの流体では「水しぶき表現が柔軟に実現可能」というメリットがあります。
今回は粒子法ではなく、別の方法を紹介してみようということで格子形状を使ったグリッドベースの実装をしてみたいと思います。
グリッドを使ったシミュレーションはシミュレーションする領域が均一に広がるということや流れの解析にメリットがあります。
(もちろん粒子法のMPS法でもこのような表現は可能です)
個人的にはゲームの中で、舞い散る落ち葉の動きや、空気が淀んだ場所には吹き溜まりができていたり、水流で物が流れていったり等インタラクティブに表現できたら良いなぁ…と思っています。
今回、実験で作成したのは『格子ボルツマン法(Lattice Boltzmann Method)』と言われる手法です。
読んでみる書籍としては書籍は下記のものがお勧めです(とはいえ内容は数式に満ちていますが…)
蔦原 道久 (著), 片岡 武 (著), 高田 尚樹 (著)
構造は実にシンプルです。
空間を格子で区切り、それぞれに圧力(気圧)情報を持たせて高い圧力の部分から隣接する低い圧力の部分へ流れ込むように流れが変化するという格子気体モデルという考え方です。
圧力を均一に保とうとする自然界の物理現象をシミュレートします。
「流れ込む分子量」と「押し出される分子量」の合計でその領域の速度を決定するというアルゴリズムです。
他の技術系の話と違ってこのアルゴリズムは日本語の文献が多くて助かりますね。
技術的な計算部分は割愛しますが、今回は3次元27速度(D3Q27)モデルを使っています。
【格子ボルツマン法の計算フロー】流体は衝突を繰り返しながら直進(並進)します。
Youtubeに同様に流体のシミュレーションをしている動画がありましたのでご紹介しておきます。
難しそうに書いてありますが、実はC言語で記述すると大して難しい計算ではありません。次のようになります。
この式が今回の挙動計算の肝になっています。
流れの具合がよくわかるように中にパーティクルを配置して流れに乗せて動かしてみます。
これで渦や流れがよくわかるようになります
書籍では「GPU Gems 2」にもこのアルゴリズムが紹介されています。
【参照】Chapter47. 複雑な境界を持つ流れのシミュレーション p687
今回のデモではちょっとゲームっぽくインタラクティブにするためにリアルタイムでいじれるようにしてあります。
そして、その影響を受けて複雑な対流が発生します。
壁仕切りや球体などの障害物も設置できるようにしました。
技術デモは下記よりダウンロード可能です。
◎動作可能な環境
GeForce 6800シリーズ以降
Radeon X1000シリーズ以降
基本的にはシェーダーモデル3.0以降で動作します。
レイトレーシングなど特殊なレンダリング手法を用いていますのでドライバの不具合などで一部動作しない環境があるかもしれません。
なるべく最新のデバイスドライバで実行してください。
Download
HexaFlow.zip (約2.0MB)
【動作確認済ハードウェア】
nVIDIA GeForce9800GT
AMD RadeonHD4350
【操作方法】
画面左クリック&ドラッグ 視点を回転
Z パーティクル配置を初期化
X ポンプ ON/OFF
C 横仕切り板 ON/OFF
V 縦仕切り板 ON/OFF
B 球体 ON/OFF
実行環境を持っていない方のために動画を用意しました。
CATEGORY
- 製品事例 (7)
- デモプログラム (18)
- プログラムTIPS (41)
- C言語 (5)
- C++ (6)
- C++cording (4)
- Ruby (8)
- VisualStudioの使い方 (3)
- 最適化Tips (5)
- ゲーム開発テクニック (2)
- その他 (7)