构建基本纹理采样发射器

计划

在本教程中,我们将从头开始构建两个 Niagara 系统。一个是通过对简单的流图纹理进行采样来设置初始粒子属性 – 并通过修改它,通过对动画书进行采样来动态改变条件的第二个系统。提供的所有资产:打包成2.4 MB 的 ZIP。

我们的第二个系统的示例数据是卡门涡街的翻书渲染速度贴图,这是一种经典的流体动力学现象,重复旋转涡流,在虚幻编辑器中使用 FluidNinja进行模拟和烘焙。

介绍

利用流体动力学是 VFX 社区的一项持续努力,并为创建逼真的气体、液体和各种空灵效果提供了基础——无论是恶魔召唤还是空间扭曲。

我们即将在游戏中使用实时模拟:看看Niagara 中用于基于粒子的模拟的新模拟阶段功能和体积插件,能够对网格进行体素化并模拟固定网格系统中的流体行为。

在试验实时流体并等待硬件长大以完成此任务时,我们正在使用预先计算(烘焙)的流体模拟数据,实际上存储为帧序列,折叠为单个纹理:翻书。

动画书示例:

默认情况下,我们使用动画书的方式与使用经典纹理的方式相同:使用材质对其进行采样并将它们映射到场景几何体上。看看这些典型的例子。

Niagara 提供了一个替代用例:利用样本纹理数据接口,我们可以直接使用 Niagara 模块(不需要材料)对流体数据进行采样,并将纹理存储的值解释为浮点/向量/颜色类型变量以驱动任意粒子参数。我们可以使用流体数据驱动大量 GPU 粒子。 

与几何纹理不同,“粒子纹理”不应该是纹理空间和粒子空间之间的一对一拓扑映射:流体数据可以 (1) 为动态模拟提供初始条件,(2) 驱动抽象参数或(3) 相加使用。关键是我们正在改变粒子行为而不是确定。

也许最引人注目的例子是使用来自流体模拟的速度数据来加速粒子。我们不是覆盖固有速度,而是将粒子推向模拟定义的方向,同时允许与场景几何体发生碰撞。与经典的烘焙 VFX 不同,我们的系统可以响应物理。

创建一个简单的纹理采样发射器

想象一下,我们在二维平面上移动,我们的移动方向和速度(统称为速度)由颜色描述。水平移动由红色阴影描述:值 50% 表示我们站立,100% 表示右全速,0% 表示左全速。垂直运动为绿色:向上 0%,站立 50%,向下 100%。想象一下搅拌一碗液体,从顶部制作表面的图片/快照,并根据给定点的流体运动速度为图片上的每个采样点分配红色和绿色值。我们使用存储为纹理的 2D 矢量场来描述运动数据 – 这是速度图又名流图的概念。速度翻书是一系列速度图,描述流体系统速度矢量的时间变化。

我们不需要流体模拟器来制作单个流程图——感谢 Teck Lee Tan,我们有了一个简单、稳定、免费、7 MB 的软件来手绘此类地图:FlowMapPainter  v0.9.2,自 2012 年以来。

我鼓励您下载该工具并玩很多!通过切换 FlowLines 和 VertColor 标志,您可以可视化上述矢量和颜色。您还可以预览动画流。创建流程图并将其拖到虚幻内容浏览器开始开发!我做了一个简单的、圆形的、顺时针的画笔描边——这个描述循环流的流程图将是我们第一个系统的样本数据。 

流图画家:

启动虚幻引擎,在内容浏览器中创建一个工作文件夹,将流程图导入该文件夹。右键单击空白区域并选择 FX / NiagaraEmitter / 从模板创建一个新的发射器 – 然后选择“Empty”类型。

创建一个新的发射器:

进入 Niagara 编辑器后,保存空系统。作为第一步,我们将添加一个生成位置模块。单击粒子生成旁边的绿色加号 (+) 并选择位置/网格位置。模块出现 – 带有警告。别担心,GridLoc 需要另一个模块作为先决条件。选择“修复问题”。在“Emitter Update”组下创建了第二个“Spawn Particles in Grid”模块 – 带有第二个警告。再次,选择解决问题。全部完成后,我们将得到两个新模块。

