资讯
展览资讯 大型展会 灯光节 大型盛典 赛事 中标捷报 产品快讯 热门话题 艺术节 活动 演出 新闻 数艺报道 俱乐部签约
观点
大咖专访 观点洞察 书籍推荐 吐槽 设计观点 企业访谈 问答 趋势创新 论文 职场方法 薪资报价 数艺专访
幕后
幕后故事 团队访谈 经验分享 解密 评测 数艺访谈
干货
设计方案 策划方案 素材资源 教程 文案资源 PPT下载 入门宝典 作品合集 产品手册 电子书 项目对接
  • 0
  • 0
  • 0

分享

《Electric Dreams》项目中的程序化内容生成概述

2023-06-29


Electric Dreams场景 是一个结合了传统流程和程序化流程的场景,它直接在虚幻引擎中搭建,并采用了程序化内容生成框架。本文将以"Electric Dreams"场景为舞台,探讨什么是PCG框架,并介绍示例中的一些重要概念,包括:
■ 工具
■ 自定义节点和子图表

要进一步了解虚幻引擎中的PCG框架,请参阅我们的程序化内容生成框架文档:https://docs.unrealengine.com/5.2/zh-CN/procedural-content-generation--framework-in-unreal-engine/

术语表
在Electric Dreams场景中,我们会使用一些专业术语指代PCG框架中的不同内容。本小节对这些术语进行了介绍。这有助于你熟悉后文。

PCG图表 是PCG的核心。该图表以图形化数据流的形式,描述了如何执行一系列操作。PCG图表可以作为子图表在其他图表中使用。

PCG元素 是PCG图表中使用的节点。该元素可以通过C++代码创建,也可以使用PCG Blueprint Element类在数据中创建。

PCG设置 是节点相关的设置(包括它的类和设置属性)。

空间数据 与空间有关,可以表示:
■ 三维(3D)格式的体积。
■ 二维(2D)格式的平面,如高度场和纹理。
■ 一维(1D)格式的线条,如样条线和点云。

点数据 表示3D空间中的点,包括其相关的边界、属性、特性。这是最常见的PCG数据类型。

属性 是一种预先定义的属性集,可以在PCG的点数据中找到。属性可用于特性相关的操作。属性必须以美元符号($)开头,例如 $Density 、 $Position.x 和 $Rotation.forward 。

属性包括:
■Transform :由位置(vec3)、旋转(旋转体)和缩放(vec3)组成。
■Density (float):一个范围在0到1之间的点密度函数。可用于多种操作,例如 differences、unions、noise,以及 filter。
■BoundsMin/Max (vec3):点包围框的下限和上限。
■Color (vec4):点的颜色值。
■Steepness (float):一个范围从0到1的值,代表该点的密度函数的斜率。斜率为1时,密度函数在点的边界内返回最大密度,在边界外返回0。斜率小于1时,密度函数返回以点边界下限/上限为中心,最大密度值线性插直至0的密度值。
■Seed (int64):通过点位置、节点种子和分量种子计算得来的点种子。

特性(Attribute) 是一种特定类型的、由用户自定义的额外metadata,可以覆盖节点参数,或与点绑定,供PCG图表中的特性操作使用。特性可以在图表中通过 Create Attribute 创建,也可以在自定义PCG元素中创建。

目前,特性支持的数据类型仅包括:
■ transform
■ vec2
■ vec3
■ vec4
■ float
■ double
■ int32
■ int64
■ bool
■ string
■ name
■ rotator
■ quaternion

Assembly 是一个由多个Actor及视效组件拼合而成的单一资产。在Electric Dreams场景中,Assembly使用了在关卡实例或Packed Level Actor中组合的Quixel资产,然后这些组件被手动放置在关卡四周。在Level to PCG资产工具的帮助下,Assembly可在PCG图表和PCGAssembly中作为源内容使用。

PCGAssembly 是一种通过PCG框架以程序化方式生成的Assembly。PCGAssembly可以借助PCG图表中的一组操作,以多种方式构建,并通过更改其输入(如组件或公开的参数)进行定制。这些操作包括生成单独的网格体和Actor,以及手动实现的完整Assembly。

