2 ポイント 投稿者 GN⁺ 2023-12-20 | 1件のコメント | WhatsAppで共有
  • リアルタイムで火や煙のような流体をシミュレーションするための数学、アルゴリズム、手法に関するノートとソースコード(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⁺の意見:

  1. この記事は、リアルタイムで火や煙のような流体をシミュレーションする複雑な過程を説明しており、これはコンピュータグラフィックスやゲーム開発において非常に重要なテーマである。
  2. 近年の GPU の進化により、複雑な流体シミュレーションをリアルタイムで処理できるようになり、視覚的に魅力的なゲームや映画の特殊効果の制作に貢献している。
  3. この記事はナビエ–ストークス方程式や渦度閉じ込めのような高度な数学的概念を扱っており、この分野に関心のある初級ソフトウェアエンジニアに有益な情報を提供している。

1件のコメント

 
GN⁺ 2023-12-20
Hacker News のコメント
  • CFD(数値流体力学)の博士号を持つ者として、渦度拘束法やカールノイズ乱流について聞いたことがなかったと認める。毎日新しいことを学ぶものだと実感する。
    • 産業分野のCFDでは高レイノルズ数を扱うため、数値手法の人工的な散逸を打ち消すためにノイズを加えるのは望ましくない。実際、多くの人は高レイノルズ数シミュレーションを安定化するために人工的な散逸を求めている。コンピュータグラフィックス分野の要件は、物理的な正確さよりも正しく見えることに重きが置かれている。
  • ゲーム向けの炎と煙のシミュレーションや、GPU上での流体シミュレーションへの言及がある。ゲームでこうした効果を動かす必要があるなら、GPUはすでに忙しいのではないかという疑問がある。CFD問題を解いて同時にレンダリングするのはかなりの作業に見える。
    • こうしたシミュレーションをiGPUで動かし、dGPUにより多くのレンダリング関連処理を任せられるのか、それともiGPUが非力すぎてCPUに切り替えるほうがよいのかという疑問がある。
  • "10 Minute Physics" という別の人による、この種の話題の解説がとてもよい。
  • 数学専攻からソフトウェアエンジニアに転向した人がCFDシミュレーションに興味を持っており、ベクトル解析や偏微分方程式を長いこと扱っていないため数学がかなりなまっているにもかかわらず、この分野を学びたいと述べている。
  • シンプルな流体シミュレーションを実装する動画を最近見て、とても興味深かった。
  • EmberGen はコンシューマー向けGPUでリアルタイムに炎と煙のシミュレーションを行う驚くべきソフトウェアで、ノードベースのワークフローに対応しているため新しい効果を簡単に作れる。
    • ワークフローが改善され、何時間もかかっていた作業が数分で完了するようになった。
    • EmberGen が Hacker News で大きな注目を集めなかったことに少しがっかりしている。(EmberGen/JangaFX とは無関係な、満足している顧客の意見)
  • 記事の主題ではないが、シミュレーションを選ぶと芸術的なコントロールを手放し、しばしば圧倒的な量のコントロールと苦しい折衝をしなければならない、という導入はやや誤っているという意見がある。
    • バルログのような重要なシーンでは、シミュレーションに任せるのではなく、すべてのフレームを完全にコントロールしたいはずだ。
    • トールキン風ファンタジーの例では、川が何度も曲がりくねり、いくつか岩があり、ときどき魚が跳ねるような風景シーンは、シミュレーションのほうが適している。
  • 64GB のRAMを積んでいるのに、そのページがタブを完全にクラッシュさせてしまう問題に遭遇した。
  • コンピュータグラフィックスの爆発表現がなぜひどいのかについて、よい説明をしている動画へのリンクがある。
  • distill.pub のテンプレートとページ構築システムの出力にとても感銘を受けたが、2021年に終了して以後メンテナンスされていないのが残念だ。