现象:为什么模拟出的水总是不像水?
几乎所有初次接触 Blender 流体模拟的创作者都会遇到同一个困惑:明明把分辨率调高了、把域(Domain)范围设对了,可模拟出来的液体要么像粘稠的糖浆缓慢蠕动,要么像一团没有质量的果冻在空中悬浮,完全没有真实水体的那种「锐利感」和「重量感」。更令人沮丧的是,当你试图通过反复调整表面张力或粘度参数来「救」它时,结果往往越调越糟——液体开始出现不自然的抖动、体积丢失,甚至整个模拟直接崩溃。
这些现象并非操作失误,而是因为大多数教程只告诉你「把粘度调低」,却从未解释粘度在 Mantaflow 的求解器里究竟代表什么物理量,以及它与网格分辨率、时间步长之间存在着怎样的耦合关系。要真正驾驭 Mantaflow 的液体模拟,我们必须从它底层的欧拉网格法(Eulerian Grid Method)与纳维-斯托克斯方程(Navier-Stokes Equations)的离散化过程讲起。只有理解了「为什么」,你才能预判每一个参数调整会带来什么后果,而不是在试错中浪费渲染时间。

原理:Navier-Stokes 方程与 Mantaflow 的离散化策略
流体的运动在数学上由纳维-斯托克斯方程描述,其不可压缩形式可写作:
∂u/∂t = −(u·∇)u − (1/ρ)∇p + ν∇²u + f,且 ∇·u = 0
其中 u 是速度场,ρ 是密度,p 是压强,ν 是运动粘度,f 是外力(如重力)。Mantaflow 并不直接求解这个连续方程,而是采用算子分裂法(Operator Splitting)将其拆解为四个顺序执行的步骤:平流(Advection)→ 外力(External Forces)→ 扩散(Diffusion)→ 压强投影(Pressure Projection)。每一步只处理方程中的一项,这种「分而治之」的策略是 Mantaflow 稳定性的核心来源。
1. 平流步:半拉格朗日法的数值耗散
平流步负责将速度场和密度场沿着自身速度「搬运」。Mantaflow 使用半拉格朗日法(Semi-Lagrangian Scheme):对网格上每个点,向后追踪其速度轨迹,用线性插值获取上一时刻的值。这种方法无条件稳定,但代价是引入数值耗散(Numerical Dissipation)——它等价于人为增加了粘度。这就是为什么低分辨率下液体看起来「发粘」:网格越粗,插值误差越大,耗散越强。
2. 压强投影:不可压缩性的强制执行
投影步是 Mantaflow 最耗时的部分。它需求解一个泊松方程(Poisson Equation)∇²p = ∇·u,然后从速度场中减去压强梯度,使散度为零。Mantaflow 默认使用多重网格法(Multigrid)加速求解,这也是为什么「域」的尺寸和分辨率会直接影响模拟速度——网格点越多,泊松方程的规模呈立方增长。
3. 扩散步:粘度 ν 的真实含义
扩散步处理 ν∇²u 项,即粘度对速度的平滑作用。在 Mantaflow 的液体模拟中,粘度参数(Viscosity)直接对应 ν。当 ν=0 时,扩散步被跳过,液体表现为理想无粘流体。但请注意:由于平流步已经引入了数值耗散,即使 ν=0,模拟出的液体仍然具有「等效粘度」。这解释了为什么降低粘度参数有时收效甚微——真正的罪魁祸首可能是分辨率不足。