工具
本小节将介绍Electric Dreams场景中的PCG制作工具。

Level to PCG Asset Utility

说明
Level to PCG Asset Utility 可将选定关卡内的所有静态网格体、层级实例化静态网格体(HISM)和实例化静态网格(ISM)导出到PCG设置资产。其数据将存储为PCG点数据。特别强调,这些数据是所有已导出视觉效果的点云,并以特性的形式存储了它们的变换、网格体和材质软对象路径、Actor标签和Actor场景层级信息。

得到的PCG设置资产可以作为实例化节点添加到PCG图表中。然后,所有程序化规则(PCG图表)都可以处理该PCG点数据,以对其执行增强和/或生成操作。

设置
蓝图资产工具随PCG插件一同发布,可在启用 显示插件内容(Show Plugin Content) 后使用。
Level to PCG资产工具的路径为:
/PCG/Utilities/PCGUtility_LevelToPCG 。
Electric Dreams中所有PCG设置及其源关卡的路径为:
/PCG/Assets/PCGAssemblies 。

使用方法
要使用Level to PCG资产工具,请遵循以下步骤:
1. 在 内容浏览器(Content Browser) 中选择一个关卡。
2. 点击右键,选择 Scripted Asset Action > Level To PCG Settings 。

注意:如果选择的关卡属于已分区的世界或OFPA,你首先需要在编辑器中打开它并加载其内容。对于非OFPA关卡,你无需在编辑器中打开它,可以直接通过内容浏览器完成操作。

3. 上述步骤会在选中的关卡文件旁边创建一个 PCG设置 资产,并以关卡名称加"_PCG"后缀的形式命名。如果已经存在具有此名称的PCG设置资产,将更新现有资产,而不是新建资产。
4. 从 内容浏览器 中,直接将 PCG设置 文件拖放入 PCG图表 ,作为 Instanced 节点。
5. 在 PCG 图表 中,将资产节点的 点(Points) 输出连接到 Copy Points 节点的源输入,并将点集指定为要向其复制源点的目标点集。
在Copy Points节点中,将"Attribute Inheritance"设置为"仅来源(Source Only)",以尽可能地加快处理速度。
6. 将 Copy Points 的输出连接到一个 Static Mesh Spawner 节点,将其 网格体选择器类型(Mesh Selector Type) 设置为"PCGMeshSelectorByAttribute", 特性名称(Attribute Name) 设置为"网格体(Mesh)"。

注意:如果在导出的视觉效果上使用了材质覆盖,可以将"材质(Material)"作为Index0的值,以激活By Attribute Material Overrides。

你还可以使用导出的 Actor Tag 特性,通过 PCG图表 中的 Point Filter 节点过滤点。标签过滤 的用例包括:
■NoCol :根据它们的碰撞需求过滤点,并相应地生成它们。
■Clutter :添加随机噪点和参数化密度,以增强Assembly。
■Helper :过滤在规则中具有特定用途但不应该生成的点。

Actor Tagger编辑器工具控件


说明
Actor Tagger Editor Utility Widget 将帮助你在关卡中的资产上编写Actor标签。该工具控件可以为要导出到PCG设置资产的关卡加快标记工作流程。

虽然虚幻引擎拥有一个合格的工作流程可用于添加、编辑、删除资产上的Actor标签,但是它目前并不适合大规模编辑。这方面的一个例子是,当你要为几个选中的Actor应用不同的Actor标签时,这会导致Actor标签在 细节(Details) 面板中出现混淆。

创建Actor Tagger编辑器工具控件的目的之一,就是缓解当前编辑器Actor标签表现出来的这种问题,同时它还提供了一个本地化的操作控制板,使用户能够在3D视口中专注于标签的编写。

设置
Actor Tagger编辑器工具控件的内容文件路径为:/Game/PCG/Utilities/ActorTagger/EUW_ActorTagger

使用方法
要运行Actor Tagger,请执行以下步骤:
1. 在 内容浏览器 中选择一个 Actor Tagger 。
2. 右键点击该 Actor Tagger 并选择 Run Editor Utility Widget 。

函数
Select Tag
选择已加载关卡内所有在 Select Tag 字段中输入了标签的 Actor。其结果将替换当前在大纲视图中选择的项目。

