彩色流体实验台

GPU 实时求解二维速度场:平流 → 散度 → 压力迭代 → 速度投影 → 染料平流,鼠标或手指拖动注入颜色与动量。

求解方法与单位说明

方法:半拉格朗日平流的 Stam「稳定流体」框架,一帧依次做 加涡量约束 → 计算散度 → Jacobi 迭代解泊松方程得到压力 → 减去压力梯度做投影 → 半拉格朗日对流。 这一步投影保证速度场近似无散,这是「注入的染料不会凭空聚成一团」的原因。

量纲:速度以「纹理坐标 / 秒」计,1 表示一秒钟跨过整个画布; 注入的 Δ 是画布尺寸的比例增量;注入力度只是这个增量的放大系数,本身没有单位。 涡度强度越大,涡旋越细碎,但过高会放大数值噪声。

时间步:dt 被夹在 16 ms 以内,防止标签页切回来时一帧跳太多导致平流插值越界。 「已模拟时长」按夹住之后的 dt 累加,所以和墙钟时间可能不同,这是有意的。

耗散:染料与速度各有独立的消散系数。速度消散在着色器里写成 0.2 + (1 - v) * 4,是为了让滑杆低端仍然保留一点点惯性; 染料消散直接用 1 - d。

读数口径:模拟步数、压力迭代累计、单帧 CPU 提交耗时、缓冲总量、累计注入动量 都是真实可核对的;速度场的统计量需要从浮点缓冲读回,本次未显示,原因见「自检」面板。

染料颜色

自定义

模拟参数

4500
0.0015
1.45
26
0.988
0.980
22
180
1.00

运行状态

状态运行中
WebGL—
网格分辨率—
帧率—
染料注入次数0
已模拟时长0.0 s
模拟步数0
压力迭代累计0
单帧提交耗时—
缓冲总量—
累计注入动量0
质量档—

说明

这是真实的实时流体求解,不是粒子轨迹或渐隐画布:每帧依次执行平流、散度、Jacobi 压力迭代与速度投影。

在画布上按住拖动注入染料与动量;快速甩动会产生涡流。

暂停后画面完全停止演化;清空只清除染料,速度场保持不变,方便观察扩散。

分辨率与像素比改变时会重建并释放 GPU 纹理,画布尺寸同步更新。