推导:从参数到视觉结果的因果链
基于上述原理,我们可以推导出 Mantaflow 液体模拟中几个关键参数的「因果链」,而不是孤立地记忆它们的取值范围。
分辨率(Resolution)与表面张力(Surface Tension)的耦合
表面张力在 Mantaflow 中并非直接求解,而是通过曲率力(Curvature Force)近似:Fst = σκn,其中 σ 是表面张力系数,κ 是界面曲率,n 是法线。曲率 κ 通过液面网格的二阶差分计算,因此对网格分辨率极度敏感。低分辨率下,曲率被严重低估,表面张力几乎失效;高分辨率下,曲率计算准确,但 σ 稍大就会导致液滴「爆炸」成碎片。这就是为什么表面张力必须与分辨率同步调整:分辨率翻倍,σ 应大致减半,才能保持相似的视觉行为。
时间步长(Time Step)与 CFL 条件
Mantaflow 的显式平流步受 CFL(Courant-Friedrichs-Lewy)条件约束:Δt ≤ Δx / |u|max。当液体速度很快(如倒入场景)而时间步长过大时,半拉格朗日法会「跳过」网格单元,导致体积丢失和飞溅异常。Blender 的「时间步长」参数并非直接控制 Δt,而是控制每帧的子步数(Substeps)。对于高速液体,将子步数提高到 2-4 是必要的,但代价是模拟时间线性增加。
网格与粒子的混合表示:FLIP 的意义
Mantaflow 默认使用 FLIP(Fluid Implicit Particle)方法,它同时维护一个欧拉网格和一个拉格朗日粒子系统。网格负责压强投影,粒子负责平流。这种混合策略大幅减少了数值耗散——粒子携带速度信息,避免了半拉格朗日插值的过度平滑。Blender 中的「粒子半径」和「粒子数量」参数影响的是 FLIP 的粒子-网格耦合强度:粒子越多,平流越精确,但内存和计算成本越高。
验证:参数对比实验与视觉判据
为了验证上述推导,我们可以设计一组对照实验。以下表格展示了在固定域尺寸(2m×2m×2m)和固定流速下,不同参数组合的视觉结果差异:
| 分辨率 | 粘度 ν | 表面张力 σ | 子步数 | 视觉结果 | 计算耗时(相对值) |
|---|---|---|---|---|---|
| 64 | 0.0 | 0.0 | 1 | 糖浆状,边缘模糊,体积丢失明显 | 1× |
| 128 | 0.0 | 0.05 | 2 | 水体锐利,飞溅自然,液滴圆润 | 4× |
| 128 | 0.1 | 0.05 | 2 | 明显粘稠感,飞溅被抑制 | 4.5× |
| 256 | 0.0 | 0.02 | 3 | 出色细节,微小液滴清晰,但易产生碎片 | 16× |
从表中可以清晰看到:分辨率是决定液体「像不像水」的第一性参数,粘度是第二性调节量。当分辨率从 64 提升到 128 时,即使粘度和表面张力不变,视觉质量也会发生质变——这直接验证了「数值耗散是低分辨率下液体发粘的主因」这一推论。
实战技巧:如果你的模拟时间有限,优先将分辨率提升到 128 以上,然后再微调表面张力。不要试图用高粘度参数去「修复」低分辨率下的模糊感,那只会让液体更像胶水。对于最终渲染,建议使用 256 分辨率配合「自适应网格细化(Adaptive Mesh Refinement)」——但注意 Blender 的 Mantaflow 实现中 AMR 支持有限,通常需要手动分域处理。
总结:从「调参」到「建模思维」的跃迁
Mantaflow 的液体模拟本质上是在离散网格上求解连续的纳维-斯托克斯方程。每一个参数——分辨率、粘度、表面张力、子步数——都不是孤立的「魔法数字」,而是对方程中某一项离散化精度的控制。理解算子分裂的顺序、半拉格朗日法的耗散特性、FLIP 的粒子-网格耦合机制,你就能从「试错调参」跃迁到「预测性建模」:在按下模拟按钮之前,你已经知道结果会是什么样。
这种原理驱动的思维方式,正是火星人教育在 AIGC 视觉设计课程中反复强调的核心能力。我们不仅教软件操作,更教底层逻辑——因为工具会迭代,但物理规律和算法思想不会。当你真正理解了流体求解器的「为什么」,你就能把同样的思维迁移到烟雾、火焰、甚至刚体破碎的模拟中,形成一套通用的程序化建模世界观。

关于火星人教育:创办 24 年来专注数字艺术与 AIGC 实战职业技能培训,开设 AI 漫剧创作、AIGC 视觉设计、UE5 游戏特效、室内全屋定制、MAYA 三维动画、C4D 动态设计、工业设计、NUKE 影视后期、摄影摄像实训等课程。北京、深圳双校区开设线下面授班,面向美术生、在校大学生及意向转行的职场人群,以项目化实训教学,夯实专业技能,助力就业与职业提升。咨询电话:010-65918670。如果你希望系统掌握流体模拟背后的数学与工程实现,欢迎加入我们的线下实训课堂,在真实项目中把原理变成生产力。








评论(0)