Remove Tag
搜索当前选中的所有Actor,寻找在 Remove Tag 字段中输入的标签。如果某个Actor上存在该标签,该标签将被移除。

Add Tag
将在 Add Tag 字段中输入的标签添加到所有当前选中的Actor上。如果选中的Actor已具有该标签,则不会二次添加。

Hide
隐藏当前选中的所有Actor。如果当前没有选择Actor,之前隐藏的所有Actor都将变得可见。

Unlit / Lit
切换视口光照模式的状态(光照和无光照)。

工具部分
Output Level Tags
将存在于已加载关卡中的所有唯一标签打印到输出日志中。这样可以快速全面地了解已加载关卡中的所有Actor标签。


Make Tags Unique
该函数会在当前加载的关卡中遍历所有Actor,将各Actor的所有重复标签减少至单个标签条目。

Reference Level
该函数用于加载或卸载一个指定的参考关卡。这或许可以将光照和参考对象包含进来,以帮助构造将作为PCG设置资产导出的关卡。


运行编辑器工具控件时,会分配一个默认的参考关卡。默认参考关卡可以在这里找到:/Game/PCG/Utilities/ActorTagger/ActorTagger_ReferenceLevel 。

更改在控件构造脚本中指定的关卡,可以自定义该默认参考关卡。


Set Reference Level
该函数允许你指定自己的参考关卡,用于加载和卸载。要指定自己的参考关卡,请在 内容浏览器 中选择一个非世界分区关卡,然后点击此按钮。控件不会保存指定的参考关卡,每次运行控件时都需要重新指定。

自定义节点和子图表
本小节介绍了在Electric Dreams场景PCG图表中,为特定用途而创建的PCG自定义节点和子图表。

Copy Points With Hierarchy和Apply Hierarchy


说明
SG_CopyPointsWithHierarchy 和 ApplyHierarchy 节点需要与通过Level to PCG资产工具创建的PCG设置资产结合使用。

你可以使用这些节点操纵点的层级,类似于在关卡中操纵Actor的层级。点可以继承父点的变换。例如,使用这个功能,代表树干的点在随机旋转和缩放时,如果代表树分支的子点也在变换,首先会沿用其父点的变换,同时,还会基于父点的变换,增加自身的变换(旋转或缩放)。

你可以使用Point Filter运算符移除点,它们的子点将被自动移除。这有助于为复杂的点设置添加随机变化。

设置
SG_CopyPointsWithHierarchy和ApplyHierarchy节点位于Electric Dreams场景示例项目的 节点控制板 中。你也可以通过图表区域的 PCG编辑器 上下文菜单访问它们。

SG_CopyPointsWithHierarchy 子图表的内容文件路径为:/Game/PCG/Assets/PCGCustomNodes/SG_CopyPointsWithHierarchy 。

ApplyHierarchy自定义节点的内容文件路径为:/Game/PCG/Assets/PCGCustomNodes/ApplyHierarchy 。

以下PCG图表使用了这些节点:
■ /Game/PCG/Graphs/Ditch/PCGDemo_DitchBP
■ /Game/PCG/Graphs/Ground/PCGDemo_GroundBP
■ /Game/PCG/Assets/BP_PCG_LargeAssembly
■ /Game/Levels/PCG/Breakdown_Levels/ElectricDreams_PCGSplineExample

使用方法

PCG图表中层级节点的常见用法。

PCG图表中层级节点的常见用法一般如下:
1. 由 Level to PCG资产工具 将关卡转换为包含PCG点的PCG设置资产,其相关联的场景层级信息将存储为metadata特性。
2.SG_CopyPointsWithHierarchy 子图表使用目标点变换在多个位置复制PCG设置资产,这与 Copy Points 节点的作用类似,但它还通过维护和偏移层级特性值,使父级信息对于原始资产点的每个副本来说都是唯一的。
3.Point Filter 节点,根据特性选择点。
4.Transform Points 节点与 ApplyToAttributes 选项,对被选中点的相对变换特性执行变换操作。
5.Merge 节点,重新组合同一数据流中同一层级的所有点。
6.ApplyHierarchy 节点,将相对变换特性与父级变换相结合,应用到点上。

