イベント
[GDC2008#48]ハイトフィールドを使った実用的な流体表現
ハイトフィールドとは,水面の高さを示すバッファを操作して液体表現を行うもの。2.5次元(つまり,モノは3次元なのだがデータ構造が2次元ですみ,簡単に扱える)形状の波しか描画できないという制限はあるものの(逆巻く波は無理),その範囲でなら十分にそれっぽい液体を高速に表現できる手法だ。
まず最初に,動画から見てもらったほうがいいかもしれない。
講演を行ったMatthias Muller-Fischer氏は,液体表現でもっとも基礎となるコードを挙げ,これはC言語における“Hello World”と同じものだとした。uとvの二つの配列をループ内で処理していく簡単なコードだ。
また,ハイトフィールド以外の波の作り方をいくつか挙げていたが,とくにオフラインで計算する手法では512×512×512という大容量のボクセルを使い,1フレームあたり10〜50秒もかけてレンダリングが行われる。さすがに画像は綺麗で水の挙動も問題ないのだろうが,ゲームで使うには,もっとローコストでなければならないのはいうまでもない。
最初に示した式のように,ループ内でデータを加算していると,値が大きくなりすぎるなど,発散して破綻してしまうことがある。この場合,いくつか対処法があるのだが,結局のところ,物理的に正しい処理を行うとコストがかかったり,うまく丸め込める保証をすることが難しくなる。範囲外になったら切り捨てるような処理は物理的には正しくない。しかしそういった割り切りもリアルタイム処理では必要になるようだ。
波頭が立つような大きな波はハイトフィールドでは実現できないわけだが,そういう状態になる部分から別途パーティクルを生成することで波頭を実現することもできる。そういったハイブリッドな液体表現の研究も行われているという。
別の記事で述べたように,コストを十分にかければパーティクルによる液体表現は自由度が高く,今後検討するに値する技術である。しかし,液体を扱う多くの場合においてハイトフィールドでまかなえることも事実であり,あくまで現状で“使える”技術としての意義は失われるものではない。PhysXでは,登場当時からの車に水がかかるデモなどで見られるように,パーティクルによる液体の表現が追求されている(粗くていま一つ自然ではないが)。PhysX用のSDKでは,近くハイトフィールド用のライブラリが追加され,簡単なコードで実装できるようになるとのことで,より実用的な液体表現が加わることになる。
NVIDIAに吸収され,どうなることかと思われたAGEIAだが,今後はCUDAなどにも技術が移され,より広い形でゲームに反映されていくと思われる。PhysX PPUなしでも物理エフェクト全開のゲームが多く登場することを期待したい。
- この記事のURL: