リアルタイムで流体、火、そして煙をシミュレーションする技術
(andrewkchan.dev)- リアルタイムで火や煙のような流体をシミュレーションするための数学、アルゴリズム、手法に関するノートとソースコード(GitHub)
1. 流体シミュレーション
- 火をシミュレーションする前に、まず流体をシミュレーションする必要がある
- 流体が非圧縮性かつ非粘性であると仮定すると、問題は大幅に単純化される
1.1 基本的な流体力学
- 空間の DDD 領域が流体で満たされており、時間 ttt における流体の速度が u(x,t) である
- 2D の速度場 u は N×N グリッドで表現できる
- 流体に染料を一滴落とすとどうなるだろうか?
- 染料の密度を表すスカラー場 ψ(x,t) を定義し、それが流体の速度によって移動することを advection と呼ぶ
- advection を計算するための Naive Method は、各グリッドポイントを移動させて最も近いグリッドポイントを更新することだが、並列化が難しく不安定である
Advection に関する偏微分方程式
- advection を安定して導出するには、明示的な PDE の表現が必要である
- 固定された空間領域 WWW 内の染料の総質量は ∫WψdV であり、時間に伴う質量変化は ddt∫Wψ(x,t)dV である
- 質量保存則により ddt∫WψdV=−∫Sψu⋅ndA となる
- 発散定理を適用すると ∫W[∂ψ∂t+∇⋅(ψu)]dV=0 となり、単位部分領域 W=dV に対して ∂ψ∂t+∇⋅(ψu)=0 となる
- これは私たちが解くべき明示的な PDE を与える
Advection の安定な手法
- eqn. (1) を詳しく見ると、右辺は −u 方向の方向微分である
- Semi-Lagrangian advection と呼ばれるこの手法は、1999 年に Jos Stam によって発明された
- 各グリッドポイントを 1 回だけ更新するため、並列化が非常に容易で、無条件に安定している
1.2 ナビエ–ストークス方程式
- 私たちは流体のスカラー特性が時間とともにどのように変化するかのモデルを見つけたが、流体の流れそのものはどうなるだろうか?
- ナビエ–ストークス方程式は、流体内のある点において速度場 u が時間とともにどのように変化するかを定義する
- 流体が非粘性であると仮定しているので μ=0 であり、外力もひとまず無視できる
- したがって、自己移流(self-advection)と圧力(pressure)の 2 つの項だけが残る
- 各タイムステップでこれらの項を数値的に計算して足し合わせれば、流体をシミュレーションできる
圧力の解法
- 新しい速度場が非圧縮性制約を満たしているかは分からないため、圧力項 p によってこれを修正しなければならない
- そのためにポアソン方程式を解く必要がある
- ポアソン方程式を解くために、Jacobi 法のような反復アルゴリズムを使うことができる
- Jacobi 法は GPU 上で並列実行できるため、実装が非常に簡単である
要約: ナビエ–ストークスシミュレーション
- ナビエ–ストークスの数学はやや複雑かもしれないが、方程式を解いて流体をシミュレーションする作業は、いくつかの主要な更新手順に要約できる
1.3 渦度閉じ込め(Vorticity Confinement)
- グリッドを使って速度場を保存するのは非常に便利だが、グリッドポイント間の値を補間するときに望ましくない数値的スムージングが発生する
- その結果、流れの乱流渦が消えてしまい、全体として過度に滑らかで「退屈な」流体の流れになってしまう
- 渦度閉じ込めは、こうして失われた渦度を増幅する処理である
- 渦度閉じ込めは、ヘリコプターブレード周辺の非常に複雑な流れ場を解くために考案された
- 渦度は u のカールを取ることで各点で計算され、渦度を増幅するために各点に円形の流れを加える
Curl-Noise Turbulence
- Curl noise は渦度閉じ込めに似た手法で、速度場の渦度を測定して増幅する代わりに、ノイズ関数を使ってスカラー渦度場を最初から生成する
- 速く動き、非常に乱流的な流体ほど、渦度閉じ込めと curl noise の恩恵を最も受ける
2. 火のシミュレーション
- 火と煙をシミュレーションするには、燃料と温度を表すチャンネルを追加し、燃料の燃焼をモデル化して熱を生成しなければならない
- また、熱の多い流体部分が熱浮力モデルに従って上昇することを扱い、炎を正しくレンダリングする必要がある
2.1 基本的な燃焼モデル
- 化学的には、火は燃料物質の酸化反応によって発生し、熱と光を放出する
- 燃料の密度を表すスカラー場 ρ と、温度を表すスカラー場 T を定義する
- 燃料が燃焼して系に温度を加え、温度は高温の場所から低温の場所へと拡散する
- 熱対流はこの 2 つの過程の結合として定義され、私たちはすでにこれをモデル化する数学的モデルを持っている - advection!
GN⁺の意見:
- この記事は、リアルタイムで火や煙のような流体をシミュレーションする複雑な過程を説明しており、これはコンピュータグラフィックスやゲーム開発において非常に重要なテーマである。
- 近年の GPU の進化により、複雑な流体シミュレーションをリアルタイムで処理できるようになり、視覚的に魅力的なゲームや映画の特殊効果の制作に貢献している。
- この記事はナビエ–ストークス方程式や渦度閉じ込めのような高度な数学的概念を扱っており、この分野に関心のある初級ソフトウェアエンジニアに有益な情報を提供している。
1件のコメント
Hacker News のコメント