「流体らしさ」を密度場として可視化する試み
インクを水に落とすシミュレーション(Stable Fluids)の3D版に向けた検討
概要
ボリュームレンダリング(Volumetric Rendering)とレイマーチング(Ray Marching)の理論に基づき、流体的な振る舞いを持つトーラス状の構造体をリアルタイムで可視化する試みです。
ここで扱われる「流体」は、Navier–Stokes 方程式などの厳密な流体力学計算を直接解くものではなく、連続密度場(Density Field)として定義された疑似的なボリューム表現です。
流体の「形状」「厚み」「内部構造」をポリゴン表面ではなく空間中に分布する密度として表現することを目指しています。
公開
シンプル版
webアプリ:3D Volumetric Fluid Ring|Claude Artifacts
ソースコード:3D_volumetric_fluid_ring.jsx|GitHub Gist
https://gyazo.com/bb1fe24b229c4a452a6533127b107a9f
視点移動機能の付いたバージョン
webアプリ:Free Angle 3D Volumetric Fluid RIng | Claude Artifacts
ソースコード:free_angle_3d_volumetric_fluid_ring.jsx | GitHub Gist
※ Claude Artifacts環境ではOrbitControlsが使えず自前実装しているため,コードが複雑になっています
ボリュームレンダリング
表面レンダリングとの違い
通常の 3D グラフィックスでは、物体は三角形メッシュで表現されます。
今回用いるボリュームレンダリングでは、物体は次のように扱われます。
空間中の各点にスカラー値(密度)が定義される
明確な「表面」は存在しない
視線が空間を通過する際に密度を積分して色を決定する
この考え方は、煙・霧・雲・液体内部などの表現に適しています。
レイマーチングの理論
視線積分
各ピクセルについて、カメラ位置から視線方向にレイ(光線) を放ち、一定間隔でサンプリングを行います。
各サンプル点で密度関数 ρ(x) を評価
密度に応じて色と不透明度を蓄積
前方から後方へ逐次的に積分
これは数値積分による 視線方向の体積積分に相当します。
ランバート・ベールの法則(Beer-Lambert Law)
密度の蓄積には、光の吸収モデルとして以下の考え方が使われています。
光は密度に比例して減衰する
手前の密度が濃いほど奥は見えにくくなる
このため、色は単純加算ではなく「未吸収分に対する寄与」として重ね合わされます。
密度場(Density Field)の構成
距離関数による形状定義
本作では、トーラス形状が符号付き距離関数(Signed Distance Function, SDF)により定義されています。
各点がトーラス表面からどれだけ離れているか
負の値:内部
正の値:外部
距離に基づき、境界付近で滑らかに密度が立ち上がるよう設計されています。
ノイズによる内部構造
理想的なトーラスだけでは人工的な印象が強いため、
3 次元ノイズ関数
空間的な揺らぎ
時間変化
を加えることで、流体的な乱れ・渦・濃淡を再現しています。
ただしこれは物理シミュレーションではなく、視覚的なリアルさのために統計的な揺らぎを導入するというものです。
時間変化と擬似流体性
時間変数は以下の役割を担います。
密度場の回転(渦巻き運動)
ノイズ位相の変化
視覚的な「流れ」の錯覚
実際の速度場や圧力場は存在しませんが、人間の視覚にとっては連続した流体運動として知覚されます。
バウンディングボリュームと計算最適化
無限空間でレイマーチングを行うと計算量が膨大になるため、
レイと直方体(バウンディングボックス)の交差判定
有効な区間のみでサンプリング
を行い、理論的には 不要な積分領域を排除しています。
これは物理的意味というより、計算幾何学的な制約です。
色と知覚的設計
色の変化は物理的特性ではなく、情報可視化としての役割を持ちます。
密度、位置(高さ)、内部 / 外部の比率、といったスカラー量を視覚的に区別しやすくするための知覚的マッピングです。
まとめ
本プロジェクトは、
ボリュームレンダリング
レイマーチング
距離関数
ノイズによる乱流表現
といった理論を組み合わせることで、「流体らしさ」を密度場として可視化する試みです。
これは物理学的厳密さを追求するものではありませんが、リアルタイム CG における流体表現の考え方を体験できます。