What & How & Why

这是本文档旧的修订版!


Pyro Solver

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

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 场中减掉该值的倒数来获得,即
    heat-((1/cooldown_time)*timestep)
  • 如果 cooling field 开启,那么在从 heat 领域减去该值倒数之前,会先对 control field (默认 temperature)进行 fit01,然后在做如下的操作:
    heat - ( (1/cooldown_time)*timestep*clamped_control_field )
Cooling Field 使用指定的场按上述的公式对
Time Scale
Time Scale
Time Scale
Time Scale