流体

使用流体,可以模拟水、油、蜂蜜和熔岩等液体的物理属性,可以复制重力、与对象碰撞以及运动场造成破裂的效果,从而得到所需结果。

介绍性概念

流体模拟基于以下组件构建而成:

优化性能

执行任何流体模拟的目的都是尽可能快地创建一个赏心悦目的可视效果。为此,请务必了解可用来平衡细节和精度细节与内存及计算时间的选项。

控制模拟细节的主要设置是“解算器参数”面板上的“解算器属性”组中的“基础体素大小”选项。此设置还对精度具有重大影响。通常,可以使用较大的值来快速、粗略地预览您的工作,在对效果感到满意后,可以使用较小的值来进行更详细的模拟。

无论“基础体素大小”如何,“解算器参数”面板上“模拟参数”组中的“传输步数”和“时间步阶”属性都可以提高模拟的精度。但是,这将需要进行额外计算并花费更长时间。有关详细信息,请参见下面的“自适应性设置”部分。

“基础体素大小”和“自适应性设置”要实现良好的组合,取决于粒子相对于已建模场景比例的速度。例如,如果粒子速度很快,在一个时间步阶内即可从碰撞对象的一侧移动到另一侧,则会看起来好像未发生过碰撞。此外,如果粒子进入碰撞对象太深,则可能会移动到错误的一侧,如同“渗漏”一样。为帮助诊断这些问题,您可以使用“显示设置”面板将“速度通道”设置为以颜色渐变显示,从而检查粒子速度。

使用的比例非常小时,例如,模拟单个水滴时,由于速度相对于小距离和短时间比例来说非常高,您可能需要增加场景的帧速率。

自适应性设置

使用“模拟视图”窗口的“模拟参数”面板中的自适应性相关设置,自动调整分辨率,以根据需要提供最多细节而不浪费内存和计算时间。有四组选项可用于控制此设置:

空间自适应性

“空间自适应性”选项用于在最不需要细节的流体中心创建低分辨率体素。在沿与碰撞对象的边界和沿自由曲面(即与空气的边界)快速移动的区域中,仍保持由“基础体素大小”设置的最大分辨率。

通常,在大多数模拟中均启用此选项。

删除超出粒子

“删除超出粒子”选项会在低分辨率区域中的每体素粒子数超过阈值时移除一些粒子。如果在空间自适应模拟和非自适应模拟之间遇到体积丢失或其他大的差异,则禁用此选项。

传输步数和时间步阶

“模拟参数”面板上的“传输步数”和“时间步阶”选项用于控制在每帧上执行的计算次数。迭代次数越多,结果越精确,但计算时间越长。如果遇到问题(如体积丢失、粒子聚束、自发爆炸和碰撞对象泄漏),则可以尝试调整这些设置。

  • “传输步数”控制在执行压力计算后用于沿体素速度场平流传递粒子的迭代次数。如果遇到问题(如粒子穿过静态碰撞对象),则可以尝试调整这些设置,因为这样可以在无需太多额外计算时间的情况下解决问题。但是,由于在每次迭代中不重新计算压力,且不重新体素化碰撞对象和其他实体,因此“传输步数”可能对快速移动的碰撞对象和其他更复杂的情况没有帮助。
  • “时间步阶”控制每帧的整个模拟(其中包括体素化、压力和传输相位)的迭代次数。这些设置可大大提高精确度(尤其是对于高速度),但是也可能导致计算时间长得多。

这两个控件可以结合使用,“传输步数”控制每个时间步阶内传输相位的迭代次数。换句话说,每个帧都可能包含多个时间步阶,具体取决于“时间步阶”设置,并且每个时间步阶都可能包含多个传输步数,具体取决于“传输步数”设置。

自适应性控制是否触发其他子步骤。可能为每个帧执行不同次数的迭代,具体取决于粒子在该帧中移动多远和多快。这些值呈非线性比例:
  • 在 0.0 上,粒子可以移动实际上无限的距离,而不触发进一步的子步。
  • 在 0.1 上,在触发进一步的子步之前,粒子最多可移动 10 体素长度。
  • 在 0.32 上,在触发进一步的子步之前,粒子可移动大约 5 体素长度。
  • 在 0.5 上,在触发进一步的子步之前,粒子最多可移动 1.0 体素长度。
  • 在 0.75 上,在触发进一步的子步之前,粒子可移动大约 0.5 体素长度。
  • 在 1.0 上,在触发进一步的子步之前,粒子最多可移动 0.001 体素长度。
