Electric Dreams PCG技术详解(二)——沟壑、大型Assembly

图片

Ditch Embankment 逻辑


样条取样和 Assembly


图片


在图表的这一部分,我们首先要收集样条数据,并以预先确定的距离增量对其进行采样。然后对采样得到的样条点应用体积排除,构建干河床区域的入口和出口。储存初始采样点变换,以便之后在图表下游使用。通过变换变化消除 Assembly 的生硬感,结合密度噪点确定 Assembly 的选择。


堤墙与干河床的构成之间存在明显的视觉界限,因此我们采用了 kitbash(拼接)的方法来隐藏重复的堤岸 Assembly,减少需要的 Assembly 总数。为此,我们选择了一个固定增量,它可以在 Assembly 之间生成有趣的相交效果。


图片


Ditch 图表中的所有体积排除基本上都是通过 Actor 标签获得世界中的特定 Actor,使用Actor 边界和差集函数删除选择的点或在图表流中为选择的点创建分支。


堤岸密度播种是第一次应用公开的蓝图控制来驱动最终的堤岸效果。蓝图中还添加了用于增加这个特定变量的按钮。


Assembly 选择和美术导向的覆盖


图片


堤岸 Assembly 的选择是通过一系列点筛选器实现的,再基于密度为点创建分支,应用以美术为指导的体积覆盖,然后在世界空间中生成每个堤岸 Assembly 的点。使用SG_CopyPointsWithHierarchy”节点将 Assembly 点云表示复制到图表流中。


使用程序化方法时,通过确定的方式来维护生成的结果至关重要。因此,如果不会对生成的结果产生级联效应,就不能更改宏观级别的种子。如果世界中某个区域(尤其是黄金路线位置)的程序化生成产生有问题的结果,就要用局部覆盖来纠正有问题的结果。因此,图表在这种情况下使用了美术覆盖。

要想保持确定的结果,可以在样条取样器节点上使用播种控制。这么做可以让样条出于合成或技术原因在世界中移动,但不会影响播种结果。


图片


参见“SG_CopyPointsWithHierarchy”节点的描述,了解使用具有明确的 Actor 层级结构和 Actor 标记的 Assembly 有何好处。


AssemblyActor 标签处理


图片


通过将 Assembly 点云表示复制到图表流中,我们就可以利用 Actor 标签元数据的力量,这些数据在 Assembly 关卡中组成,通过 Level to PCG 资产工具导出到 PCG 设置中。


上面所示的图表使用针对杂物、Actor 旋转、Actor 交换和悬挂 Actor 的点筛选处理Actor 标签。


所有 Actor 标签都使用点筛选器进行处理,从而识别是否存在标签,然后对启用标签的点应用特定行为,并合并流以便处理下一个支持的标签。


使用“应用层级结构(Apply Hierarchy)”节点应用层级的变换,删除在杂物筛选步骤中删除父点的子点。


剔除地表标签和花丛 Assembly 注入


图片


应用层级化父子关系和变换后,我们要处理带“CullGround”标签的点。

这些点在世界中的高度将根据“CullGroundTagsZHeight”蓝图变量进行筛选。


这样做是为了删除世界中经过最终的变换。

低于一定高度的植被,因为可能会产生与岩石资产(由 Ground 图表生成)交叉的植被资产。


图片

来自堤岸 Assembly 的 Actor,“FlowerBush”标签显示紫色。


使用密度噪点和蓝图变量“FlowerBushDensity”筛选其中带有“FlowerBush”标签的任意Assembly 点。然后将经过测试的点作为目标点,用于生成花丛 Assembly。


图片

花丛 Assembly 资产,“ASMFlower”Actor 标签显示蓝色。


花丛 Assembly 点在其自身的流中生成,我们用“ASMFlower”标签筛选这些点,为在Assembly 点中代表每朵花的点创建分支。


然后使用蓝图变量“FlowerDensity”筛选密度噪点,以维持理想的花朵数量,结果将根据生成的每个花丛发生变化。


