跳到主要内容

入门教学案例


haowei.han@mthreads.com

101 烟雾制作流程简介

这里我们从最简单的一个烟雾效果制作开始,展示 Catalyst FX 的基本操作流程

创建发射器

drawing

  1. 创建一个 Catalyst Source 发射器节点,该节点提供了一系列基于基本几何形状的发射器(Box,Sphere,等),可以往流场中添加温度,密度,速度,燃料等属性供解算器计算使用。
  2. 在 Initialize 下拉菜单中,选则 Source Smoke 配置,节点会自动设置好用于产生烟雾的发射器参数,这里一个最简单的烟雾效果制作,发射器需要发射:Velocity 速度,Density 密度,Temperature 温度这3个属性。
  3. 设置发射器大小为:(1.0,0.5,1.0)类似于一个被压扁的 Box,设置发射器发射的速度,密度,和温度的强度(Scale)均为5。

设置解算器参数

drawing

如图(上):在Catalyst Source 发射器节点下创建 Catalyst Solver 解算器节点,并在Solver节点处于高亮(金色边框)框选状态下,将鼠标放在 viewport 中按下键盘回车,显示出流体解算框大小编辑控制器,设置解算范围至合适大小。

在解算器节点上 Wind 面板中,设置风力方向(WindDirection)为:(0.5,0.0,0.0),即往X轴的方向添加速度为 0.5米/秒的微风。

最后,在Simulation面板中设置 Substep(子步)为2,提高计算品质,在Houdini时间轴左侧按钮区域单击 Play(播放)按钮,得到了我们最终如图显示的烟雾效果,这样就完成了一个最基本的烟雾模拟效果制作的流程。

通过该案例,我们对流体效果的制作流程进行了一个最简单的制作过程展示,即:创建发射器作为流体解算器的Input输入,设置流体容器计算区域大小,点击播放按钮进行计算。发射器会往流体容器中添加我们在发射器参数面板上设置好的属性信息,并计算出流体运动的形态。

drawing

当在Viewport中看见计算结果之后,我们在此时使用鼠标中间观察节点信息(Info)面板,可以看到解算节点的最终输出的Geometry 信息里,包含了 2个 Volume 数据(在流体解算中,更准确的叫法被称为 场 Field),这两个 Volume 在信息面板下册可以看到分别是 density (密度场)和 temperature (温度场)

所以,流体解算整个过程的最终输出,就是一组计算好的体积数据, 这里由于当前案例是一个最简单的烟雾效果制作,所以解算器的最终输出只有 density 和 temperature 2个场(Field),而一个复杂效果的制作任务,可能会输出多个场的数据,接下来,我们对这些流体解算器可能输出的场,进行一个比较全面和系统的介绍。


102 场 Field

