What & How & Why

Pyro Solver

Ver. 18.0
供烟雾与火焰效果使用的解算器。


Pyro Solver 是进阶版本的 Smoke Solver。相比 Somke SolverPyro Solver 更复杂一些,但更灵活一些。

Setting up

在设置 Pyro 解算中,有几个重要的数据需要从几何体对象获得:

  • Density field, scalar,供烟雾使用
  • Velocity field, vector,为整个解算中的每个 voxel 提供速度属性。
  • Temperature, scalar,主要供浮力buoyancy)使用。

Input

Object

该输入端用于连接解算的容器。使用 smoke object

Pre-solve

在 Pyro 中,该输入端主要用于加载 Gas Resize Fluid Dynamic 节点,使整个模拟容器的大小按照目标体积的大小进行变化,从而达到优化的效果。该输入端的计算按 step 为单位计算,每 step 更新一次。

Velocity update

该输入端主要用于加载自定义的速度场。这些速度场的计算会在 project gas non-divergent 之前应用完毕。

Advection

该输入端用于连接 Gas advect 节点。该节点允许使用指定的场来推动模拟中的其他场(该计算基于 point)。

Sourcing

该输入端主要用于加载指定的源(以及其包含的属性 / 场的信息)到 DOP 中。该输入端主要使用的节点是 Volume Source。当然,我们也可以通过修改源中的信息,来达到更新、操作 DOP 中场的目的。

Parameters

Simulation

该 tab 下的参数控制解算的整体发展。

Time Scale 该参数类型为 scalar,作为整个解算的缩放参数而存在。1 代表正常速度,大于该值表示该模拟已经被加速,反之则是减速。

我们可以使用 doptimedopframedopsttot / dopttost 等表达式来进行全局时间与解算时间之间的转换

Time Scale 的值影响 DOP 中的 Timestep。举个例子,如果我们的速度场是在 SOP 中计算完毕并导入的,那么如果我们想在 Time scale 改变的情况下获取对应正确的速度,我们需要使用 1 / timescale 作为系数对速度场进行缩放。

Temperature Diffusion 该参数操作的对象是 temperature field (实际上进行的是 Gaussian Blur)。该值越意味着 temperature field 的扩张程度越大。比如,2 意味着 solver 会每秒对 temperature field 进行以 2 为半径的高斯模糊,从而达到温度场扩散的效果。

这个参数存在的意义是为了实现小于 container 分辨率的 turbulence。这些 turbulence 对温度场的延伸也同样有贡献。
Cooling Rate 该参数指定 temperature field 冷却的速度。比如,0.9 意味着每秒钟当前的“热”气体温度会下降 90%。
Viscosity 该参数定义了 velocity field 的流动性(也就是说速度场与液体是类似的,也是在流动的)。该值越高,越会使相邻的 voxel 具有相同的速度,从而导致流动的效果。该值为 0 会导致相邻的 voxel 会在不受任何阻力的情况下,向任意方向移动,这将会创建更混乱,更动荡的效果(布朗运动?doge)

(在 pyro solver 中,当临近 voxel 速度不一致时,高 viscosity 会带来一种类似颜料在水中扩散的效果(无视速度场,布朗运动 again doge)。这种效果称为 diffusive term。)
Buoyancy Lift 该参数是浮力的系数。该参数使用环境温度与个体 voxel 温度的差异来决定系数的大小,因此越热的区域会得到更多的浮力,而越冷的区域会下降的更快。增加该值会导致体积的上升速度更快,能够达到的区域更高。

Combustion

该 tab 是 pyro solver 与 smoke solver 最大的不同点。该模型通过使用导入的 fuel field 进行燃烧,模拟了将 fuel 转化为 burn / temperature / density 场的过程。

Peter Quint 的教程非常有用!!

Ignition Temperature 燃点温度。只有在该温度以上,整个 combustion model 才会进行运作。如果希望所有的 fuel 被立即点燃,使用负值作为参数值。
Burn Rate 每秒参与燃烧fuel。该参数值是比例值0.9 意味着 90% 参与燃烧的的 fuel 将在一秒中以后被“消耗”掉。

该值主要控制参与燃烧的 fuel 占 fuel 总量的比例。Fuel Inefficiency 会对 fuel 的实际剩余量有影响。

Fuel Inefficiency 控制有多少参与燃烧的 fuel 实际上没有被消耗掉。0 代表所有参与燃烧的 fuel 都会被从 fuel field 中去掉,而 1 代表保留所有的参与燃烧的 fuel

该值设置为 0 的时候有时会出现 bug。设置为一个非常靠近 0,比如 0.05 这样的值会更好一些。