这部分图表的最终结果是生成静态网格体 Actor。


图片

上图中的花丛密度为 0,下图中为最大花丛密度。

图片


Ditch Embankment Tree & Rocks 逻辑

样条取样、体积排除、岩石和树木点分配


图片


和之前一样,样条取样结果需要排除在 Actor 体积之外,用于在干河床区域创建入口和出口位置。


然后使用全局密度变量“RockTreeGlobalDensity”对剩余点流进行筛选。


点会通过从“RockTreeVariationSeed”获得的噪点密度分配到图表中的岩石或树木流,噪点密度将通过“RockToTreeRatio”变量进行筛选。


定向添加


图片

手动创建的环境会在干河床区域附近留下一片空隙,为了填补这个空隙,我们使用带标签的 Actor 体积捕获了一部分点,把它们转变成了这个区域。


在填充这部分区域时,树木和岩石的分配优先级是一样的。


图片

无定向添加

图片

定向添加


资产变化选择、变换、生成 PCG 资产


图片

岩石和树木点的资产变化是通过大量点筛选器实现的。

图片


使用蓝图“TreeSeed”变量驱动一定范围内的旋转,然后在考虑到全局树木大小的情况下,允许树木点流在一定范围内缩放。

岩石点流将经历固定的种子变换和由变量驱动的全局缩放操作。

然后在岩石和树点图表流上生成 AssemblyPCG 设置。


Assembly 点标签筛选和变化


图片


包含带标签的 Assembly 表示的岩石和点流已经合并。

对合并流应用杂物筛选和 Z 轴旋转筛选。

层级变换和父子关系使用“应用层级结构(Apply Hierarchy)”节点进行评估。

然后,将静态网格体 Actor 实例化,放到世界中。


Ditch Embankment Connection to Landscape 的逻辑


样条取样和体积排除


图片


和之前一样,样条取样结果需要排除在 Actor 体积之外,用于在干河床区域创建入口和出口位置。


样条采样点经过转达到一定高度,与堤岸 Assembly 背面形成清晰的交界线。这些点形成地面 Assembly 的内环。


流通过分支和变换形成地面 Assembly 的外环。


这些点会进行第二轮排除,以防止前面的变换将它们移到排除体积中。


AssemblyPCG 设置生成和变换变化


图片


生成 Assembly 点之后,Assembly 外环将经历“Clutter”标签剔除过程。这是为了删除外环不需要的额外细节。


图片

图一

图片

图二

图片

图三


图一:地面 Assembly;图二:Actor 标签映射,蓝色=“Clutter”,绿色=

“RotZ”;图三:标记“RotZ”的 Actor 为可视化目的而提高高度。

带“RotZ”Actor 标签的剩余点在其本地 Z 轴上随机旋转+/-180。


图片

绿色边界为带“RotZ”标签的地面点形成的外环,蓝色边界为带“Clutter”标签的点形成的内环,红黄相间的边界为带“RotZ”标签的点形成的内环。


最后生成静态网格体 Actor。


Ditch Dirt Decals 逻辑


图片


闭环样条输入经过两次采样,以捕获闭环样条的内部点和沿着样条的边界点。


图片

图片


通过两条不同的点流,边界点被排除在标记“PCG_EXCLUDE”的体积 Actor 之外,用于建干河床的入口和出口区域。


内部点流还将使用距离节点在 800cm 处测试剩余边界点。这会在内部点上创建一个距离场值,保存为密度。


图片

使用密度值确保内部点位于边界点的特定范围内。


图片


内部点通过自我修剪,进一步就减少剩余的点。


图片


使用密度噪点和密度筛选器进一步减少内部点。


图片


对剩余的点应用种子范围变换,进行偏移、旋转和缩放。


图片


然后在世界中生成贴花 Actor。


图片


附加信息

Ditch 图表高度依赖在 Actor 标签上构成元数据的 Assembly 资产。


图片

图片


下面列出了堤岸 Assembly 常用的一些 Actor 标签,上图还用不同颜色做了区分。


