INK TIDE.
INK TIDE.
INK TIDE.
Stable Fluids (Jos Stam 1999) の 完全実装。
7 PASS, 4 CHAPTERS.
INSIDE THE SIMULATION
FRAGMENT PASS · ADVECTION
流れ は 自分自身 を 運ぶ
流体 の 「自己 移流」 は、 各 ピクセル の 速度 ベクトル を 後方 に 1 ステップ だけ たどって、 そこ から 値 を サンプル する 「半 Lagrangian」 法 で 計算 する。 これ により、 安定性 を 保ち ながら、 任意 の dt で 計算 できる。 Stable Fluids の 名 の 由来 でも ある。 InkTide では velocity 自身 と 染料 dye の 二つ の フィールド を 同じ advect シェーダ で 移流 させて いる。
FRAGMENT PASS · DIVERGENCE & PRESSURE
湧き出し を 消し、 圧力 を 解く
リアルな 流体 は 非圧縮 で あって、 速度場 の 発散 ∇·u は ゼロ で なければ ならない。 まず ∇·u を 1 pass で 計算 し、 続けて Poisson 方程式 ∇²p = ∇·u を Jacobi 反復 で 20-30 回 解く (Jacobi は 各セル の 周囲 4 近傍 の 平均 を 取る だけ の シンプル な 反復解法、 GPU に 完璧 に 並列化 できる)。 反復回数 を 増やす と より なめらか な 流れ に なる。
FRAGMENT PASS · PROJECT & DYE
射影 して 色 を 流す
解いた 圧力 p の 勾配 ∇p を 速度場 から 引く こと で、 速度 を 非圧縮 に 「射影」 する。 この 投影 で、 流体 が 体積 を 保ち ながら 渦 を 巻く、 美しい 動き が 生まれる。 最後 に、 染料 (dye) の フィールド を、 今 計算 した velocity に 沿って 移流 させる。 染料 は 速度 を 表示 する マーカー で あり、 私たち が 目 で 見て いる 「流体」 そのもの だ。
FRAGMENT PASS · INTERACTION
指 で 描く、 渦 が 生まれる
マウス / タッチ で drag する と、 そこ に ガウシアン分布 の 速度 ベクトル と 色 が 「splat」 として 注入 される。 半径 と 強度 は スライダー で 調整 可能。 アイドル状態 では、 中心 から 円 を 描く ように 自動 で splat が 入る ので、 触らなく て も 流体 が 動く。 ボタン で 4 プリセット (水中インク / けむり / ようがん / せいうん) を 切替、 PNG で 保存 も できる。
FAQ.
よく ある しつもん
Q1
「Stable Fluids」 と は 何ですか?
1999 年 に Jos Stam が SIGGRAPH で 発表 した、 Navier-Stokes 方程式 を リアルタイム で 解く ための 数値手法。 当時 主流 だった 陽解法 が 微小 タイムステップ で しか 安定 しなかった の に 対し、 半 Lagrangian advection + 暗黙的 圧力 投影 によって、 任意 の dt で 安定 する 「Stable」 な 方法 を 確立 した。 InkTide は その アルゴリズム を GLSL fragment shader で 実装 して いる。
Q2
ぐるぐる 描いて も 動かない / カクつく
ブラウザ が WebGL2 + 浮動小数点 テクスチャ (EXT_color_buffer_float) に 対応 して いない 可能性 が あります。 Chrome / Edge / Safari / Firefox の 最新版 で 開いて ください。 また、 統合 GPU の 古い PC で は 解像度 が 高い と コマ落ち する ことが あります。 解像度 は 内部 で 256² (velocity) + 512² (dye) に 固定 して いる ので、 ノート PC でも 60fps で 動く はず。
Q3
色 は どう 決まって いる?
プリセット ごと に HSL 中心色 + 色相 オフセット 範囲 が 定義 されて いて、 splat する 度に 時間 に 応じて 少し ずつ 色相 を ずらして 注入 します (sin と cos の 合成 で 滑らか な サイクル)。 たとえば 「水中インク」 は 群青 中心 で 微小 範囲、 「せいうん」 は マゼンタ から シアン まで 広い 範囲。 dye field は 累積 的 で、 古い 色 が 残り ながら 新しい 色 が 重なって ゆく。
Q4
PNG 保存 が 透明 に なる
canvas は preserveDrawingBuffer: true で 作成 して いる ので、 toDataURL() で 直接 PNG 出力 できます。 もし 透明 に なる 場合 は、 ブラウザ の 拡張機能 (アドブロック 等) が canvas を 干渉 して いる 可能性。 拡張 を 切って 試して ください。
Q5
「圧力 反復」 の スライダー は 何?
Jacobi 反復 (Poisson 方程式 を 解く) の 回数。 少なすぎ る と 流体 が 体積 を 保たず 「漏れ」 ます (圧縮性 が 残る)。 多すぎ ても 視覚的 に は ほぼ 変わらず、 計算 コスト だけ 増えます。 20-30 で 十分 滑らか。 InkTide は デフォルト 24-30。 古い GPU で fps が 落ちる 場合 は 15 程度 まで 下げて も OK。
Q6
AI モデル を 使って いますか?
使って いません。 機械学習 / Neural Network 系 は 一切 不要 で、 Navier-Stokes 方程式 を GLSL で 数値的 に 解く だけ で 流体 シミュ が 成立 します。 学術論文 (Stam 1999, GPU Gems 38) を 読めば 完全 に 再現 可能 な 古典的 アルゴリズム。 InkTide は その 学習 / 教育 / 鑑賞 用 ツール。
Q7
ai-lab の 他 シミュレーター と の 関係?
シミュレーター 7 本柱 完成 (pile-park 剛体物理 / doodle-drop お絵描き物理 / frac-cast 数学イテレーション / cell-drift セルラーオートマトン / vibe-coder 演出 / pendulum-trace カオス力学 / ink-tide 連続体 流体)。 古典力学 から 離散数学、 細胞、 演出、 カオス、 連続体 と、 シミュレーター が 扱える 主要 分野 を 一通り カバー した 形 に なる。