Temperature Output 燃烧每单元 fuel 产生的温度场(添加到当前温度场中)。该属性同时受 burnheat 的影响。
Gas Released 该参数作为向燃烧区域注入的 gas 量的系数。这个选项会导致燃烧区域极速往外扩张。该值同时受 heatburn 场的缩放系数加成。
Flames

对 flame / heat field 的控制参数 tab。

Flame Height flame 的缩放系数。该值越高,flame 的高度就越高。需要注意,该值并不是一个有测量量表的值,该值只是影响应用到 flame 上的冷却量。

本参数下,非常低的参数值并不能得到非常小的 flame,因为冷却的影响因素并不足以抵消温度场的影响。

该值可以被视作冷却的时间,在 cooling field 打开或关闭的前提下有不同的算法:

  • 如果 cooling field 关闭,那么heat field 的结果将使用直接从 heat 场中减掉该值的倒数来获得,即
    heat-((1/cooldown_time)*timestep)
  • 如果 cooling field 开启,那么在从 heat field 减去该值倒数之前,会先对 control field (默认 temperature)进行 fit01,然后在做如下的操作:
    heat - ( (1/cooldown_time)*timestep*clamped_control_field )
Cooling Field 使用指定的 field 来控制 cooling field(也就是 mask)
Smoke

该 tab 控制 smoke 的发射量。

Create Dense Smoke 向系统中添加 smoke。该过程不会考虑现有的烟雾量,因此对于需要 Heavy smoke 的场景非常适用。当选项关闭的时候,smoke 只会在 density 超过特定量的 voxel 上生成。
Source 选择烟雾的产生源。最好的选项通常是 heat 场。适用该场会带来更真实的效果,并防止 smoke 对 flame 造成模糊。
Smoke Amount 生成 smoke 的系数。(都是直接乘到场上的,burn 是作为 linear combination 的系数,heat 是直接乘。)
Heat Cutoff 该选项只能在 heat 作为 smoke 源的情况下使用。
如果该值为 0.2,那么 smoke 只会在 heat field 中低于 0.2 的位置生成。
Blend Amount 该选项只能在 heat 作为 smoke 源的情况下使用。
增加该值将使 smoke 和 flame 之间的渐变变得更加平滑。

该值实际上控制的是在 Heat cutoff 点之上的的 smoke 生成。0 意味着 在 Heat cutoff 点之上的 heat field 不会产生任何的 smoke;1 意味着在 Heat cutoff 点处会产生最大量的 smoke,之后随着 heat 场值的增长, smoke 的量会随之减少,直到达到 heat 场的最大值处(此处没有任何 smoke 生成)。
Fuel

控制 fuel 的影响。 Advect Fuel|该选项关闭的时候,fuel 处于静止状态,并且不受速度场的影响。当开启的时候, Fuel field 会像 tempature、heat、density 一样被推进。该选项开启后导致更加不可预测的结果,并且会使用更多的时间计算。| Fuel Speed|Fuel field 的最大移动速度。|

Shape

该 Tab 下的属性控制 flame / smoke 的形状。除了 Dissipation 之外,所有的参数均会像内部力一样影响速度场。

指的注意的是,smoke object 的分辨率决定了火焰和烟雾的细节。不过,Pyro slover 在很大程度上是有独立参考的“分辨率的”,因此我们可以通常在低分辨率下工作,再提高分辨率来得到细节,同时又能获得与之前大致相似的整体形状。

Houdini 通过两种方式向火焰添加 turbulent noiseshredding & turbulence

  • 如果我们需要添加高频的 noise,Shredding 是主要的方式。 Shredding 通过 “拉伸”和“挤压” Velocity Field 来得到火苗?(lick)和流状的火焰(flow)。
  • Turbulance 主要用于低频的 noise,比如来回“搅动”(churing),“卷动的”(rolling)的,和移动较慢的,缩放较大的 noise。

|Dissipation|控制 smoke 的消散速度。该值越低,smoke 消失的程度越慢,反之越快。

该值为百分比,0.1 代表每 24 秒消失 10% 的烟雾。1 会导致所有的 smoke 立即消失。|

Disturbance在不改变 pyro 主要形状和动态的情况下,为其增加细节。
Shredding基于 Heat field 的梯度来推拉 velosity field,从而得到细长状的火苗形态。

需要注意的是,该值如果过高会导致随机的,碎片化的结果;相反,过低的该值会导致滴状的,特征不明显的火焰。

因为 shredding 基于 temperature field 的梯度实现效果,因此温度偏低会使 shredding 的中细碎效果更明显。温度较高会导致梯度的动态下降,因此会导致较大的条纹状的火焰。同时,越高的分辨率会得到越多的梯度细节。
Disturbance