インクを水に落とすシミュレーション(Stable Fluids)
概要
Stable Fluidsを用いて、水中にインクが落下して広がる様子をリアルタイムにシミュレーションする。流体の動きは GPU 上で計算され、流れの速さを表す速度場(velocity)と、インクの量を表す密度場(density)を画像として保持しながら更新している。物理的に正確な解析を目的とするものではなく、計算が不安定になりにくい手法を用いて、連続した見た目の流体表現を得ることを目的としている。 公開
https://scrapbox.io/files/695aa0146dfeea52ae7b1944.png
一定時間インクが同じ箇所に投下される。
画面をクリックすると初期状態に戻り、同じ条件で再度挙動を観察できる。
実装
画面全体を覆う平面に対して計算と描画を行う。
流体の状態は複数のバッファに分けて保存され、各バッファを順番に更新することで時間の進行を表現する。
流体計算
毎フレーム、次の処理を順に行う
1. インクと速度の追加(splat)
画面上部の一点にインクの量(density)と初期的な動き(velocity)を加える。
2. 浮力の加算(buoyancy)
インクの量に応じて上下方向の力を速度に加え、水中での動きを作る。
3. 速度の移動(移流 / advection)
現在の速度を使って、次の時間の速度分布を計算する。
ここでは計算が壊れにくい方法(Semi-Lagrangian)が使われている。
4. 発散の計算(divergence)
流れが広がったり縮んだりしている度合いを数値として求める。
5. 圧力の計算(pressure)
発散を打ち消すための圧力を反復計算で求める。
6. 速度の補正(pressure gradient subtraction)
圧力の差を使って速度を修正し、体積が保たれるようにする。
7. インクの移動(密度の移流)
修正後の速度に従って、インクを流れに沿って移動させる。
描画処理
密度の大きさをもとに色を決め、水の背景色と合成して表示する。
色や明るさの調整は見た目を整えるためのもので、流体計算そのものには影響しない。