添加了网格位置和生成粒子模块:

右键单击 GridLocation 模块并选择 Insert Above,然后在模块浏览器中开始输入“texture”——你看到“Sample Texture”模块了吗?挑选。

添加样本纹理模块:

添加了示例纹理模块。接下来,选择堆栈顶部的 Emitter Properties 模块,并将 Sim Target 从 CPU 设置为 GPU(只有 GPU 发射器可以采样纹理)。另外,将本地空间标志设置为 ON。

发射器属性:

同时,停止时间线重复播放(底部黄色条,将垂直定位器拖动到3-4秒)+转到视口顶部,单击点亮,转到曝光,关闭“自动”并将EV100设置为2 .

我们将回到 SampleTexture 模块。选择流程图作为纹理输入。

样本纹理:

接下来,我们将通过 UV 坐标处理纹理到粒子的映射。公理:我们可以使用 2D 坐标系来处理(采样)纹理像素 – 两个轴(U 和 V)描述了采样头的水平和垂直位置。图像的左下角像素是 0,0 右上角是 1,1。要将(映射)纹理信息分配给粒子,我们可以使用 3D XYZ 粒子位置的第一个和第二个值 (X,Y) 作为 UV 坐标。我们的粒子已经排列在 2D 平面/矩形网格上。我们需要做的就是:读入粒子位置并以最小-最大坐标值适合 0-1 范围的方式转换值。要执行此转换,我们需要缩放(乘法)和偏移(加法)。

单击 UV 数据行右侧的小箭头。输入“break” – 并选择 Break Vector 2D – 这样我们就可以分别处理 U、V。

中断向量 2D:

现在,我们将 (1) 从 XYZ 粒子坐标中选取 X 值,(2) 对其进行变换并 (3) 将其用作 U。单击 X 旁边的箭头并从向量中选取“使浮动”。选择“X”作为频道。对 Y (V) 执行相同操作,但选择“Y”作为通道。

使向量浮动:

看看上面的截图:我们将使用“黄色”颜色值作为 U、V。

现在我们正在为我们的输入字段配备转换工具(add、mult)。单击小箭头,键入“添加”,选择“添加向量”。对 U,V (X,Y) 执行此操作。

添加向量:

请注意,我们现在有 A 行和 B 行 – 我们正在将 B 添加到 A。现在,单击_A 行_旁边的小箭头,然后输入“mult”,选择“乘以浮点数的向量”。对 U,V (X,Y) 执行此操作。我们应该像这样结束(见下图)。

向量乘以浮点数:

我们拥有将粒子坐标转换为 UV 0-1 值所需的一切 – 作为下一步,我们请求粒子坐标!看看上面的图片 – 我们将用 XYZ 粒子 pos(分别仅使用 X、Y)填充黄色输入字段。

单击输入字段旁边的小箭头,转到链接输入/粒子并选择“粒子位置”。

粒子位置:

让我们仔细看看这个样本纹理模块。双击堆栈中的模块。一个图形编辑器(Niagara 模块编辑器)弹出。

样本纹理模块:

请注意 Map Set 节点中两行中的第一行: OUTPUT MODULE SampledColor – 这是模块输出,采样纹理数据,我们将被模块堆栈中下游(下部)的其他模块使用。现在关闭模块编辑器。返回通用模块堆栈查看器。选择“初始化粒子”模块。单击“颜色”输入字段旁边的小箭头。Go Link Inputs / Output 并选择之前看到的“OUTPUT SAMPLE TEXTURE”。

初始化粒子 – 选择 OUTPUT SampledColor:

我们刚刚将采样的纹理数据引导到粒子 – 您可能已经注意到(默认情况下)视口中的粒子颜色发生了变化。粒子已经“有纹理”了,但是纹理缩放是错误的。还有一件事:将“精灵大小”设置为 15(默认为 5)。

我们将回到 Sample Texture 模块并稍微处理一下粒子坐标到 UV 的转换。将浮点乘数设置为 0.001(比例),并将偏移向量的 X、Y 值设置为 0.5。

粒子坐标到 UV 变换:

