模拟烟雾和填充森林

介绍

我叫Giorgy Macharashvili,今年28 岁,在CGF Visual Effects Studio工作,担任 FX 艺术家。我几乎是偶然接触到 CG 的。我是一名经过培训的舞台导演,更重要的是,我在一个没有互联网的村庄长大,直到 18 岁时才拥有了我的第一台电脑。

当我还是一名二年级学生时,这个灵感给了我灵感,我在观察水族馆里的鱼时萌生了创作卡通的想法。于是,我开始研究。我掌握的第一个软件是Anime Studio。在完成我的第一部动画电影后,我开始学习Cinema 4D和After Effects。

有一天,当所有的 YouTube 教程都已经看完后,任何自学成才的 CG 艺术家都会发现他/她想要更多东西。2015年,当我意识到自己达到了自学的极限时,我搬到了莫斯科,进入了尖叫学校。

在那里我学习了Maya、Nuke和Houdini。这些课程给了我扎实的经验和在 CG studious 工作的必要基础。第一年结束后不久(一个课程持续 2 年),我开始在 CGF 工作室的 Tracking and MatchMove 部门工作,并在半年内晋升到 FX 部门。

想起今天那个水族馆,我要警告你:小心,朋友,CG很容易上瘾!尝试一次,你就会上瘾!

火焰模拟:开始

不管效果的难易程度,首先要考虑好最终版本。你需要对你想要实现的目标有一个清晰的愿景,否则你将不得不做很多最终可能被拒绝的无用工作。在热模拟的情况下,您绝对需要参考,因为这种类型的模拟是最不可预测的。

下一阶段是创建源对象。这些参考决定了您需要多少温度、烟雾、燃料、发散度和速度。你准备的来源越好,效果就会越冷。

当我们知道我们的目的地点后,我们就可以开始设置模拟了。有时结果需要不超过 5 个节点,但通常,复杂的效果需要大量的程序字段和蒙版。我们稍后会更详细地讨论它。

根据设置,所有的热模拟可以分为 4 组:

  • 冷烟。您唯一需要的字段是密度。烟雾在没有温度场的情况下传播。

GIF 动画 – 在 GIPHY 上查找和分享

  • 热烟。烟雾被温度场向上移动。
  • 。它由燃料和温度字段组成。如有必要,可在模拟过程中稍后出现烟雾。

通常,这三种模拟类型也使用速度场。

GIF 动画 – 在 GIPHY 上查找和分享

  • 爆炸。有温度、燃料和发散字段。发散根据燃料和温度扩展爆炸(但也可以在没有它们的情况下工作)。模拟过程中出现烟雾。

在复杂的模拟中,我们通常必须组合所有这些字段并创建自定义字段。

蘑菇状烟雾

让我们继续讨论工作流本身。或许,艺术家面临的主要问题之一是蘑菇状云。

在现实世界中,光滑的蘑菇状云很少出现,这就是为什么人眼很容易将模拟与现实区分开来。可能很多专业艺术家不会在我接下来的话中找到任何新东西,但那些不熟悉 FX 的人可能会发现一些有用的东西。

当物质从一个体素高速移动到另一个体素时,就会形成蘑菇。有几种方法可以避免平滑:

  • 最简单的方法是添加湍流、扰动和切碎等形状。当爆炸快速移动时,它们工作得很好。但是当过程变慢时,它们会破坏它,因此您必须为这些形状的影响设置动画。毋庸置疑,它违反了程序性工作流程。

在这里,我使用了两对干扰形状。第一个影响矢量场 Vel,另一个影响温度。我还添加了湍流。就这样。

  • 另一种方法是在着色阶段添加位移。成功的关键是适当调整 Rest 字段。爆炸必须有两个在指定帧数内变化的静止场。爆炸增长得越快,Rest 持续的帧就越少。在 Rest 之间移动的速度也很重要。它以秒为单位测量并由静止比控制。

当两个 Rest 都准备好后,我们可以添加 Displacement。

这种方法的缺点是 Rest 是一个向量场。它会占用大量磁盘空间并增加渲染持续时间。

  • 面具的创作
  • 一个遮罩,用于在模拟进程的方向上塑造爆炸的轮廓。

为了沿着密度的轮廓创建掩码,我们应该计算两个向量场之间的点。第一个字段是 Vel,第二个字段是我们将从 Volume Gradient 中获得的字段。将点写入该字段并可视化以查看其工作原理。之后,我们将使用结果来影响密度。

  • 震中距离掩码

这个就更简单了。定义遮罩生效的位置和距离。在我的示例中,常量是 {0, 0, 0} 但实际上,可以通过多种方式定义位置,例如从 Sop 级别到点云开放。

等等。Vop 有助于创建您想要的任何内容。

