加速流体模拟器
发布: (2026年1月11日 GMT+8 05:22)
4 min read
原文: Dev.to
Source: Dev.to
摘要
引言
本项目的目标是实现一个稳定、交互式的 Navier‑Stokes 求解器,能够在现代浏览器中原生运行且无需插件。我们选择了 FLIP 方法,因为它在粒子系统(拉格朗日)提供的视觉细节与基于网格求解器(欧拉)提供的稳定性之间取得了平衡。
方法与实现
FLIP/PIC 混合求解器
核心物理引擎基于自定义实现的流体隐式粒子(FLIP)方法。仿真步骤遵循以下流程:
- 转移:将粒子速度栅格化到背景交错网格上。
- 外部力:对网格施加重力和用户交互力。
- 压力求解:使用 Gauss‑Seidel 迭代求解器使速度场无散度(不可压),从而保证流体保持体积。
- 对流:将新的速度插值回粒子。采用 90 % FLIP(保留能量/飞溅感)和 10 % PIC(粒子‑在‑单元格,平滑噪声)的混合方式以维持稳定性。
高性能渲染(WebGL)
- 顶点着色器:将仿真坐标映射到裁剪空间。
- 片段着色器:使用距离场(
length(gl_PointCoord - 0.5))将每个粒子渲染为数学上完美的圆形,避免纹理加载并最小化内存带宽。 - 缓冲管理:粒子位置和颜色每帧从 CPU 求解器流入 GPU VRAM 缓冲区(
gl.ARRAY_BUFFER)。
多材料与刚体物理
- 粘度:通过基于粒子类型的阻尼系数对速度转移进行衰减(例如,蜂蜜具有高阻尼系数)。
- 刚体:动态障碍物(石块、木头)使用自定义基于冲量的碰撞系统。它们通过动量转移与流体粒子交互——粒子推动物体,物体位移粒子(双向耦合)。
功能与交互
仿真环境提供实验室级别的界面供实验使用:
- 交互式注入:用户可以使用鼠标驱动的射线投射器“绘制”流体进入场域,注入具有初始速度的粒子。
- 可变重力:全局标量控制重力向量,可实现 0 g 环境、超重力或反向重力(流体向上落)。
- 材料选择器:用户可实时切换不同密度和颜色的流体(水、油、蜂蜜)。
- 视觉美感:仿真运行在暗色模式容器中,使用干净、无网格的画布以获得最大视觉对比度。
性能结果
在标准消费级硬件(Chrome/Edge 浏览器)上进行测试:
- 粒子数量:在 150 000+ 粒子时仍保持稳定。
- 帧率:标准交互期间保持 60 FPS。
- 稳定性:即使在极端条件下(例如 200 % 重力),求解器也因稳健的不可压迭代而保持稳定。
结论
参考文献
- Müller, M. Ten Minute Physics – FLIP Fluids. YouTube Series, 2022.
- Zhu, Y. & Bridson, R. Animating Sand as a Fluid. SIGGRAPH 2005.