流体物理シミュレーションの基本的な流れ
煙を例にすると、図のような処理の流れでシーンの描画を行う。
この流れは、炎や水面についても基本的には同じだ。
まず、流体を配置する場所を決定する。
この図では、水色になっている部分に煙がたちこめると仮定している。
この例では、煙が上へ上るという想定をしてるので、縦長の領域として決定しているが、煙が広範囲に散乱するような表現を行う場合にはこの水色の領域を広範囲にとる必要がある。そしてその場合、シミュレーションを行う際のワークメモリ(ボクセル)を多く消費する。
そしてこの水色の領域を単位立方体に離散化する。つまり、空間を縦横に分割して小さな箱単位に管理する。この単位立方体の箱がボクセルだ。
シミュレーション計算は全てのボクセル単位で行う。
シミュレーションによってボクセルの中に記録されたシミュレーションパラメータはただの数値でしかないので、3Dグラフィックスとしてレンダリングする際には、このボクセル達を可視化(描画)していかなければならない。
この描画にはボリュームレンダリングというテクニックを使う。具体的には、ある画素を描画する際、その画素はボクセルをどういうふうに突っ切っているのかを計算する。
これを実際にNVIDIAがDirectX 10世代/プログラマブルシェーダ4.0(SM4.0)対応GPUであるGeForce 8000シリーズ向けに実装したのがこれだ(下ムービー)。
このデモはNVIDIAの開発者向けサイトで公開されている「NVIDIA Direct3D SDK 10」に収録されている「Smoke」だ。
SDK(Software Develeopment Kit)と聞くと難しそうなイメージがあるが、見応えのあるデモソフトがたくさん収録されており、インストール後はデモブラウザを起動して「Run」をクリックするだけで簡単に見ることができるので、GeForce 8000シリーズのユーザーはぜひともその目で見てみて欲しい。