还有其他方法可以改进蘑菇,例如子步骤升级或低速模拟,但我不会描述它们,因为它们不太有效。

但是,如果您要制造重爆炸,那么密度、温度、燃料和速度是不够的。正如我上面提到的,爆炸必须包含扩展它的发散场。

以下是 Divergence 工作原理的几个示例:

  • 明显的分歧。它同等地影响整个爆炸。

Pyro Solver 有一个节点 Gas Combustion 来扩展我们的体积,但就我们仅使用密度场而言,我们必须再次创建一个类似的节点并使用密度而不是温度和燃料。

我还添加了求解器形状,仅此而已。

  • 部分发散消除

在这种情况下,密度乘以噪声,结果保留在散度中。

它在气体匹配字段中激活。

  • 根据点的半径发散

显然,我们必须创建点,我们可以在源头上做到这一点。我们还需要一个从 -1 到 1 的属性。就我而言,我使用的唯一属性是 Cd。

现在我们可以通过 Vel 场将这些点发送到 Dop 和平流中。

最后一步是调整节点 Gas Particle To Field。您需要在那里设置值和操作方法。

所有这些方法都可以以不同的组合使用。可以通过以下方式改进最终模拟的细节化:https://player.vimeo.com/video/218051833?dnt=1&app_id=122963

爆炸的颜色取决于两个字段:温度和热量。其实他们的名字不是很重要,但类型必须是Float。问题是,我们已经通过爆炸模拟获得了温度场,它会在一段时间后冷却下来。这些参数负责冷却强度。

通常,我通过 Volume Visualization 节点在 Sop 级别上调整爆炸颜色,然后将所有这些设置传输到着色器。

没有秘密技术,一切都在Houdini内部完成。我还添加了体积光来从内部照亮爆炸。

烟雾怪物

每个我的烟雾怪物包含 9 个渲染层:5 个粒子模拟、3 个烟雾模拟和一个身体的体积。我负责烟雾模拟,而我的朋友 Dmitry 负责粒子。知道有些镜头会在一个区域同时显示 20 多个怪物,我们尽最大努力使一切都程序化而不是对资源的要求很高。

我们还通过程序为我们从动画部门获得的动画 Alembic 多边形网格指定了名称。需要它以避免在使用 Wedge 时搞砸(稍后会详细介绍)。

第一层是脸上的烟。它是在没有 Smoke Solver 的情况下完成的。

我从动画中取出了一只怪物。

然后,我通过矩阵变换将怪物放置在坐标中心,并为点源制作了一个 UV 遮罩。然后我做了一个模拟,让点沿着身体移动。点被转换成线,线被转换成几何体,几何体被转换成体积。我还在音量中添加了小噪音。然后矩阵反转,让音量回到动画位置。结果保存在Rop节点中。

第二层是烟雾覆盖怪物的背部。这一层类似于第一层,用热模拟代替粒子模拟。模拟同样简单:它只是向一个方向吹向源的风。

第三层是最重要的一层。让我们更详细地看一下。

从德米特里,我收到了现金。这些行被转换为源代码。

由于怪物远距离飞行,源头被分成了集群。我们计算了整个距离,然后根据镜头的最后一帧将其划分为集群。

然后,我们根据集群的大小创建了一个单独的卷容器。这些集群也需要在 Dop 网络中为容器实例创建点。但是在这些点进入模拟之前,有一个节点集群切换器(稍后会详细介绍)。

通过选择 Smoke Trial 可以获得相同的设置。因此,我们有两个级别的聚类:

  1. 以怪物的名字;
  2. 按每个怪物的集群。

为了避免怪物产生太多烟雾,我增加了 Dissipate 参数并创建了一些 Gas Disturbances。我们还模拟了一个矢量场 Color ,它是渲染过程所需的,只是为了能够在合成阶段添加颜色变化。由于该项目是在 Houdini 16.5 中制作的,我们无法直接使用 Volume Color。我们必须创建一个特殊的设置来从源点挑选颜色并将它们传输到字段颜色。然后,该场根据速度平流。如今,在第 17 版的 Houdini 中,这种方法变得更加容易。

所有这些字段均取自模拟并通过 VDB 收缩节点进行优化。该节点通过稍微偏移的密度切割矢量场。

节省磁盘空间至关重要,有一种更简单的方法可以做到这一点。将密度转换为 VDB SDF,创建 VDB Reshape SDF,设置偏移值,将其转换回密度并通过 Vop 乘以 Vel 和 Density。我们也可以在 Volume Wrangler 中写一行 v@vel*=@density。

然后,我们应该将所有这些字段合并在一起,或者(像我一样)将这些字段分别发送到 Rop 网络以保存在硬盘上。

就是这样。通过使用集群,我们大大减少了模拟计算的持续时间,因为每个集群模拟都很小:

角色完成后,我们准备删除 Blast 并添加一个 Cluster Switcher 节点。这是一个功能丰富的复杂节点。我们需要的主要功能是根据属性切换几何块。在这里我们可以使用这种替代方法:

然后,在 Dop Network 之后,一切都转到 Rop,在那里我们创建了一个 Wedge 节点。我们给它一个指向将触发开关的参数的路径,它查看的值的范围及其总和。

Geometry Node 中有一个特殊的表达式,可以将每个模拟放置到一个单独的文件夹中。

在第三层烟雾的情况下,楔形有两个级别。第一级切换怪物数量,第二级切换集群。

20 个怪物和 10 个集群,每个给我们 200 次模拟。如果您使用渲染农场,听起来就不那么可怕了。一次模拟需要 20 分钟到 2 小时的计算。拥有大约 100 台可用计算机,我们在 3 小时内完成了这项工作。

Wedge 和 Render 农场都加快了模拟速度。但是,例如,如果我们必须在计算机上的 Wedge 和单容器计算之间进行选择,我们可能只会在这两种情况中的第一种情况下看到过程结束,而后者会花费太多时间。

在胡迪尼种植树木

那些你看到很多树木的卷轴碎片是我们在尖叫学校的文凭项目。有 3 个人从事 3D 工作和一名合成艺术家。我们的任务是从《阿凡达》中重新创建一些场景。

我不负责景观,据我所知,这不是在胡迪尼完成的。然而,我负责填充树木,我在 Houdini 中使用非常简单的方法完成了这项工作。

首先,我采用了景观几何图形并创建了点。

每个点都有一个沿垂直轴随机旋转到 0-360 度的法线。属性 Pscale 也有一个由 Houdini 噪声制成的随机值。

然后,这些节点被发送到 Copy Stamp 节点,在那里它们获得了两个随机的邮票属性。第一个属性负责分配从 0 到 2 的值。目的是使用 Switch 节点将三种类型的树几何中的一种分配给点。第二个属性负责在 File 节点内随机上传一个版本的树(每棵树至少有三个变体)。就是这样,没有更多的秘密。景观的每一部分都有自己的节点分支,带有复制戳记,然后所有节点都被合并并转换为带有数据包编辑节点的视口的立方体。

不过,我们确实在树几何方面遇到了一些困难,我将在下面介绍。在放置在点上之前,每棵树都与着色器的路径打包在一起并保存在硬盘上。我们总共有 8 种树,每一种都有一些变化。

我们有六个月的时间,但作为典型的学生,我们拖延了。总而言之,该项目耗时约 2-3 周。

这些树是在 SpeedTree 中制作的,后来在 Houdini 中进行了调整。Houdini 的树有一个很大的缺点:它们太难渲染了。每片叶子的几何形状比叶子在纹理上的空间更宽。作为解决方案,Houdini 提供将所有未使用的空间转换为 alpha。

但这对 Mantra 来说是致命的。当我们渲染一棵树时是可以的,但如果有数百万棵树,渲染将持续很长时间。我们不得不使用foreach用适当的几何图形替换所有叶子。

不幸的是,我没有这个设置,但方法类似于编织:https://player.vimeo.com/video/222127455?color=ffffff&title=0&byline=0&portrait=0

针织的3D -建立一个紫外线消泡剂从Entagma上的Vimeo。

替换叶子后,我们使用带有 PBR 漫反射和半透明的着色器而不是 SSS。

然后将树木打包并保存在硬盘上。一个包由一个点和一个基元组成,它节省了磁盘空间,并且在 Houdini 内部使用起来很方便。

然后,所有的树都按照我之前提到的方式填充并发送到渲染。我们有一个想法,让树木与来自直升机的风相互作用,无需模拟。我们甚至想出了一个设置来在触发器足够接近时启动动画,但不幸的是,我们没有足够的时间来实现它。

还有一棵主树——一棵大树。它是在 ZBrush 中创建的,并在 Mary 中进行了纹理化。我在它周围放了一些苔藓和蘑菇,用藤蔓包裹它并造成了一些伤害。

给学习者的建议

毫无疑问,我最喜欢的教程来自Entagma。我强烈建议您观看它们。

Alexey Smolenchuk还提供了一些俄语课程。他是 Houdini 专家,曾在 Scream School 教过我,现在我们一起工作。

另一个很棒的频道是堀川纯一郎。他创造了华丽的事物,而不仅仅是在胡迪尼。

通常,我建议您观看所有教程。即使是基本课程也可以教授您以前不知道的东西。Houdini官网有大量教程,都是必看的。

不管好坏,我不读专业文学,我更喜欢小说。但是老而有经验的 Houdini 专家建议阅读Navier-Stokes。

返回首页 

作者 CG-BOX

发表评论