图片


在构建密度可以变化的 Assembly 时,例如使用“Clutter”Actor 标签。最好预先定义Assembly 中杂物 Actor 的最大密度,然后从这个最大值开始减小。以程序化方式为Assembly 引入额外杂物的选择高度依赖添加更多元数据来定义空间关系。这将引入开销更大的图表执行来评估空间关系。


这种从最大值开始减小的方法有一个额外的好处是图表执行拥有更好的并行性。


大型 Assembly


图片

图片


描述

大型 Assembly 图表主要用于生成《Electric Dreams》演示项目中展示的交互式程序化悬崖峭壁。它是由沿闭环样条放置的 PCG 设置资产构建出来的,然后使用各种 PCG 和蓝图技术生成交互式山体滑坡和倒下的枯树,接近 Ditch Embankment 样条时,枯树会延伸到 Ditch Embankment上。


设置

大型 Assembly 依赖以下条件:

大型 Assembly 可以独立运行,除其自身的蓝图 Actor 外,不需要在关卡中使用任何东西。


“BP_PCG_LargeAssembly”蓝图 Actor 包含一个样条组件,PCG 图表利用该组件放置堤岸 PCG 设置资产。

大型 Assembly 还可以和 Ditch“PCGDemo_DitchBP”交互,对其样条进行采样,生成倒下的树。


存在“PCGDemo_GroundBP”时,地表 PCG 图表会对大型 Assembly 的样条进行采样,并在地表创建一个洞,形状由大型 Assembly 决定。根据地表规则生成的岩石也会叠加在大型 Assembly 的堤岸资产上。


“BP_PCG_LargeAssembly”蓝图使用自定义事件生成可以在细节面板访问的小工具控件子 Actor,使用户能与 PCG 规则交互,放置滑坡资产,而不是沿着样条放置常规的堤岸模块。

蓝图中公开的各种用于控制 PCG 图表的参数包括:启用悬崖、滑坡、倒下的树、植物缩放以及随机种子。


大型 Assembly 图表位于:

/Game/PCG/Graphs/LargeAssembly/LargeAssemblyGraph

一个自包含式蓝图 Actor,位于:

/Game/PCG/Assets/BP_PCG_LargeAssembly

《Electric Dreams》环境示例项目中已经包含大型 Assembly 的关卡:

/Game/Levels/PCG/ElectricDreams_PCG

/Game/Levels/PCG/ElectricDreams_PCGCloseRange

/Game/Levels/PCG/Breakdown_Levels/ElectricDreams_PCGLargeAssembly“BP_PCG_LargeAssembly”可以直接放在“ElectricDreams_Env”关卡中,在编辑中或在 PIE模式中使用,就像在 GDC 上演示的一样。大型 Assembly 会在关卡中自动生成并对齐到位。

逻辑


图表概览


图片


样条取样


图片

图片

图片


样条要以不同的距离增量进行两次取样,生成两组点。


低曲率部分的第一个样条取样器在样条上每隔 1000 个单位产生一个点,第二个样条取样器每隔 500 个单位产生一个点。两个取样器都以点 Attribute 的形式输出每个点位置的样条曲率。


第一个取样器输出的点保存在样条曲率较低的地方,第二个取样器输出的点保存在曲率较高的地方。


实例化堤岸 PCG 设置


图片

图片

图片


剩余的点用于在样条上放置堤岸 PCG 资产 Assembly。

较大的 Assembly 放在低曲率点上,较小的 Assembly 放在高曲率点上,使用“复制点CopyPoints)”函数。


筛选和生成堤岸网格体


图片

图片


使用点筛选器随机筛选含“clutter”元数据 Attribute 的点。

剩余的点使用两个静态网格体生成器生成最终的网格体(包含或不包含碰撞效果)。


上表面填充


图片

图片


使用样条取样器的“On Interior(针对内部)”尺寸 Property,创建出填充样条内部的点网格。


使用点密度 Property 存储点到样条的距离。(上图中的点以灰度值显示)


