加速流体模拟器

发布: (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.
Back to Blog

相关文章

阅读更多 »

使用 shaders 实现香烟烟雾效果

Article URL: https://garden.bradwoods.io/notes/javascript/three-js/shaders/shaders-103-smoke Comments URL: https://news.ycombinator.com/item?id=46497589 Points:...

简要介绍 openworld.js 的历史

介绍 过去几天,我一直在研究 multi‑models,目标是实现尽可能多的 large‑scale models。WebGL 在大约…时开始卡顿。