最小传输步数/时间步阶为每帧始终执行的迭代次数。这意味着可以强制执行某些数目的子步,即使粒子不是在非常快速地移动。但是,通常建议调整“自适应性”以避免不必要的计算。
注: 仅在模拟的第一帧上执行一次迭代。

最大步数设置每帧执行的总迭代次数,用于限制执行的计算量。但是,粒子将始终按其速度和帧长度所需的整个距离移动。这意味着,粒子可能不会始终遵循“自适应性”设置的限制。例如,如果“自适应性”设置为 0.5,但是“最大步数”非常低,则快速粒子可能无法在 1 体素长度的步数内经过整个距离。在这种情况下,每步的长度大于 1 体素长度才能移动整个距离。

时间比例设置仅适用于“传输步数”,可更改粒子流的速度。大于 1.0 的值会加快流动,而不引入任何新的速度或加速;而介于 0.0 和 1.0 之间的值会减慢速度。结果实际上可能不正确,但如果您只想快速重定时模拟,这种方法对您比较有效。但是请注意,此设置可能会导致不必要的负面影响,尤其是在极端值。

比例注意事项

比例在流体模拟中非常重要,因为它们会直接影响最终结果的可信度。例如,老电影中使用的湖泊和水池的物理缩小模型看起来总是不合适。这是因为在现实中,水体中一米长的波浪与一厘米长的波浪看起来非常不同。因此,一定要妥善考虑相应的单位,以便使用合理的内存量和计算时间来获得最佳效果。

构建模拟时有三个重要参数需要考虑:

体素大小可帮助确定模拟的精度。此值以厘米为单位,值越小,解算越精确,但所需内存和资源越多。值越大,精度越低:您可能会看不到有粒子生成、粒子可能浮在碰撞曲面上方或者不穿过孔。传输所有网格进行模拟时,使用“体素大小”,因此,其会影响网格精度,也就是最小粒子大小。
警告: 非常小的体素大小会占用大量内存,并导致系统变得不稳定。

最大单位设置很重要,因为它确定了流体的行为以及流体所占用的内存量。使用流体时,始终需要了解场景的真实世界尺寸,因此决不应使用通用单位。理想情况下,应将“显示单位比例”设置为“米”,以便了解场景在“真实世界”中的大小。“最大流体”还会考虑自定义单位,但更改默认单位时需要谨慎操作。最好随身准备卷尺,以便进行测量并查看对象的实际大小。单位也会影响场景的外观,因为 15cm 波浪与 15 米波浪的外观不同。应当仅在以下情况下才使用“液体解算器”自定义替代单位:人为受到单位约束(例如,游戏引擎),或者您需要特殊效果,例如,在玩具房屋比例大小下渲染真实水体。

场景尺寸是指使用“单位设置”定义的实际尺寸来表示的场景大小。场景尺寸将直接影响“体素大小”的设置。例如,如果您的液体场景边界采用 10km * 10km 的设置,则将体素大小设置为 0.05 cm 通常不会解算成功,因为需要的内存太大。最好一开始先使用非常大的“体素大小”,然后逐渐减小值,直到在内存使用量较合理的时候获得合适的效果。此外,体素栅格越密,计算模拟所需的时间就越长。

“传输步数”和“时间”选项还决定了模拟质量,但对粒子移动速度的影响比对整体质量的影响更大。

注: 请勿在“液体对象”或“运动场”上使用“缩放”工具,因为这会终止计算。

使用小比例

使用小比例进行模拟时,有一些其他注意事项,因为相对于涉及的小距离和体素大小而言,速度较高。特别是,您可能需要增加“时间步阶”和“传输步数”设置,以获得更好的结果。在一些情况下,甚至可能需要增大场景的帧速率以模拟高速摄影机。

使用极小的比例时(如模拟单个水滴时),可能会进行一些额外的调整。例如,“曲面张力”不会始终提供精确的结果,即使使用多个时间步阶,因此使用非物理精确值实现逼真的结果可能更有效。在某些情况下,减少“重力幅值”可能会有所帮助。

也可以针对漩涡和水滴等对象取消激活此类设置,以避免在这些比例下执行无效果的计算。

网格

网格是结果的另一种表示。除了进行渲染之外,还可以将网格导出为 Alembic 或其他缓存供另一个场景或软件使用。除非在形状上激活网格划分,否则网格没有多边形。