======Pyro Solver======
//Ver. 18.0// \\
**//供烟雾与火焰效果使用的解算器。//**
----
//Pyro Solver// 是进阶版本的 //Smoke Solver//。相比 //Somke Solver//, //Pyro 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'' 代表正常速度,**大于**该值表示该模拟已经被**加速**,反之则是减速。\\ \\ 我们可以使用 ''doptime'',''dopframe'',''dopsttot / 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'' 场的过程。\\ \\
[[https://vimeo.com/44619541|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 产生的温度场(添加到当前温度场中)。该属性同时受 ''burn'' 和 ''heat'' 的影响。|
| **Gas Released** | 该参数作为向燃烧区域注入的 gas 量的系数。这个选项会导致燃烧区域极速往外扩张。该值同时受 ''heat'' 和 ''burn'' 场的缩放系数加成。|
==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 noise//://shredding & 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|