PCG设置节点生成的层级特性

FallenTree 的PCG设置资产的层级图。

将关卡Actor导出到PCG设置资产时,源关卡中的Actor层级信息会使用 元数据特性 与每个PCG点保持关联。这些元数据特性是:


虚拟点表示具有以下元数据特性的层级根点:
■ActorIndex:0
■ParentActorIndex:-1
■HierarchyDepth:0
■RelativeTransform:单位变换

所有在源关卡层级中未指定父级的点都会以这个根点为父点,以避免处理孤立点或根点的特殊情况。

由SG_CopyPointsWithHierarchy变换的层级特性

为每个PCG资产副本生成的Actor和父Actor索引,这些PCG资产由SG_CopyPointsWithHierarchy生成。注意有6个不同的根点ActorIndex值。

SG_CopyPointsWithHierarchy子图表。

这个自定义的Copy Points节点以子图表的形式实现,其中包含:
■ 一个普通的Copy Points节点。
■ 一个PostCopyPoints-OffsetIndices蓝图节点,负责为每个副本指定一组唯一的ID,这些ID根据原始索引、副本编号和唯一的任务ID计算得出。
■ 两个Create Attributes节点,用于将IgnoreParentRotation和IgnoreParentScale两个布尔值特性初始化为"false"。

层级中的点操作

一旦将点复制到SG_CopyPointsWithHierarchy目标点所指定的位置,就可以使用 Point Filter,按照PCG设置资产中的特性,对点进行过滤:

PCGDemo_Ditch中的点过滤,使用了Clutter特性来随机移除层级中的点。

PCGDemo_Ditch中的点过滤,使用RotZ特性来随机旋转层级中的点。

在上面两张图中,按标签选中的点经过过滤或旋转,重新与未被 Point Filter 选中的点合并。这个 Merge 操作很重要,因为这可确保所有点(无论是否经过变换)都保留在相同的数据流中,而且稍后在应用最终点变换时,可以一并处理。


当在层级中使用Transform Points节点时,必须注意不能将变换直接应用至点的Transform特性,而是要应用至RelativeTransform特性。
为此,请将 Apply To Attribute 选项中的 Attribute Name 指定为"RelativeTransform"。如果你想部分继承父点的变换,可以选择将 IgnoreParentRotation 和/或 IgnoreParentScale 特性设置为"true"。


最终,ApplyHierarchy 节点会在 Static Mesh Spawner 节点生成网格体之前被立即使用。ApplyHierarchy节点的作用是:

■ 以升序方式遍历所有现有的层次级别(根据层级深度点特性解析)。
■ 根据它的父变换和它的RelativeTransform特性值计算出最终的点变换。
■ 移除其父点已被丢弃的点。

Flat Area Detector


说明
Flat Area Detector 子图表用于确定表面是否足够平坦,以放置给定大小的点,并避免资产错位的情况(如资产部分悬浮在地面上)。Flat Area Detector 通过在每个源点周围的4个不同位置对表面进行取样,从而实现对水平表面或倾斜表面的处理。在4个采样位置中,如有任何一个不与由输入点位置和方向定义的平面相交,输入点将被丢弃。在上面的图片中,这些平面显示为蓝色矩形。此外,在4个采样位置中,如有任何一个的表面方向偏离输入点的方向,输入点也将被丢弃。

该子图表在以下图表中使用:
■PCGDemo_Ground
■ 在该图表中,Flat Area Detector 用于在粗糙的岩石网格体表面上放置三叶草地块。
■ 该图表的内容文件路径为:/Game/PCG/Graphs/Ground/PCGDemo_Ground 。

■PCGDemo_Forest
■ 在该图表中,Flat Area Detector 用于在地形上放置庞大、平坦的石质地块和地标岩石Assembly。
■ 该图表的内容文件路径为:/Game/PCG/Graphs/Forest/PCGDemo_Forest 。

部分石块漂浮在地面上

漂浮的石块被移除

设置
Flat Area Detector 子图表的内容文件路径为:/Game/PCG/Graphs/Forest/DiscardPointsInBumpyAreas 。

