ひとことで
格子で流体を計算すると、補間の誤差で細かな渦がすぐにならされて消えてしまいます。渦度閉じ込め(ボーティシティ・コンファインメント)は、渦がある場所で、回転をさらに強める小さな力を足して、消えるはずだった渦をよみがえらせる方法です。Fedkiw、Stam、Jensen が 2001 年に煙のシミュレーションで提案し、粗い格子でも巻き上がる煙を作る定番の工夫になりました。
ゲームでの使いどころ
- 煙・炎の細かさ:リアルタイムの格子流体は解像度が低いので、そのままでは煙がのっぺりします。渦度閉じ込めを加えると、少ない計算で細かく渦巻く煙になります。
- 爆発・魔法エフェクト:もくもくと巻き上がるきのこ雲、渦を巻く魔法の煙。
- 強さを演出で調整:現実には存在しない力なので、強さはアーティストが見た目で決めます。強くすると、荒々しく渦巻く炎や嵐の雲になります。
しくみ
- 渦度を求める:各マスで、速度の回転の強さ(渦度)を計算します。2 次元では 1 つの値で、反時計回りなら正、時計回りなら負です。
- 渦の中心への向きを求める:渦度の大きさ の勾配をとり、正規化します。これは「近くで最も渦が強い場所(渦の中心)」を指す向きです。
- 回転を強める力を足す: と直角の向き()に、渦度の強さに比例した力を加えます。
この力は、渦の中心の周りを回る向きに働くので、ならされて弱まった渦をもう一度強め、渦を中心へ「閉じ込め」ます。 が強さのパラメータです。
格子の間隔 を掛けているのは、格子を細かくするほど数値の誤差(弱まる渦)が小さくなり、補う力も小さくてよいからです。
実装のポイント
- 安定流体法の 1 段として:外力を足す段階で、この力も一緒に加えます。追加の計算は 2 パス分だけで、とても安価です。
- 強さの調整:強すぎると、流れがノイズのように細かく暴れ、エネルギーが増えて不自然になります。見た目で最小限に抑えます。
- 他の方法と組み合わせる:移流を MacCormack 法など高次の方法にすると、そもそも渦が消えにくくなるので、渦度閉じ込めは弱めで済みます。
- ノイズで細部を足す:粗い流体の上にカールノイズなどで細かい乱れを重ねる方法もよく使われます。こちらは流れと無関係な渦を足すのに対し、渦度閉じ込めは今ある渦を強める点が違います。
つまずきやすい点
- 物理的に正しいわけではない:失われた渦を「それらしく」補う方法で、エネルギーは保存されません。強さを上げすぎると、止まるはずの流れがいつまでも暴れ続けます。
- 境界の近く:壁際では渦度の勾配が不正確になり、壁に沿って不自然な流れが生まれることがあります。壁のそばでは力を弱めます。
- 3 次元では向きに注意:3 次元では渦度がベクトルになり、力は (外積)で求めます。向きを取り違えると、渦を弱める力になってしまいます。
デモで試すこと
- 左右の水槽には、まったく同じ煙と揺れを与えています。格子はあえて粗く(96 マス)してあります。左は渦度閉じ込めなしで、煙がのっぺりと立ちのぼり、右は細かく巻きながら立ちのぼります。
- 「表示」を「渦の回転」にすると、赤(時計回り)と青(反時計回り)の渦の分布が見えます。右の水槽のほうが、細かく強い渦がたくさん残っています。
- 「渦度閉じ込めの強さ」を 60 まで上げると、煙が荒々しく暴れます。0 にすると、左右が同じ見た目になります。