論文メモ Fast Eulerian Fluid Simulation In Games Using Poisson Filters (SCA 2020 Showcase)

www.youtube.com

概要

2次元Euler流体を用いた2.5次元インタラクティブ流体エフェクトに関するShowcase。
圧力Poisson方程式のJacobi法ソルバの反復数を大幅に削減し高速化するPoisson (Separable) Filterを提案。

Poisson Filter

圧力Poisson方程式のJacobi反復は、前回の反復での圧力値に対して再帰的に定数フィルタ3x3をかけ合わせているものとみなせる(3次元なら3x3x3)。
N回のJacobi反復を1回の畳み込みフィルタに解析的に変換することで反復数を削減することができる。
事前計算でこの畳込みフィルタを求めておくことでランタイムでの圧力反復計算を大幅に高速化する。

f:id:nagakagachi:20201210213053p:plain
引用1

近傍の初期値にN回のフィルタを掛けた結果とおなじになるようなフィルタを事前計算して利用するということ。
定数重みを掛けて足し合わせるフィルタをN回掛けた場合の、近傍初期値の足し合わせ重みは地道に手計算することでも確認ができそう。

Poisson Separable Filter

畳み込みフィルタ化によって反復数を1回にすることができるが、N回分をまとめたことにより広範囲をサンプリングするフィルタとなり、計算量は非常に多くなってしまう。
canonical polyadic decomposition (CPD) でRank1のMatrixの和に変換し、それぞれを特異値分解(SVD)で Nx1. 1x1, 1xN の行列積に変換する(1x1は特異値(Scalar)になる)。
ここで特異値が最大のものだけを選ぶことで、元の行列の性質をある程度残しながらNx1と1xNの縦横に分離された Poisson Separable Filter が得られる。

f:id:nagakagachi:20201210220549p:plain
引用

このようにして得られた Filter は Total variance explained が83%以下にはならないらしい(これが元の性質をある程度残しているということ?)

このフィルタは中心部から離れた要素の重みが小さいため、それらを切り捨てることでさらにフィルタサイズを小さくすることができる(~80% redundant)。
また、重みが対称的であるため実際に必要とする重みデータは更に圧縮することができる。

反復数が1回になったこととフィルタサイズの削減により、反復数が小さい場合には4.5倍、100反復では30倍程度高速化することができた。

2.5Dシミュレーション

シミュレーションは2D-Gridで実行しているが、カメラの向きに応じて高さや傾きを補正することであたかも3D空間でシミュレーションされているようにみせている。
外力や風は3Dから2Dへ投影することでシミュレーションに取り込まれる。

f:id:nagakagachi:20201210221945p:plain
引用
f:id:nagakagachi:20201210222014p:plain
引用

3Dオブジェクトとのコリジョンは深度バッファベースの手法を利用している。

アーティストワークフロー

マスク画像によって炎や煙の生成部をコントロールする。

f:id:nagakagachi:20201210222216p:plain
引用

What is Next?

Poisson Filterの3次元への拡張
Multi-Runk + Rank Selector ( 負荷と品質のトレードオフができるように )
粘性拡散項への対応

感想

Jacobi法の再帰的構造に注目して1回の畳み込みフィルタに変換するというのは目からウロコだった。
他の分野でも使えそう(使われていそう)なので身につけたい。
フィルタを特異値分解して次元削減+Separableにするというのも応用が効きそう。
実装してみたいがまず解析的に畳み込みフィルタに変換する部分があやふやなので実際にPythonあたりで試してみたい。