使用方法
要将Flat Area Detector 作为PCG图表中的节点使用,请在 内容浏览器 中将此图表拖放至 PCG图表 编辑器:


节点引脚说明
DiscardPointsInBumpyAreas 节点的引脚和说明如下所示:


子图表介绍
本小节介绍了Flat Area Detector 子图表的工作方式。


创建取样点


Attribute Math和Transform Points节点按照下方描述创建四个取样点:
■ 取样点放置在各个输入点周围的2D方框中。
■ 该方框的尺寸由取样距离特性决定。
■ 各个取样点的边界由高度阈值特性决定。

构建平面

扁平化的点在上方图片中用蓝色线框表示,它们使用Attribute Math操作,基于Sample Distance特性构建的。

将取样点投影到平面

四个取样点会在考虑到位置和方向的情况下,投影到表面。这些投影点与蓝色线框之间的差值随后会计算出来。这个差值节点会输出平面外的点。

注意:启用这三个节点的调试状态后,将显示蓝色线框、绿色的四个采样点以及与蓝色平面(即蓝色线框)不相交的采样点,如上图所示,用红色表示。

估算取样点朝向的差异


接下来,将估算取样点方向的差异。一个点从输入点中创建出来,它将按照法线阈值沿其上行向量进行负向平移。在下方的图片中,这显示为一个实心的蓝色平面。该点与扁平化的取样点之间的相交会被计算出来,与表面法线向量对齐。在下方的图片中,这显示为蓝色线框。

图一

法线阈值 = -300

图二

法线阈值 = -10

图一表示法线阈值为-300时的效果,沿其上行向量向下推动蓝色实心平面。

图二表示法线阈值为-10时的效果。使用这个值后,相交位置现在会显示一个红色坐标轴。它表示了如何基于取样点方向的差异,使用法线阈值控制相交的输出。

注意:平行的取样点/平面只与法线阈值为0的蓝色实心点相交。

最终点过滤


最后,从这两个测试中得到的点将展开,用来提供与输入点的差异,从而对它们进行过滤。这样,留下的点都将符合DiscardPointsInBumpyAreas节点输入引脚中提供的参数。

Look At


说明
LookAt 节点可根据作为vector3特性提供的目标,重新指定点的方向。该特性可通过特性的数学运算和距离节点创建。

在Electric Dreams场景中,该节点用于:
■ 在地面规则中,对照大型Assembly样条线重新调整点的方向,以实现理想的河床视觉效果。
■ 在雾卡和森林图表中,朝区域中心旋转雾卡的点。

设置
LookAt自定义节点的内容文件路径为:/Game/PCG/Assets/PCGCustomNodes/LookAt 。

使用方法
LookAt节点会遍历单个点的数据输入,并期望接收一个vector3特性,作为每个点要看向的目标坐标。


要使用LookAt节点,请执行以下步骤:
1. 创建点数据。
2. 使用设置为 From Source Param 的 AddAttribute ,向点数据添加新的 LookAt 特性。
3. 使用以下任意选项覆盖 特性 :
■ 向量类型的 Create Attribute 节点以及你看向的坐标。
■ 由一个可被公开以进行自定义的蓝图vector3变量提供的 Get Actor Property 。
■ 在 Graph Settings 中创建一个PCG vector3图表参数,并在图表中获取参数名称,该参数名称将在每个图表实例中公开,供每个PCG组件编辑。
4. 设置 LookAt 节点的设置:
■ 将 LookAt Target 设置为要使用的特性名称。
■2D LookAt 设置将忽略Z分量。
■Forward X 会在 LookAt 中使用X轴而非Y轴。




阅读原文

* 文章为作者独立观点,不代表数艺网立场转载须知

本文内容由数艺网收录采集自微信公众号虚幻引擎 ,并经数艺网进行了排版优化。转载此文章请在文章开头和结尾标注“作者”、“来源:数艺网” 并附上本页链接: 如您不希望被数艺网所收录,感觉到侵犯到了您的权益,请及时告知数艺网,我们表示诚挚的歉意,并及时处理或删除。

数字媒体艺术 新媒体艺术 科技艺术

15854 举报
  0
登录| 注册 后参与评论