上表面点筛选


图片

图片


点随机旋转,并按 Attribute 筛选。随着点与样条之间的距离越来越接近,该距离将通过Attribute 数学运算,用于逐渐减小网格体的大小。

剩余的点用于放置地平面和由 PCG 资产生成的植物网格体,覆盖大型 Assembly 的上表面。

.

树的放置


图片

图片


候选点是从为上表面创建的点中选出来的。

使用与样条的距离排除过于靠近上表面边缘的点。

在大型悬崖位置插入一个较大的点,通过二进制差异运算排除会与它相交的点。


灌木的放置


图片

图片

图片

图片


使用“创建点网格Create Points Grid)”和“复制点Copy Points)”函数在大型Assembly 位置周围创建点网格。


点随机删除和旋转

点与上表面点相交,用于删除样条区域外的点。

为了防止灌木与大型悬崖重叠,使用两个近似悬崖形状的大型立方体,通过二进制差异运算删除与悬崖相交的点。

灌木是使用在每个剩余点上复制的 PCG 资产,通过“复制点Copy Points)”和“静态网格体生成器Static Mesh Spawner)”节点生成的。


附加信息


滑坡操纵器


图片

图片


滑坡操纵器是从大型 Assembly 蓝图的子项 Actor 注入 PCG 图表的点。在大型Assembly 的细节视图中点击“显示操纵器Show

Manipulators)”按钮就可以显示操纵器。


使用“差集(Difference)”节点删除由初始样条取样器生成的高曲率点集和低曲率点集中的点,在 Assembly 周围放置的常规堤岸资产中创建洞。


“交集(Intersection)”节点正好相反,它会用放置山体滑坡 Assembly 的点填充空隙。


倒下的树的逻辑


图片

图片


倒下的树的源点(红色)是通过对大型 Assembly 的样条进行采样获得的。


当源点接近目标点(通过对 Ditch 样条进行采样生成的点)时,将会显示倒下的树。(上图中的大型白点)


为了确定源点足够接近目标点,可以保留,它们的边界会向外延伸,朝每棵树倒下的方向。通过简单的交集测试,如果延伸的点与目标点(由 Ditch 样条产生)接触,它们就会被保留下来。


每棵树使用两组具有扩展边界的点来测试两个不同距离范围的相交情况。(截图中的绿色方块标识每个范围的相交结果)


剩余的点用于在两个不同的预设方向上生成倒下的树:如果距离较近的点与目标相交,则为水平方向:如果距离较远的点与目标点相交,则方向向下。


倒下的树藤蔓层级


图片

图片

倒下的树 PCG 设置资产有 5 根预先放置的悬挂藤蔓。


在倒下的树的源关卡:

a. 每根悬挂藤蔓都由根 Actor 和特定的 Actor 标签组成(悬挂藤蔓 1-悬挂藤蔓 5)

b. 悬挂藤蔓静态网格体 Actor 是相应根 Actor 的子项。

c. 悬挂藤蔓根 Actor 是倒下的树 Actor 的子项。

在 PCG 图表中:a. 倒下的树点使用“SG_CopyPointsWithHierarchy”子图进行实例化,将层级父子关系从倒下的树 PCG 设置资产传递给每个倒下的树实例。

b. 对每棵倒下的树来说,对应藤蔓根 Actor 的 PCG 点会被随机删除。

c. 最后的“应用层级(ApplyHierarchy)”节点用于将倒下的树的变换应用到它的子点上(藤蔓根点)

d. 将“忽略父项旋转(IgnoreParentRotation)”Attribute 设为 True,表示藤蔓根点必须平移,以确保在旋转后的倒下的树上,藤蔓根点的位置保持不变,维持原来的方向。

e.“应用层级(ApplyHierarchy)”节点的另一个用途是删除父点缺失的所有点。如果藤蔓根点在步骤 b 中被删除,它就会删除由藤蔓的静态网格体 Actor 产生的点(藤蔓根点是其父项)。


图片