煙の流体シミュレーターベータ

ドラッグで色付きの煙をかき混ぜるリアルタイム流体シミュレーション

このツールはまだ安定化中のベータ版です。結果に違和感があればお知らせください。

流体エンジン(WebAssembly)を読み込み中…

画面をドラッグすると、その方向へ流体を押しながら色付きの煙をまきます。毎フレーム、Jos Stam の Stable Fluids 法で速度場を拡散(粘性)・移流させ、圧力を解いて発散ゼロに投影するので、渦が自然に生まれます。まいた煙は熱いので浮力で立ちのぼり、冷えるにつれてゆっくり止まります。渦の保持(渦度閉じ込め)は格子のせいでつぶれる小さな渦をよみがえらせ、煙のふちを巻き上げます。粘性を上げると蜂蜜のようにとろりとし、消える速さを0にすると煙は消えません。

煙の流体シミュレーターについて

このツールは、ジョス・スタムが1999年のSIGGRAPHで発表したStable Fluids法に従っている。正方形の格子(64²、128²、192²から選択)に速度場と赤・緑・青3色の染料濃度を持たせ、毎フレーム、速度は拡散(粘性)→投影→移流→投影、染料は拡散→移流→減衰の順に更新する。画面をドラッグすると、指の位置にガウス分布の形で速度と染料を加える。

名前のとおり煙らしく動くよう、温度と浮力を入れた。まいた煙は熱いので上向きの力(浮力)を受け、流れに運ばれながら毎秒約45%ずつ冷めて、だんだん浮かなくなる(Fedkiwら2001の方式)。色の染料そのものは流れを押さない追跡子だ。浮力スライダーを0にすると煙は立ち上らず、自分が加えた動きだけが広がって弱まる。四方は閉じた壁だ。

「stable」が意味するもの

以前の陽的な方法は、1フレームで流体が1マス以上動くと値が発散した。スタムの方法は2つの工夫でこの制限をなくした。1つは移流を「このマスの値は1フレーム前どこにあったか」を逆にたどり、その位置を補間して持ってくるセミラグランジュ法で解くこと。補間値は周りの値の間に収まるので、新しい極値は生まれない。もう1つは粘性拡散を陰的に解くことで、係数が大きくても発散しない。

代わりに精度を払っている。補間のたびに小さな渦が少しずつならされる数値粘性が生じる。粘性スライダーを0にしても渦がだんだん弱まるのはそのためだ。解像度を64²に下げると渦は早く消え、192²に上げると細い筋が長く残る。2001年にはフェドキウ、スタム、イェンセンが失われた回転を補う「渦度閉じ込め(vorticity confinement)」項を加えたが、このツールでも「渦の保持」スライダーでその項を加えられる。上げると煙のふちが細かく巻き上がり、上げすぎると流れががたつく。

投影:渦がひとりでに生まれる理由

水や遅い空気はほとんど圧縮されない。格子で言えば、各マスに入る量と出る量が等しい(発散ゼロ)必要がある。投影ステップは、速度場に生じた発散を圧力とみなして取り除く。そのためのポアソン方程式を過緩和(SOR、ω = 1.8)付きのガウス=ザイデル反復で解いている。格子が大きいほど収束が遅いので、反復回数を解像度に合わせて増やす(64²・128²は20回、192²は30回)。

画面をまっすぐ短く1回なぞると違いがわかる。前へ押された流体は行き場がなく左右へよけ、後ろの空いた所は横から埋まる。その結果、なぞった跡の先端の両側に逆向きに回る渦が1対できる。誰かが渦を描いたのではなく、体積を保てという条件1つがつくった形だ。反復回数は決まっているので発散は完全にはゼロにならないが、以前の20回のガウス=ザイデルでは192²で速度勾配の約17%残っていた発散が、いまは約2%まで減った。

スライダーが実際に変える値

  • 粘性:スライダー値 × 10⁻⁴ が動粘性係数(領域の幅を1とする)になる。最大10で10⁻³。128²格子で1フレーム(1/60秒)の拡散係数 a = dt·ν·N² ≈ 0.27 となり、なぞった跡が数秒でぼやける蜂蜜のような流れになる。
  • 煙のにじみ:染料だけを拡散させる(スライダー × 10⁻⁵)。流れはそのままで、色の境目だけがぼやける。
  • 消える速さ k:毎フレーム染料に e^(−k·dt) を掛ける。初期値0.3なら半減期は ln2 ÷ 0.3 ≈ 2.3秒、3なら0.23秒。0なら数値誤差以外では減らない。

ゲームや映像がこの方法を使った理由

Stable Fluidsは物理的に最も正確な方法ではなく、どんな時間刻みでも破綻しない方法だ。毎フレーム決まった時間内に結果を出さなければならないリアルタイムCGでは、この性質が精度より重要だった。スタムは2003年のGame Developers Conferenceでこのアルゴリズムを短いCコードとして公開し、その後の多くのWebデモやゲームエフェクトの出発点になった。工学用の流体解析コードは逆に、精度のために小さな時間刻みと高次の移流スキームを使う。

例

煙はどのくらい残るか

入力
消える速さ0.3 /s、初期濃度1
結果
2.3秒後に0.5、10秒後に約0.05

e^(−0.3×10) = e^(−3) ≈ 0.050。表示は 1 − e^(−x) のトーンマッピングを通すので、濃度が半分になっても明るさは半分ほどには落ちて見えない。

粘性を最大にしたとき

入力
ν = 10⁻³、解像度128²、dt = 1/60 s
結果
1フレームの拡散係数 a ≈ 0.27

a = (1/60) × 10⁻³ × 128² = 0.273。幅10マス(領域の約8%)の渦が広がる時間は L²/ν ≈ 0.078² ÷ 10⁻³ ≈ 6秒程度。

解像度の比較

入力
同じなぞり方を64²と192²で
結果
64²では渦が数回転で消え、192²では細い帯が何重にも巻き込まれる

セミラグランジュ補間の数値粘性はマスの大きさに比例して小さくなる。マス数が3倍ならマスの大きさは1/3だ。

使い方

  1. 画面を短く速く1回なぞり、跡の先端にできる渦の対を見る。
  2. 粘性と解像度を変えて、同じなぞり方がどれだけ長く残るかを比べる。
  3. 消える速さを0にして何色か混ぜ、境目が巻き込まれていく様子を観察する。

よくある質問

煙はなぜ上に昇る?

まいた煙に温度を持たせ、温度に比例した上向きの力(浮力)を速度に加えているから。煙は冷えるほど浮かなくなるので、しばらく昇ってから広がる。浮力スライダーを0にすると染料はただの色付き追跡子になり、昇らない。

粘性0でも渦が止まるのはなぜ?

セミラグランジュ移流が補間のたびに値を平均し、小さな構造を削る数値粘性があるから。解像度を上げると減る。

これで実際の流体の問題を解ける?

定性的な様子(投影がつくる渦の対、粘性の効果)は正しいが、数値粘性と限られた反復回数のため定量予測には向かない。スタム自身もアニメーション用として提案した。

Stable Fluidsと格子ボルツマン法は何が違う?

Stable Fluidsはナビエ–ストークス方程式を速度と圧力で直接解く。格子ボルツマン法(このサイトのカルマン渦列や3D風洞)は粒子分布の衝突と移動を計算し、その平均が流体のようにふるまうようにする。

関連ガイド

出典

基準日:

プライバシーとデータの扱い