场是流体模拟中的基本概念,它记录了空间中每一个位置点上各种物理属性的数值,也是流体解算器的最终输出结果。和二维的图像一样,场可以理解为一种三维图像,是N张二维图像沿着Z轴叠加在一起的结果。所以场也有分辨率的概念,只是场的分辨率信息,需要3个参数进行描述。拿空间中每一点上的温度来举例:在一个1立方米的空间范围内,每隔1厘米(VoxelSize)就记录一下当前位置的温度高低,最终整个一立方米的空间范围内就有 100 * 100 * 100 个,也就是100万个温度记录点,而这 100 * 100 * 100 的描述就是3D场空间分辨率的描述,也可以描述为:100万个Voxels(体素

场在GPU内的数据结构,通常是一个3D的Texture,这里,对日常效果制作会使用到的场进行一个信息汇总。

名称中文说明 or 渲染
density密度场代表了空气中可见气体的浓度信息。
渲染: Catalyst FX 中代表了烟雾的浓度 通常使用 RayMarching 进行绘制。
temperature温度场记录了空间中每一个位置的温度高低,温度的大小会直接影响流体所受到的浮力大小,温度越高的气体则越容易获得较大的浮力。
渲染: 自然界中,只要有温度的物体都会“发光”,在日常生活中,大多数物体由于温度较低,都不足以产生可见光,只能产生能量密度较低的红外波段光源,这种光源不可以通过肉眼直接观察到,但可以被专业仪器检测到。所有物体因其温度而发出电磁辐射,这个现象称为黑体辐射(Block Body)。
随着温度的进一步提升,物体发出的光的颜色也会随之改变,比如从红色变为黄色,最终到蓝色。这是因为,物体温度的增加导致其发出的电磁辐射的峰值波长向更短的波长移动,即从红外线区域向可见光乃至紫外线区域移动。这个现象可以通过普朗克黑体辐射定律来描述。所以,我们对温度高到足够产生可见光的物体进行绘制的时候,可以使用黑体辐射模型或普朗克黑体辐射模型来进行绘制,此时候温度场的信息就派上了用场。
heat热量场 (有时也叫 flame 火焰 场)这里比较接近物理学的描述是,heat或flame场,是燃料在燃烧后产生的一个等离子态的区域,即火苗的强弱信息。它和温度场的区别在于:温度场通常覆盖了整个流体区域,不论是在火焰燃烧的等离子态区,还是烟雾流动的气态区,都存在温度,只是燃烧区域的温度会远远大于烟雾的温度。
vel速度场速度场存储了流体解算器最终计算好的速度信息,它描述了流场区域内每一个点上速度的大小和方向信息,这是一个包含了3个分量场的数据,即:速度场数据通过3张 3DTexture 对象进行存储(vel.x,vel.y,vel.z)。
渲染: 速度场通常在流体渲染绘制运动模糊 (motion blur) 的时候,需要参与渲染的计算。
fuel燃料场燃料场作为燃烧计算的Input,模拟燃烧反应需要首先在燃烧的位置设置燃料信息,这里是指给 fuel 燃料场进行赋值操作,数值越大,代表该区域的燃料密度越高,燃烧反应越剧烈。
渲染: 如果我们在渲染的时候,也对燃料场进行绘制,就可以看到在燃烧反应的过程中,燃料一点点被消耗殆尽,并产生出火焰的过程

103 Smoke Control

在101案例展示了最基本的烟雾制作流程,并对各个场的基本原理了解了之后,我们来进一步细化 101 案例中的烟雾效果,给它的动态增加一点点细节

湍流

湍流是一种流体力学现象,它是流体运动中的一种混乱,不规则的运动形式。在制作流体解算动画时,通过往流体的计算过程中注入湍流控制,可以使我们的最终解算结果得到更多的模拟细节。

drawing

如图(上):在先前的101 Simple Smoke Example 案例中(最左),烟雾没有添加任何湍流效果控制,可以发现烟雾的动态效果十分单调,缺乏细节。我们分别在 101 案例的基础上,开启不同类型的湍流控制,可以看到烟雾产生了不同的细节变化,这里演示了在 Catalyst FX 中,分别开启3种常用的湍流作用后的效果对比,分别是:Vorticity Confinement,DisTurblance 和 CurNoise。这3种湍流效果都有自己的优缺点,我将通过后续的章节依次分别展开讲解。

局部控制 & Visualization

drawing

如图(上):我们观察101 Simple Smoke 案例可以发现,烟雾在形成的初期没有任何细节,但在经过一段时间发展和不断翻滚后,可以渐渐的生成出很多细节(尾部烟雾较淡的区域),所以我们此刻希望拖尾部分的形态保持现有效果,仅对刚刚发射出来的烟雾(红色框内)添加 CurlNoise 效果进行一个打乱处理,这个时候,我们就需要对流体进行分区湍流控制。

在Catalyst FX 中有多种方法提取提取流体的局部区域,来进行局部效果控制,这里我们先介绍一种最直接的概念:阈值(Threshold),阈值的概念很好理解,指的是当场内的某一个数值超过设置的 阈值 的时候,才开始起作用,拿这里我们即将添加的CurlNoise效果来举例,CurlNoise 默认情况下仅在有温度的区域起作用(流体内部),当温度小于一个 阈值的时候,就不再产生作用效果,默认情况下,CurlNoise 不会在温度数值小于 0.15 的区域起作用(由 Clamp Below参数控制),所以接下来我们需要借助到 Visualization 功能,帮助我们更定量化的观察流体内部的运动状态。

drawing

如图(上):在Catalyst Solver 节点的 Visualization 参数面板中,找到 Temperature 子面板,勾选开启 Active 开关激活 Temperature 温度场可视化,调整 Offset 数值为1,将Visualization 切片移动到流体容器框外部。这里可以看到可视化切片呈现出冷暖渐变过度效果,这种冷暖渐变过度效果的展示,被称为:False Color,False Color的灵感来自于光谱,为了方便理解,我们这里可以简单的理解为:颜色越偏暖色的区域数值越大,颜色越偏冷色的区域,数值越小。

drawing

如图(上):Visualization Range 可视化范围,设置了当前场从冷色到暖色的区域范围,这里设置的数值是 0 ~ 1,在此处的含义是:温度场数值从 0 ~ 1 映射到 False Color 紫 ~ 红(冷色 ~ 暖色)的渐变过度显示。可以发现在烟雾发射的初期,烟雾内部温度较高呈现出纯红色的 FalseColor 可视化,随着烟雾在空中飘散,烟雾尾区域的温度逐渐降低呈现出蓝色到深蓝色的FalseColor可视化结果,如果这个时候我们希望查看哪些区域的温度强度小于0.5,可以将Visualization Range 设置成 0.5 ~ 1 (画右)。可以发现此时的可视化功能不再对温度数值强度小于 0.5 的区域进行可视化处理,出现FalseColor可视化的区域,温度场的数值均在 0.5 以上。

drawing

如图(上) 设置 Temperature 温度场可视化 Visualization Range 的数值为 4 ~ 10 ,可以发现基本上随着烟雾的飘散,温度场的数值会很快降到 4 以下,烟雾仅会在刚被发射的初期,存在高温区域,刚好和我们需要增加湍流细节的区域匹配,所以这里我们可以跟进温度场的强度,来进行 CurlNoise 添加区域的选则。

drawing

如图(上) 在Catalyst Solver 的 Turbulence 面板下勾选 CurlNoise 选项,在当前烟雾动态的基础上添加 CurlNoise 湍流,这里我们先设置 CurlNoise 的强度为3,然后设置 Clamp Below 数值为4,也就是温度小于4的时候不添加 CulNoise 效果。并开启当前面板下 Visualization 参数组的 Active Visualization 勾选,解算器会将当前CurlNoise的计算结果在 Viewport 中进行绘制,帮助我们观察 CurlNoise 的实际作用效果和范围。这里适当的降低烟雾显示浓度可以发现,CurlNoise 的作用范围仅发生在了烟雾刚产生时的内部高温区域(温度大于4的区域),拖尾处的烟雾是没有受到 CurlNoise的影响的,和我们的预期一致。

drawing

如图(上) 这里对比了当前案例开启 局部 CurlNoise 控制和关闭局部 CurlNoise 控制在前50帧的效果区别。通过仅在发射器刚产生烟雾的高温区域添加 CurlNoise 湍流控制,“破开”了烟雾在刚生成状态下过于规则和僵硬的感觉。

分层控制

和创作一幅画面的思路一样,整个 Catalyst FX 的参数设计,遵从从整体到局部的效果调整步骤和原则,创作者在使用Catalyst FX 进行效果制作的时候,我们建议先从流体动态的大形态入手进行效果调节,然后逐步一层层增加二级细节。拿当前案例所讨论的湍流(Turbulence)来举例,Catalyst FX 中所提供的每一种湍流都有自己合适的作用范围,比如 CurlNoise 会更适合用来调整流体的大形,而 DisTurbance 则更适合在流体大的形态比较确定的基础上,增加丰富的流体表面扰流细节。

如果对应到具体的应用场景中,拿制作一个5公里*5公里区域的山间雾气的效果制作来说,我们首先需要关注的是如果调整出雾气整体效果的大轮廓起伏,这个大轮廓的起伏,对应到5公里的场景中,差不多是效果在 1 ~ 2 公里为单位内的变化,在 1 ~ 2 公里范围内的变化,起伏,动态调整好了之后,我们再进一步的去关注和调整 100 ~ 200 米为单位内的细节变化情况(可以使用CurlNoise + 各种局部控制), 最终,我们可以添加一些更细腻的湍流(如:DisTurbance),来生成 10 ~ 50 米范围内的流体细节

drawing

如图(上) 在当前的案例上,简单的展示了使用 Catalyst FX 制作效果时,从整体到局部的调参思路。左右往右,首先是没有任何湍流控制的原始效果,然后是使用CurlNoise调整流体大形态,最后使用 DisTurbance 生成最细表面细节。【图103.8】

drawing

如图(上) 对流体添加的每一层湍流效果的作用强度,作用范围,都可以单独的被可视化出来,方面我们对每一层效果进行绝对精准的控制。这里不难发现 DisTurbance 被添加在了流体最外围的边缘区,而先前添加的 CurlNoise 只在流体内部温度较高的区域产生作用效果。这里我们也建议大家在使用Catalyst FX 制作效果的时候,每一层效果都进行单独调整,单独可视化,在确保每一层的效果都符合预期之后,再进行最终高精度成品质量的解算。

高频,低频

高低频率的概念在科学和艺术创作领域出现的十分常见,但很少有资料对这一重要的概念进行深入的讲解,比如在绘制或创作一幅画面的时候,通常会因为对把控画面视觉重心的需要,引出画面“繁简度”的概念。从数学或自然科学的角度来讲,繁简度这是一个有关画面信息高低频控制控制的理论,繁简度这个概念的出现,帮助人们在电影,动画的工业化生产中,定量化的调整和把控画面的视觉重心。

回到我们现在制作的案例,所谓高频和低频的概念,指的是某一种效果元素出现的次数,这是一种最简单的理解方式,比如在当前的演示案例中(【图103.8】),烟雾流体在添加了 CurlNoise 后,可以发现 CurlNoise的作用效果,在整个流体上一共出现了大概 20 ~ 30 次,而DisTurbance的效果则出现的更多,整个流体表面铺满了 DisTurbance 的效果影响,出现的次数至少超过了100 次。所以这个时候我们就说 CurlNoise 对流体起到了一个低频控制(或者说大形态控制),而 DisTurbance 就是一个高频细节调节

如果想进一步控制这些湍流在画面中的出现次数,我们可以通过设置湍流的尺寸大小来实现,这里对Catalyst 所有的湍流做一个频率尺寸,和应用区域的总结,汇总到下面的表格。

湍流名称频率大小控制参数参数单位作用范围(Threshold参数)
CurlNoiseSwirl Size场景单位,默认是米默认情况下,只在有温度(temperature)的地方产生 Curl Noise,也可以理解为 CurlNoise 仅在流体效果的内部起作用
DisTurbanceBlock Size场景单位,默认是米在密度(density)小于一个数值的时候,才开始起作用,通常这个区域就是流体的边缘。也就是说,为了尽量保证 DisTurbance 添加后不影响到流体的大形态,被设计成尽量只在流体表面起作用的方式
ShreddingBlock Size场景单位,默认是米只在火焰的边缘处添加
Vorticity Confinement无法控制频率只在流体内部添加

在后续的章节中,会尽量进一步对每一种效果的每一个参数的不同强度给出效果对比图,方便大家更好的理解每一个参数到底产生怎样的效果贡献,我们称这样的参数强度到最终效果对比的形式为:Parameter Map


104 燃烧制作流程简介

在了解了基本的烟雾制作流程后,我们可以尝试按照同样的步骤来了解一下火焰效果在 Catalyst FX 中的制作步骤和相关注意事项。

基础发射器设置

drawing

如图(上): 和制作烟雾的流程一样,我们首先创建Catalyst Source节点作为发射器,设置发射器为流场提供燃料(fuel)和温度(temperature)数据,并作创建 Catalyst Solver 解算器节点,作为其输入节点。

drawing

如图(上): 设置解算器节点上的发射器配置,和发射器配套并相对应的,在Catalys Solver 解算器节点的 Sourcing 面板下,开启 Temperature Sourcing 参数组 和 Fuel Soucing 参数组的 Enable 勾选,将发射器提供的燃料和温度数据发射进流场中。

drawing

如图(上): 在解算器节点的Fuel Recation 面板上,开启 Enable Combustion 勾选,设置Fire Cooling Down 参数组的Fire Height 参数,并调整到合适的计算精度,得到火焰燃烧的基础解算结果。这里我们可以通过当前的操作步骤,简单的总结一下燃烧效果的计算流程大致分为3步:1. 设置流体发射器和流体解算器发射燃料(fuel)和温度(temperature)2种属性。2. 开启解算器上的 Enable Combustion 参数,打开燃烧计算功能。3. 当发射的燃料遇到温度时,会被点燃,并形成最终的火焰效果。

更细的燃料反应计算流程,会比当前的描述复杂很多,我们将在后续的燃烧章节中进行进一步讲解和 Parameter Map 效果对比展示,接下来我们先来对当前效果进行进一步的细化和完善。

设置发射器扰乱

我们注意到当前的燃烧效果在产生燃烧的位置,火苗的形态过于稳定和规则,这和先前的烟雾基础案例效果存在同样的问题。除了先前案例中提到的 CurlNoise + Threshold 参数做局部形态控制以外,这里我们也可以通过在发射器上添加Noise 扰乱来实现对流体规则形态的破坏。

drawing

如图(上): 回到 Catalyst Source 发射器节点上,增加发射:Velocity 速度属性,并勾选速度属性参数组下的 EnableNoiseShowGuide 参数勾选,开启速度Noise扰乱,和线框可视化功能。通过观察Viewport可以看到当前的发射器所添加的速度场信息,已经处于不规则状态。

通过设置 Amp 参数可以控制Noise扰乱的强度,这里我们设置扰乱强度为30,让发射出来的火焰尽可能多的受到 Noise 作用影响,Freq 用来控制扰乱的空间频率周期,该数值越大,Noise 在空间上的变化就越剧烈。Pulse 参数用来设置Noise在时间维度上的变化速率,即:Noise的效果是随着时间而变化的,它不会在每一时刻都保持同样的状态。即便Noise的基础参数设置完全一样,但在不同的时间上(如:第 20帧,第 40帧), Noise 也会得到完全不同的的效果 。这里Pulse的单位是秒,在当前案例中我们设置 Pulse 的强度为1,指的是Noise的状态,会在未来1秒内发生一次完整的周期性变化。

drawing

如图(上): 在添加了发射器的速度扰乱信息后(行2),我们可以和先前的计算效果进行对比(行1),可以明显的看出第一行的效果从头到尾都是一个近似的形态,而添加了发射器速度扰乱之后,每一个时刻流体的大形态都会产生较大的差异。

这里,我们回顾基础烟雾效果制作案例中所提到的:整个 Catalyst FX 的参数设计,遵从从整体到局部的效果调整步骤和原则,发射器控制,在绝大多数的效果制作中,都对流体的大形态起到了决定性影响,甚至在不少资深特效艺术家的观念里面,他们会认为一个好的流体效果表现,80%靠发射器的设置,20%靠解算器的参数调节,控制好了发射器,就控制了一切。

从另外一个角度来看待这个观点,也侧面说明了:对于一个好的画面效果来说,处理和把控画面整体大形效果的重要性,远远高于解调整设置精细的湍流运动细节。这一部分的更多细节,我们会在后续章节有关破碎烟雾效果制作部分进行更多展示。

添加 Shredding

Shredding 是一种专门为模拟火焰效果而设计的湍流,它是对 DisTurbance 方法的一种改进。这里我们为当前的火焰效果,进行简单的 Shredding 湍流效果添加。

drawing

如图(上): 在 Catalyst Solver解算器节点的 Turbulence 湍流面板中勾选 Shredding 启用勾选,打开Shredding 湍流
,可以对比发现,相比原始默认解算结果,Shredding 湍流更容易在火苗边缘产生尖锐的细节,这在燃烧尺度(Scaling)的控制中是十分关键的。规模较大的火焰燃烧效果,往往在火焰的边缘会有更多的细节(),而较小尺度燃烧的火苗,容易形呈现出连续,流畅的长线条()。(补充:这里用到的“流畅”一词,可以从我们在学习绘画时,控线的角度来理解,它指的是我们绘画时,画面线条没有断裂的现象。在计算机物理动画领域,很多效果也会关心这个指标,尤其是在制作中国风布料效果解算的时候,会追求褶皱的连续和流畅,这部分内容会在我们的布料解算产品 VeraFiber 中进行详细讨论。)

尽量减少全局控制

在流体动态发展的初期,流体通常会处于一个非常规则,光滑且僵硬的状态,这些僵硬的形态是我们所不希望看到的,因此围绕着如何打破这些僵硬的效果,解算器设计了丰富的发射器控制,和湍流控制功能。但诺这些功能被过度使用,则会给效果带来一些负面影响,使原本满足物理运动规律的流体效果,变得不像流体。

为了最大程度避免这样的问题,我们提出了这个尽量减少全局控制这个原则,拿当前案例的 Shredding 湍流效果来举例。我们在使用 Shredding 湍流后,默认会根据流体的速度(MaskFieldType)大小来关联 Shredding 湍流的作用强度,速度越大,Shredding 湍流的作用效果越强烈。通过 Mask Range 参数,可以进一步设置这个速度大小的关联范围,默认0~5的数值,代表了速度从 0 ~ 5 对应了 Shredding 的作用强度 0 ~ 100%。

drawing

再进一步开启 Remap Mask Field 勾选,会激活默认的 Ramp 曲线编辑面板(如图:上),出现的这条控制曲线的含义表示了 Shredding 湍流的作用强度跟随速度的大小而变化的同时,也会受到曲线(高度)的重映射影响。曲线横坐标 0 ~ 0.5 的范围表示了流场内流体运动的速度越快,则流体受到的 Shredding 湍流强度逐步增高,曲线横坐标 0.5 ~ 1.0 的范围则表示流体运动速度进一步增大的时候,所受到的 Shredding 湍流强度又会逐步减少。

这和我们的需求匹配:流体效果从无到有的产生过程,通常也伴随着流体运动速度的逐渐增大,而这一过程早期的运动规律,通常是我们需要通过各种湍流控制和发射器控制所要打破的,一旦打破了流体形成早期可能出现的“规则”和“僵硬”的动态效果后,我们还是希望流体可以保持一个相对物理的运动规律发展下去,不再进行额外的过多干预,尽量把控制权交给解算器本身。

尽管这种控制方式,不一定适用于所有的应用场景,但这种尽量减少全局控制的设计思路,会始终贯穿 Catalyst FX绝大多数模块的设计理念和调参思路。这一点,我们也可以从 Houdini Pyro FX 2.0 到 3.0 的参数设计变化中得出类似的结论规律。这部分的具体内容,我们会在接下来的 Combustion 专题章节中继续进行更深入的讨论。

202 浓烟 Dense Smoke Example

在已经调整好火焰的形态后,如果我们希望在燃烧的火焰上产生浓烟,可以通过开启位于 Catalyst Solver 节点 FuelReaction 面板下 Combustion Dense Smoke 参数组中的 Fuel Create Smoke 勾选打开浓烟生成功能。

drawing

如图(上): 设置 Combustion Dense Smoke 参数组中 Smoke Amount 系数为 2 ,在燃烧不充分区域产生的浓烟强度为2的效果。在最终渲染的时候,我们也可以关闭火焰渲染,仅保留烟雾,也是一种较常见的浓烟制作方法。