希望我们最终能将粒子网格正确地与流程图进行颜色映射。颜色映射只是一个参考——这样,我们正在可视化运动矢量场。请记住,颜色代表速度和方向。那么让我们将此数据传送到速度模块!

单击 Particle Spawn 组标题旁边的绿色加号 (+),键入“velo”并选择“Add Velocity”模块。不要担心警告:单击修复问题:理论上,这是在堆栈底部添加一个求解器 – 应该会出现“Solve Fores and Velocity”模块。如果没有,我们将通过单击粒子更新之外的绿色加号 (+) 并手动选择它来创建一个。还有一件事:在我们的第一个示例中,我们想设置初始粒子速度 – 因此让我们将 Add Velocity 模块在堆栈中向上拖动一步 – 它应该位于“应用初始力”模块上方。我们应该像这样结束(见下图)。

添加了 Velo 模块:

选中“Apply initial force”,“Apply force to velocity”标志应该被启用。选择添加速度模块。接下来,我们将从采样的 4 通道颜色数据 (RGBA) 中生成 3 通道速度矢量 (XYZ),并将其用作模块输入。请记住:采样颜色数据使用 50% 的红色和绿色值作为空点,使用 0% – 100% 作为相反的最大值。这是因为纹理通常不能包含负值。现在……工程师喜欢在 (-100%) (0%) (+100%) 范围内描述速度……所以我们需要在这里做一个转换。单击小箭头,键入“添加”并选择“添加向量”。关注 A 行:小箭头,键入“make”并从“颜色”中选择“制作 Vector3”。我们的 velo 输入面板应该是这样的(见下图)。

Velo 输入和转换:

单击颜色输入字段旁边的小箭头,转到 Link Inputs / Output 并选择 OUTPUT SampledColor。将添加的偏移量(向量 B)设置为 (-0.25)。单击 vecB 下方向下的小箭头,将 Scale added Velocity 设置为 (250,-250,0)。第二个值是负数,因为愚蠢的 FlowMap Painter 正在翻转绿色通道。您可以在“初始化粒子”模块中调整粒子寿命,并在发射器更新模块中调整发射器寿命/回收。为了让粒子很好地淡入淡出,在粒子更新中添加一个缩放颜色模块并为 alpha 绘制一条钟形曲线(使用曲线函数的浮动)。

教程第 1 部分完成,在时间轴上按下播放 – 看着视口,我们的粒子应该以我们的纹理定义的速度开始它们的生命 – 在我的例子中,它们在循环移动(见下图)。

粒子速度组:

创建动画书播放发射器

我们的第一个发射器是根据纹理设置初始参数。我们将修改这个发射器以不断改变粒子运动 – 使用存储在翻书中的烘焙模拟。

在粒子生成组中禁用“添加速度”。向下拖动“样本纹理”模块,在“粒子更新组”的顶部。使用粒子更新中的绿色加号 (+) 添加“Sub UV Texture Sample”模块。堆栈应如下图所示。

添加SubUV模块:

我们将通过合并 SampleTexture 和 SubUV 来制作一个新的 Niagara 模块。双击 SampleTexture。我们在图形编辑器中。点击左上角的“浏览”。我们已经在内容浏览器中本地化了该模块 – 我们将克隆它。右键单击模块资产,选择复制,随意命名。我将其命名为“SampleTextureFlipbook”。保存。回到尼亚加拉。禁用“样本纹理”和“子 UV 模块”。除了粒子更新之外,将新创建的模块添加到带有绿色加号 (+) 的堆栈中。将它向上拖动到堆栈中两个禁用的模块下方。双击它打开图形编辑器 – 保持图形打开并切换回 Niagara 堆栈视图:双击 SubUV 也可以打开一个图形。我们在两个选项卡上都打开了自定义模块和 SubUV。 

复制粘贴模块节点:

将活动选项卡更改为 SubUV。选择 MapGet 和 SubUVTxtureCoordintes 节点。Ctrl+C(复制到剪贴板)。将选项卡更改为我们的自定义模块。Ctrl+V(粘贴)。连接与配置类似的节点,如下图所示。

新模块:

回到堆栈视图:选择我​​们的自定义翻书阅读器模块。选择包含的速度翻书作为纹理输入 (T_Fluidninja_Velocity_Flipbook.uasset)。

将 X-count 设置为 7,Y-count 设置为 6。我们将复制粘贴我们上次为 Texture Sample 模块所做的 UV 设置。请选择“样本纹理”模块,将鼠标悬停在 UV 行中的空白区域(在纹理选项下方)。右键单击,选择“复制”。此操作将 UV 行下的整个层次结构复制到剪贴板。请返回我们自定义的 Flipbook 阅读器模块,将鼠标悬停在 UV 行中的空白区域,右键单击,粘贴。应该出现层次结构。在模块详细信息的顶部,单击“阶段”行旁边的小箭头 – 并键入“时间”,选择引擎时间。这个不断增长的值将导致翻书上的帧到下一帧跳跃(回放)。与前一种情况一样,我们希望进行颜色预览。
同样,在链接输入/输出下,SampledColor(小心,禁用的 SampleTexture 模块的输出也在列表中 – 不要选择)。按播放。希望您会在视口中看到正在播放的动画书(见下图)。

Velo 翻书在视口中播放:

接下来,我们将使用此颜色信息来加速粒子。右键单击 Solve Forces 模块并选择“Insert Above”,然后选择“Acceleration Force”模块。选择新模块。在调用采样颜色数据之前,我们准备转换。单击加速度行旁边的小箭头,找到“乘以浮点数的向量”。

Accel 模块,多个:

下一步:单击矢量行旁边的小箭头,然后找到“添加矢量”。单击 Vector-A 旁边的小箭头,找到与我们使用颜色(链接输入/输出)相同的方式的翻书模块输出。将 Vector-B 设置为 (-0.5, -0.5, 0) 并将下方的浮点数设置为 3000。将坐标空间设置为本地。

将“Drag”模块添加到 Particle Update 组,将其拖到 Acceleration Force 模块下方(两者都应该在 Solver 上方),并将 Drag 值设置为 3。现在,我们应该看到我们的粒子在旋转。

Accel 模块,参数:

让我们做一些调整!选择 Emitter State 模块,并将循环持续时间设置为 0.5。选择初始化粒子模块。将 Lifetime 设置为 4,精灵大小设置为 5。转到 Grid Location 模块,并启用“Randomize Placement Within Cell”。您可能在前面的示例中创建了 Scale Color 模块 – 如果没有,请转到 Color 模块,按 Output Link 下面的箭头,然后在新出现的面板区域上,为 Scale Alpha 设置“Float from Curve”,如下所示(下图)。

颜色、比例 Alpha、曲线浮动:

最后一步,将“碰撞”模块添加到粒子更新组,在拖动和加速之间移动它。强制模块,并设置以下值(下图)。

碰撞模块参数:

还有一件事:不是让整个区域充满粒子,而是让我们尝试将粒子发射区域限制在一个小矩形内,靠近假设的卡门涡旋起点。

选择“Spawn Particles in Grid”模块,并将 X、Y 计数都设置为 20(减少粒子数)。接下来,选择 Grid Location 模块,并将 XYZ Dimensions 设置为 (2,3,2),将 Randomize 设置为 (10,10,10),将 Offset 设置为 (0,400,0)。注意:Y=400 偏移值将粒子发射矩形从中场推到底场。

网格重新配置:

注意 2:要将新创建的发射器放置在关卡上,我们应该将其嵌入 NiagaraSystem。在内容浏览器中创建一个,右键单击,FX,Niagara System,New System from Selected Emitter – 并选择之前创建的 Emitter – 然后将系统拖到关卡中。系统应该在不按播放按钮的情况下工作(在关卡编辑器标准模式下)。尝试将对象移动到粒子流中并尝试碰撞。 

我们已经完成了我们的第二个发射器 – 恭喜,如果您已经完成了这个分步过程。希望你喜欢!如果出现问题,请不要担心:此处提供所有资产(版本在 UE 4.25 下),只需将它们复制到您的内容文件夹并将您的工作与现有资产进行比较。

编辑器中的卡门涡街:

返回首页 

作者 CG-BOX

发表评论