模拟场

Pyro是一个纯粹的体积流体解算器,表示pyro流体状态的数据被储存在各种标量或者矢量场中。Smoke object负责创建这些场,这个节点也有一些额外的选项用来可视化当前的模拟。

vel矢量场包含了流体当前的速度,烟雾的运动就被vel场掌控。

density标量场捕获大量可见的烟雾,高density的区域会被显示为更厚重的烟雾。

temperature标量场捕获热度的分布。热气会被浮力(buoyancy)的影响下上升。推荐这个场中的数据保持为标准化,也就说最好保持在0到1之间。这个场中的数据的物理意义被Ambient Temp(K)Reference Temp (K)控制。也就是环境温度和参考温度,注意数值单位都是开尔文。temperature的数值为0意味着温度和环境温度相同。

flame标量场储存着反应物的剩余时间。之后会专门翻译一篇这个场的更多内容。

pressure是一个辅助的标量场,用来容纳流体的内部压力。可以用来可视化查看数据,否则的话就没什么用。

active遮罩场捕获sparse模式下的solver被激活的模拟区域。

Pyro解算器内部原理

pyro解算器负责上面提到的那些场的计算,每一次解算过程中,解算器都会执行一次下面的过程:

1.temperature会扩散和冷却:
扩散的意思是从热的区域传递到冷的区域,冷却代表热量的辐射损失。

2.densitytemperatureflamevel被“平流”:
平流的意思是指流体被平流传输,这一步负责所有相关场的运动。具体的平流传输可以百度一下,大体上是指一种流体的运动数学模型,一般温度差距越大运动越快,houdini应该也是借用了这部分的物理原理来开发的pyro模块。

3.flame场会计算当前的生命时长,然后生成它的产出效果:
flame场储存了反应物的剩余生命时长。这一步模拟了它们的反应。更多信息之后会有单独文章说明。

4.density会消散:
消散会让烟雾随着时间减少,导致它逐渐消失。

5.发射源被执行:
解算器的sourcing输入端用来添加新的数据用来模拟,比如density或者temperatur。

6.模拟框重新调整大小
Resizing一次来确保模拟的范围能够容纳这一次步幅中的运动,但是也要足够小,防止不必要的资源浪费。
如果解算器是sparse模式,激活区域也在这一步被执行。

7.应用force力场:
如果网络节点中有任何力学节点,比如重力、风力等等,这个效果会被施加在vel场中。

8.应用浮力buoyancy
热气的密度低,会因为浮力上升。这个效果被temperature影响,并且最终添加进vel场中。

9.viscosity合并进vel场:
viscosity表示流体的动态“密度”。越黏的流体趋向于越平稳的运动。比如,蜂蜜比水要黏。

10.应用shape操作元:
pyro解算器包含了几种shape操作元用来影响运动和烟雾的形态,disturbance、shredding和turbulence。后面还有一篇文章单独说明怎么应用这些操作元。

11.应用自定义力:
任何从forces输入端连入的节点都会在这一步执行。

12.Pressure projection被应用:
Pressure projection是模拟中很重要的一步。它可以确保vel场在解算之后与目标divergence规定的膨胀或者收缩一致。下面会详细讲解这个。

碰撞

你可以将其他物体作为碰撞体添加到pyro模拟中,来和烟火做交互。最简单的方法就是使用Static Object,适用于物体不会动或者不会变形。动态物体需要使用Deforming Object。这两种方式都可以很轻松的通过碰撞工具架实现。工具架可以自动检测碰撞体和速度采样。对于大多数情况都足够用了。

一个备用的方式是手动在模拟场中创建collisioncollisionvel。这个方法稍微复杂一些,但是能够对碰撞速度有着极大的控制。你可以使用Populate Containers工具架上的Collide with Objects工具来简化这个过程。如果你手动创建的话,最重要的是将volume source节点连入解算器的Forces输入端。

上面提到的两种方式唯一的区别在于创建collision和collisionvel上,两种情况施加碰撞的方式是一样的。pressure projection阶段会中和气体和碰撞体之间的动量传递,这个过程交替着由碰撞和projection passes完成。解算器中Advanced->Collisions的IOP Iterations参数控制这个过程的迭代次数。默认是1次,如果碰撞体运动太快或者烟雾有穿插,可以提高这个参数。

(完)

Leave a Reply