跳到主要内容

燃烧和爆炸


haowei.han@mthreads.com

201 燃烧和爆炸制作流程

不论是在真实自然界中,还是在计算机中,燃烧都是一个非常复杂的过程,即便是在CFD领域,迄今为止仍然存在很多未解决的问题。而在计算机图形学,计算机动画领域,燃烧通常使用简化的控制方程,在这里我们简单的介绍一下整个燃烧的过程。

首先,燃烧的产生需要往流场中添加燃料,和温度一样,燃料可以通过发射器直接发射储至燃料(fuel 场)中,在发射器也同时发射了温度的情况下,当某一点的温度,超过了该点燃料的着火点时(Ignition Temperature),燃料就会被点燃开始进行燃烧反应。

在燃烧反应的过程中,燃料首先会不断减少变成燃烧状态(burn 场),但 burn 场并不是最终渲染的火焰,而是火焰产生的发射源。其值高的地方,表示燃料正在被积极消耗,火焰生成也较为强烈。burn场在经过一系列复杂的计算之后,会形成最终的火焰(heat 或 flame 场

  • 流程图待补充

在这个过程中,燃烧会持续释放出大量的热量,提高温度场的温度,从而也会气体体积的增加,以及浮力和翻滚动力的获取,最终出现火焰和烟雾膨胀并上升的现象。

在对燃烧有了基本概念的了解之后,我们就可以系统的看一下燃烧控制面板上的各个参数。

drawing

名称默认参数说明
Ignition Temperature
着火点
0.1当温度场的温度大于这个数值的时候,燃料被点燃开始进行燃烧反应并不断被消耗
Burn Rate
燃烧速率
0.9这里也可以说成“燃料消耗速率”,是燃料在被点燃后,转换成 burn 场的百分比,1.0表示所有的燃料都会转换到 burn 燃烧状态。
Fuel Inefficiency
燃料效率低
0.1不能进行有效燃烧燃料的百分比。
Temperature Output
温度输出
0.25控制燃料燃烧后,对温度的贡献强弱,并最终影响到浮力大小和翻滚动力。在真实物理世界中,不同的燃料燃烧后所释放的热量是不一样的,比如每公斤的煤在完全燃烧后所释放的热量,会远远小于同样质量的甲烷所释放的热量(甲烷(天然气): 约为 55.5 MJ/kg,煤: 一般在 24到 35 MJ/kg 之间)
Gas Release
气体释放
15燃烧的本质是一个剧烈的化学反应过程,在这个过程中,燃料与氧气反应生成二氧化碳或水蒸气等产物,这些化学反应的产物大多是以气体形态存在(从固体或液体转变为气体),所以在燃烧的过程中会导致体积产生剧烈膨胀,Gas Release 气体释放这个参数,控制了燃料燃烧后所导致的体积膨胀的长度,该参数在制作爆炸效果的时候,通常需要设置到较高的数值。
算法层面 Gas Release 直接修改压力求解所输入的 divergence 散度信息

Parameter Map

  • 近期更新

Collision

  • 近期更新

202 Explosion 爆炸

   爆炸在流体计算领域是一种常见的仿真需求,它的整个计算过程和燃烧反应差别不大,Catalyst FX 也提供了相应的计算features,用于模拟燃料燃烧后产生的爆炸效果

drawing

物理意义

关于爆炸,最容易联想到的是世界大战时期,战场上最常用的TNT炸药,也就是聚能装药爆炸,在学术上可以把它归类为化学爆炸。新闻中出现的煤气罐爆炸,也属于化学爆炸的一种。但是在详细说化学爆炸之前,我们还是总体了解一下爆炸的种类。爆炸可以分为三种:

  • 物理爆炸
  • 核爆炸
  • 化学爆炸

物理爆炸: 大致可分为三类:(i)压力容器的爆炸;(ii)火山的喷发;(iii)两种温差极大的液体快速混合。举例来说,家里高压锅爆炸就属于物理爆炸,在此过程中没有化学反应的发生,只有压力的快速释放。

核爆炸: 包括核裂变、核聚变,其能量来自原子核的链式反应。简单来说,核爆炸释放的能量可以分为三类:(i)粒子的动能;(ii)气体的内能;(iii)热能。热能主要以热辐射形式表现,动能和内能大约占核爆炸能量的一半,并最终形成空气中的冲击波。

化学爆炸: 主要表现为化学反应的进行和化学能的释放,在计算机图形学中进行的爆炸效果模拟,会用到化学爆炸中的一些概念,如:着火点( Ignition Temperature),燃料 (Fuel)等,但是和真正的基于化学反应过程实现的燃烧爆炸模拟相比,不能说不太类似,只能说是毫不相干。

核心参数

爆炸最核心的控制,就是对散度目标函数,或者说是对散度场(Divergence Field)的设置,通过设置 不同的散度(Divergence)数值,来实现各种爆破效果的调节,以下,我们先不考虑复杂的湍流细节,只考虑最重要的几个爆炸相关的参数

名称功能效果注解
燃料密度发射率Emit Fuel燃料会通过点燃,转换成燃烧(Burn),火焰(Heat),和温度(Temperature),并且这三者均会对散度有所贡献发射器提供的燃料(Fuel)密度越高,爆炸越剧烈,想象一下30吨的TNT炸药爆炸,和30吨的大伊万(5000万吨TNT)爆炸有啥区别
燃烧冷却时间 Combustion CoolingDown Time该参数控制火焰(Heat)的冷却时间,单位是秒,即:N 秒之后,火焰将完全消失默认参数下,Heat场(或 brun场)是一个潜在的烟雾发射源,当Heat场的数值降低接近0 的时候,则被认为是燃烧不充分区域,这部分区域会产生浓烟。
同时,Heat场对会温度场进行贡献,Heat存在的时间越久,则温度持续的时间越久,烟雾受到的浮力则越久
气体释放 GasRelease控制燃料燃烧的反应过程,对散度场(Divergence Field)的贡献系数整个燃烧反应,对散场(Divergence Field)度贡献的一个全局系数,该参数越大,燃料在燃烧的过程中就膨胀的越剧烈。

   所以,如果要实现一个爆炸,最直接的方法,就是调整发射器的燃料(Fuel)发射强度和 GasRelease参数随时间的变换,以下我们step by step的演示以下

化学爆炸 301 Basic Explosion With Houdini

创建发射器 Source

drawing

如图(上)所示:在SOP Network中创建一套标准Pyro发射器,Catalyst FX 节点可以读取Houdini Pyro Source 节点已经创建好的Field,作为自己的发射源使用。这里我们直接将一个Houdini自带的甜甜圈转换成体积,对其设置合理的Noise密度分布,并将其作为爆炸发射器使用
   接下来,我们可以创建 SOP 下的 CatalystSolver节点,将Solver节点第一个Input 连接至当前编辑好的发射器作为输入

燃料发射强度设置

drawing

我们在创建好的Catalyst Solver节点的 Sourcing 面板中依次勾选 Fuel,Temperature 和Velocity 的 Enable 开关。启动发射器的燃料,温度和速度的发射,在这里速度可以设置为正Y(0,1,0) 方向上一个比较大的数值,使得爆炸有较高的向上的初始速度
   比较关键的是燃料参数的整体缩放系数,如图所示,我们对燃料参数进行一个key 帧处理,将燃料的初始发射密度设置成5,在经过24帧左右的时间之后,燃料发射器的整体发射强度,降低至0.2,创造出解算第一秒流场中产生爆炸和膨胀的条件

drawing

  • 增加适当的湍流效果,最终得到 如图所示的爆炸模拟结果(精度: 220 * 480 * 220   帧数: 120 frames ,解算用时: 1 min with MTT S90 )

drawing

  • 为了得到更明显的爆炸效果,我们修改fuel的发射曲线,发射强度由最开的 5 ~ 0.2,修改成 10 ~ 0.2,得到图(右)的效果

小节:通过控制发射器的燃料发射密度,是最直接的制作爆炸的方法,更详细的有关于 Catalyst FX 制作爆炸的调参细节,可以参考手册后续的 Parameter Map章节,该章节会对每一种效果使用不同的参数有详细的对比和注解


物理爆炸 302 Ground Explosion With Houdini

Divergence Control

除了控制燃料发射密度的方式制作爆炸,我们也可以直接控制发射器直接对散度场进行填充,配合 Houdini 的粒子系统作为Catalyst Solver的发射器输入源,用于制作更复杂的爆炸效果

相比直接控制燃料发射密度的工作流程相比,通过直接控制散度 Divergence的方式,不会产生额外的燃烧反应温度,换句话说,散度控制(Divergence Control)和先前章节提到的爆炸分类中的物理爆炸,这分类有些类似,即整个爆炸的过程中没有任何化学能的转换,也没有复杂的燃烧温度输出反应。

  • 待更新

多发射器爆炸案例

drawing

如图(上):我们直接使用 Pyro Burst Source 节点创建一个粒子爆炸效果,并添加 Volume Rasterize Attributes 将粒子转成 VDB 体积。这部分发射器的制作流程和使用 Houdini Pyro FX 制作爆炸效果的流程完全一致。

drawing

如图(上):制作多个爆炸点依次爆炸的效果。使用 TimeShift 节点,创建2号,3号爆炸点,让爆炸时间点在时间上错开,每个 TimeShift 节点将爆炸时间错开 3 帧时间差,再使用 Transform 节点偏移爆炸点位置,让爆炸在不同的地方产生。

这里制作好的原始 1 号爆炸点发射器数据可以直接链接到 Catalyst Solver 节点 1 号 input 上,并在Catalyst Solver 节点的 Sourcing 面板上设置相关的发射参数。但是 emitter2 和 emitter3 节点处的发射器数据,如果我们需要对发射强度,发射方式进行单独控制,就需要在 Catalyst Solver 节点内部的 DOP 层级创建Catalyst FX发射器节点进行单独控制。

drawing

如图(上):创建多个 AxField Source 节点,设置 SourcingGeoPath 参数路径为先前制作好的 2号,3号发射器位置。并单独设置不同的发射强度。这里为了让中心区域的爆炸效果更加剧烈,我们设置中间位置爆炸发射器的燃料发射强度(Scale)为 4倍,温度发射强度为 1.5 倍。然后点击时间轴上的 Play 案例播放计算结果。

drawing

drawing

如图(上):可以看到在 Catalyst Solver 节点内部创建的 AxField Source 发射器正确的读取到了在 SOP 层级中使用 TimeShift + Transform 节点制作的多发射器信息。从 Frame 3 到 Frame 20 阶段可以清楚的看到整个爆炸呈有节奏顺序的产生。

创建 Catalyst 湍流节点

在对流体效果从整体往局部一层层添加细节控制的过程中,难免有额外的湍流效果添加需求,和创建多发射器节点一样,在 Catalyst Solver 内部的 DOP 层级中,也可以创建额外的,除解算器面板上默认提供的湍流类型节点。

drawing

如图(上):在默认的 Catalyst Solver 节点内部,存在2个 Ouput 节点,一个是先前使用的发射器 Output 节点接口用于链接额外的发射器节点资源,还有一个是名为 Force 的节点类型接口,用于链接额外的湍流节点资源,这里我们在现有效果的基础上,添加一层更细致的 DisTurb 湍流(AxField_UltraTurb 节点),和一层更对流体大形态进行轻微干预的 CurNoise(AxField_CurlNoise 节点)。

drawing

如图(上):来看最终结果,3个效果对比,画左:为原始模拟效果,没有添加任何湍流控制,画中: 为添加解算器面板自带的 DisTurb 湍流控制,湍流强度为 5,尺寸为 1 (米),画右: 为在 解算器自带的 DisTurb 效果的基础上额外再添加一层强度 为 25,尺寸为 0.3(米)的更细粒度高频湍流,在不影响流体大形态的基础上,为流体表面添加更多的扰乱细节。

节点可视化 Node Visualization

每一个在 Catalyst Solver 节点内部添加的湍流计算节点,都可以进行可视化看到当前节点的作用强度效果。(在每一个湍流节点的 Visualization 面板上进行设置)

drawing

如图(上):当开启 Catalyst Solver 节点内部添加的湍流节点的 Visualization 功能后,Visualization 数据会从 Catalyst Solver 节点的第二个输出端口导出。可以添加 Transform + Merge 节点将计算结果合并在一起观看。每一层湍流控制的 Visualization 数据上,都有原始节点路径信息,在添加多个湍流控制节点的时候,便于区分每一份可视化信息的节点目标来源。

缓存发射器

爆炸总结:

化学爆炸:会模拟燃料的热反应过程,产生热量,影响流体所受到的浮力大小,释放的热量也会影响气体体积的膨胀,燃料燃烧后,会产生浓烟
物理爆炸:只产生纯粹的体积膨胀,不产生温度和热量,不贡献浮力