WangShuXian6 / blog

FE-BLOG
https://wangshuxian6.github.io/blog/
MIT License
46 stars 10 forks source link

Unreal Engine 5 程序化内容生成框架(PCG) #178

Open WangShuXian6 opened 11 months ago

WangShuXian6 commented 11 months ago

Unreal Engine 5 程序化内容生成框架(PCG)Procedural Content Generation

https://docs.unrealengine.com/5.3/zh-CN/procedural-content-generation-overview/

程序化内容生成框架(PCG)是一个用于在虚幻引擎中创建你自己的程序化内容及工具的工具集。借助PCG,技术美术师、设计师和程序员能够构建任意复杂度的快速迭代式工具和内容,从资产工具(如建筑物或群系生成等)到整个世界,不一而足。

image

WangShuXian6 commented 11 months ago

PCG 用法简介

重要概念和术语

点(Points) :3D空间中的坐标点,由PCG图表生成,常用于生成网格体。点包含变换、边界、颜色、密度、陡度和种子等信息。可以为它们分配由用户自定义的属性值。

点密度(Point Density) :许多图表节点都会用到的一种数值。在调试视图中,会以每个点的颜色梯度来表示密度。例如密度0为黑色,密度1为白色。

必需设置

程序化内容生成框架需要在你的项目中启用 程序化内容生成框架(Procedural Content Generation Framework) 插件

需要 程序化内容生成框架几何体脚本交互(Procedural Content Generation Framework Geometry Script Interop) 插件,才能在静态网格体上对点取样。

程序化节点图表

程序化节点图表是程序化内容生成框架的核心部分。

PCG图表编辑器 image

类似材质编辑器,关卡中PCG组件的空间数据会传入图表,然后用于生成点。然后,点会经过一系列节点的筛选和修改,并输出实时更新的结果。生成的点可用于生成各种资产。

创建PCG图表资产

要创建PCG图表资产,请执行下面的步骤:

右键点击 内容侧滑菜单(Content Drawer) 或 内容浏览器(Content Browser) ,找到 创建高级资产(Create Advanced Asset)> PCG ,并选择 PCG图表(PCG Graph) 。

选择新资产的名称,然后按 Enter 键。

编辑PCG图表

在PCG图表编辑器中,你可以配置并编辑PCG图表资产。该编辑器的操作方式与蓝图或材质编辑器相似。它还包含一些只有PCG才有的工具和面板。

PCG图表图 image

数字 说明
1 节点控制板
2 调试下拉菜单
3 视口
4 细节面板
5 属性列表

你可以像使用蓝图那样将节点添加到图表中,方法是从节点控制板将其拖入视口中,或通过右键菜单添加。

当PCG图表连接到PCG组件并且已用于生成内容时,对该图表所做的更改会在编辑器视口中实时更新。

PCG节点

PCG图表由一系列PCG节点构成,每个节点执行对最终结果有贡献的操作。

PCG节点控制板

这些节点划分为以下类别:

类别 说明
蓝图(Blueprint) 包含与蓝图相关的节点。这包括用于执行从 PCGBlueprintElement 派生的用户蓝图的通用节点。
颜色(Color) 包含影响点上的颜色的节点。
调试(Debug) 包含帮助调试的节点。
密度(Density) 包含影响点密度的节点。
筛选器(Filter) 包含基于条件或按点筛选数据的节点。
IO 包含能控制与外部数据交互的节点。
元数据(Metadata) 包含与属性交互的节点,无论是点上还是属性集上的属性。
参数(Params) 包含能控制如何从Actor或蓝图变量检索参数的节点。
取样器(Sampler) 包含从空间数据源(例如体积、表面和网格体)生成点的节点。
空间(Spatial) 包含能在数据之间创建空间关系、更改其内部空间数据或检索数据的节点。
生成器(Spawner) 包含在给定点位置创建新数据或放置Actor的节点。
子图表(Subgraph) 包含能处理子图表用法的节点。
变换(Transforms) 包含能修改点上的变换信息的节点。

你可以像使用蓝图那样添加 注释(Comments) 和 重新路由节点(Reroute Nodes) ,使图表更易于辨识。

PCG组件

PCG组件 程序化节点图表可以通过PCG组件对你的关卡取样。此组件可保存程序化节点图表的实例,并在编辑器中以及在运行时管理程序化内容的生成。 PCG组件添加为Actor的组件,或用作PCG体积的一部分,这是一种基本体积,适合用于快速设置程序化内容。

PCG组件 image

要将PCG图表连接到PCG组件,请执行下面的步骤:

1 在编辑器视口或 大纲视图(Outliner) 中,选择你想连接的 PCG体积(PCG Volume) 或 蓝图类(Blueprint Class) 。

2 在 细节(Details) 面板中,点击 PCG组件(PCG Component) 。

PCG组件 image

3 点击 图表(Graph) 下拉菜单,并选择你想使用的PCG节点图表。

添加PCG图表 image

4 点击 生成(Generate) 按钮查看你的结果。

点击"生成"按钮 image

在PCG中调试

调试是PCG工作流程中的基本部分。

每个节点都有各种调试选项,可用于直观地显示PCG图表每个步骤中的点数据:

调试渲染 启用/禁用节点 检查

在节点的 细节(Details) 面板中选中 调试(Debug) 的复选框或按 D 键,可切换每个节点的调试渲染。

image

在节点的 细节(Details) 面板中选中 启用(Enabled) 的复选框或按 E 键,可打开和关闭每个节点。

image

你还可以检查节点,以此在 属性(Attributes) 列表中显示节点生成的所有点。

image

从调试下拉菜单选择你的PCG组件。然后,右键点击你想在视口中检查的节点,并选择 检查(Inspect) 。你也可以按 A 键。

创建简单森林体积

程序化生成工具的常见用例是开放世界环境中的群系生成。

image

要创建基本森林群系生成器,请执行下面的步骤。

此示例使用的材质和静态网格体来自使用商城下载的Megascans树木资产包:欧洲鹅耳枥集合

创建关卡

在虚幻引擎中创建新项目

使用 基本(Basic) 关卡模板创建新关卡。保存关卡。

删除 地板(Floor) 静态网格体并使用地形模式向关卡添加新地形

使用塑造工具,向你的地形添加一些变化。

image

创建PCG体积

1 返回 选择(Selection) 模式并启用 放置Actor(Place Actors) 窗口(如果它目前不可见)。

2 使用 搜索类(Search Classes) 框查找 PCG体积(PCG Volume) 并添加一个到你的关卡。

image

3 将PCG体积缩放为X=8.0, Y=8.0, Z=8.0

image

创建PCG图表资产

1 右键点击 内容侧滑菜单(Content Drawer) 或 内容浏览器(Content Browser) ,找到 创建高级资产(Create Advanced Asset)> PCG ,并选择 PCG图表(PCG Graph) 。

2 将新资产命名为 PCG_ForestGen 并按 Enter 键。

3 双击 PCG_ForestGen 打开PCG图表编辑器。

连接PCG组件

1 在编辑器视口或 大纲视图(Outliner) 中,选择 PCG体积(PCG Volume) 。

2 在 细节(Details) 面板中,点击 PCG组件(PCG Component) 。

3 点击 图表(Graph) 下拉菜单并从列表选择 PCG_ForestGen 。

image

创建点

1 在PCG图表编辑器窗口中,将 Surface Sampler 节点添加到图表。

2 点击 Input 节点上的向下箭头将其展开,然后将 地形(Landscape) 输出连接到Surface Sampler上的 表面(Surface) 输入。 【注意:ue5.3已废弃地形(Landscape) 输出,请使用 空间-获取地形数据 代替 地形(Landscape) 输出 】 image

3 选择Surface Sampler并按 D 键切换调试渲染。

4 返回编辑器窗口,选择PCG体积,然后点击细节面板中的 生成(Generate) 按钮。

image

现在你可以在编辑器视口中看到正在生成的点。这些点符合地形的形状。

添加变化

1 在PCG图表编辑器中,选择Surface Sampler。

2 在细节面板中调整 每平方米点数(Points Per Square Meter) 、 点范围(Points Extents) 和 松散度(Looseness) 属性,添加更多点。

a 将 每平方米点数(Points Per Square Meter) 调整为 0.15 ,将更多点添加到空间。

b 点范围(Points Extents) 属性将控制每个点的边界大小。将 X 、 Y 和 Z 值更改为 0.5 。

c 松散度属性将确定生成的点贴近网格形状的程度。将 松散度(Looseness) 值保留为 1.0 。

image

3 接下来,添加 Transform Points 节点。此节点将向你的点添加定义范围内的额外移动、旋转和缩放变化。将Surface Sampler节点的 输出(Output) 引脚连接到Transform Points节点的 输入(Input) 引脚。

image 4 在Surface Sampler节点上禁用调试渲染,并在Transform Points节点上启用它。

5 要添加一些旋转变化,请将 最大旋转(Max Rotation) 的 Z 值更改为 360 。这样所有点都会获得0到360度之间的随机旋转。

image

6 PCG图表会生成点并将其旋转以符合地形的法线方向。选中 绝对旋转(Absolute Rotation) 的复选框可禁用此额外旋转。

7 要添加一些大小变换,请将 X 、 Y 和 Z 缩放最小值(Scale Min) 设置为 0.5 。将 X 、 Y 和 Z 缩放最大值(Scale Max) 更改为 1.2 。

image 最终结果是有不少变化的一组点。

image

生成静态网格体

1 在PCG图表编辑器中,将 Static Mesh Spawner 节点添加到图表视口。将Transform Points节点的 输出(Output) 引脚连接到Static Mesh Spawner的 输入(Input) 引脚。

image

2 选择Static Mesh Spawner。

3 在 细节(Details) 面板中,找到 网格体条目(Mesh Entries) 选项并点击 + 按钮以添加要生成的静态网格体。

4 点击 网格体条目(Mesh Entries) 旁边的下拉箭头,打开数组。

5 点击 Index [0] 旁边的下拉箭头。

6 点击 描述符 旁边的下拉箭头。

7 点击 静态网格体(Static Mesh) 的下拉菜单并选择你想生成的树。此示例使用 SM_EuropeanHornbeam_Forest_01 。

image

你可以将权重属性用于数组中的每个网格体条目,添加更多静态网格体并平衡多样性。虚幻引擎添加了所有静态网格体条目的权重值,并将该数字除以每个单独的权重以确定每个条目生成的概率。

image

WangShuXian6 commented 11 months ago

PCG开发指南

使用程序化内容生成(PCG)框架的参考和最佳实践指南。 https://docs.unrealengine.com/5.3/zh-CN/pcg-development-guides/

程序化内容生成框架数据类型参考

程序化内容生成框架使用的PCG数据类型参考

程序化内容生成框架(PCG)框架 中的数据分为以下几种类型:

空间数据

综合数据

属性集

空间数据

空间数据包含对二维(2D)或三维(3D)空间的引用,可以表示体积、高度场、样条线和点数据。

体积

体积是一种表示三维形状的空间数据,通常用于布尔集合操作,或使用@@体积采样器(Volume Sampler)节点直接从水平面采样。

曲面

曲面是一种表示二维数据的空间数据,如映射到 XY 平面上的地形,或在二维平面上生成点并将其投影到三维形状上的曲面采样器(Surface Sampler)节点。

线

线条是一种空间数据,表示样条线和地形样条线组件。该数据可读取带切线和点标度的样条曲线关键点。地形样条线垂直投影。即使样条线偏离地形,也始终适用于曲面。PCG图形中使用获取样条线数据(Get Spline Data)和样条线采样器(Spline Sampler)节点引用该数据类型。

点云(Point Cloud)是一种空间数据,它是三维空间中代表曲面或体积的点的集合,并带有相关边界。边界允许点代表不同维度的形状。

例如,可以对三维球体进行点采样,点的大小决定了点与球形的吻合程度

此外,每个点都有一个密度值,限制在0到1之间。这些点和它们的密度值共同表达了空间中的浮点函数。PCG图形节点通常会在空间中创建和处理采样密度值,然后再进行采样。

点可包含以下信息

数据 说明
变换 平移、旋转和缩放信息。
边界最小值和边界最大值 点所代表的体积的最小和最大范围。
颜色 每个点的四个通道颜色值。
密度 浮点度量的一个点相对于给定采样中其他点的落差。用于确定采样密度。
斜度 点度量的体积的柔和度。每个点都有三维边界,代表一个空间区域。每个点的斜度值可以控制其影响的形状。
种子 在随机数生成器的各种操作过程中使用。这可以通过操作来控制随机性的表达方式,并根据位置进行计算,以便与世界位置保持一致。

综合数据

综合数据数据是集合操作的结果,如联合、相交和集合差。

在将结果转换回显式数据并应用结果之前,你可以将集合操作串联为多个操作。

属性集

属性集是用户定义的变量,作为元数据存储在PCG图形中。这些变量可以使用各种属性操作节点进行操作,并被节点使用。

一个常见的例子是通过扩展节点上的高级引脚并将属性连接到公开引脚来驱动节点设置。

image 变换点节点上的可用属性输入。

属性可在PCG节点图界面的属性列表窗口中查看。有关使用PCG框架的更多信息,请参阅程序化内容生成概述

程序化内容生成框架节点参考

用于程序化内容生成框架的PCG图表节点的参考

借助程序化节点图表,程序化内容生成(PCG)框架可以在编辑器和运行时状态下生成程序化内容。和材质编辑器类似,空间数据被传入关卡中的PCG组件中的图表,然后生成点。这些点会经过一系列的节点的筛选和调整,这些节点如下所列:

蓝图

节点 说明
Execute Blueprint 执行指定的自定义蓝图类。

颜色

节点 说明
Set Point Color 将固定颜色值设置到点云中的所有点。这是 Execute Blueprint 节点的正常运作示例。

控制流程

节点 说明
Branch 基于布尔属性选择两个输出之一。
Select 基于布尔属性选择两个输入之一,以转发到单个输出。

调试

节点 说明
Debug 调试图表中的上一个节点,但不是临时的。
Sanity Check Point Data 验证输入数据点的值是否在给定范围内;超出该范围,此节点将记录错误并取消生成。

密度

节点 说明
Curve Remap Density 根据提供的曲线,将点数据中的每个点的密度重新映射到其他密度值。最终密度 = 曲线重新映射(输入密度)
Density Remap 将线性变换应用于点密度。这可以选择设置为不影响输入范围之外的值。D' = (Out_Max - Out_Min) * (D - In_min) / (In_max - In_min) + Out_Min
Distance to Density 根据每个点与参考点的距离设置点密度。
Distance to Neighbors 计算一个点与其给定范围内相邻点的平均值之间的距离。可以用于派生相对于相邻点的位置。

筛选器

节点 说明
Density Filter 基于密度和提供的筛选范围筛选点。
Discard Points on Irregular Surface 围绕给定源点测试多个点,确定它们是否在相同平面上。这是使用PCG子图表的示例,在电子梦演示中使用。
Filter - Any 仅让符合指定目标类型的输入数据通过。通用筛选器节点。
Filter By Tag 根据 标签(Tags) 保留或删除数据中的元素。你可以指定要筛选的标签的逗号分隔列表。
Intersect with Tagged Actor Geo 使用几何体脚本函数测试点是否在标记的Actor的静态网格体中。需要 程序化生成框架(PCG)几何体脚本交互操作(Procedural Generation Framework (PCG) Geometry Script Interop) 插件。
Point Filter 将按点筛选器应用于输入点数据。筛选器可以是常量空间数据(你可以像对相同点取样或从ToPoint版本取样那样筛选这些数据),也可以是属性集。
Point Filter Range 将基于范围的筛选器应用于点数据。
Self Pruning 删除相同点数据中的点之间的相交,基于设置对数据划分优先级(从大到小,等等)。半径相似的点可以使用随机化修剪进行随机选择,防止出现规律。

层级化生成

节点 说明
Grid Size 指定要执行下游节点的网格大小。 用于层级化生成。

输入输出

节点 说明
Load Data Table 将UDataTable加载到PCG点数据中。
加载Alembic文件(Load Alembic File) 加载Alembic文件到PCG点数据。需要 程序化内容生成(PCG)外部数据交互操作(Procedural Content Generation (PCG) External Data Interop) 插件

元数据

节点 说明
Add Attribute 将属性添加到点数据或属性集。
Append Attribute Set 将多个属性集合并为单个属性集。
Attribute Noise 为一组点数据中的每个点计算目标属性的新值。值将取决于所选输入属性 模式(Mode) 、 噪点最小值(Noise Min) 和 噪点最大值(Noise Max) 。
Attribute Partition 基于给定属性的值拆分输入点数据,给定值的所有点将在相同点数据中输出,所有这些将存在于输出数据集合中。
Attribute Reduce 计算给定属性的 平均值(Average) 、 最大值(Max) 或 最小值(Min) 。请注意,属性必须是数字且连续,才能计算平均值。
Attribute Rename 重命名现有属性。
Attribute Select 计算所选 轴(Axis) 上的 最小值(Min) 、 最大值(Max) 或 中值(Median) 。请注意,这类似于使用轴计算点积。
Attribute String Op 执行与字符串相关的属性操作,例如附加字符串。
Break Transform Attribute 将变换属性分解为其组成部分:平移(Translation) 、 旋转(Rotation) 和 缩放(Scale) 。
Break Vector Attribute 将向量属性分解为其组成部分:X 、 Y 、 Z 和 W 。
Copy Attribute 从 属性(Attribute) 引脚或从输入本身将属性复制到新的点数据。
Create Attribute 创建包含单个属性的属性集。
Data Table Row to Attribute Set 从数据表提取单行到属性集。
Filter Attribute 从属性集或空间数据筛选(保留或删除)逗号分隔的属性。
Get Attribute from Point Index 从点数据及其在单独属性集内的属性检索单个点。
Make Transform Attribute 根据三个提供的属性创建变换属性:平移(Translation) 、 旋转(Rotation) 和 缩放(Scale) 。
Make Vector Attribute 基于 输出类型(Output Type) ,根据2-4个属性创建向量属性。
Point Match and Set 使用 匹配和设置类型(Match And Set Type) 选项,基于选择标准查找每个点的匹配项,然后将值应用于属性。一种常见用例是在带有 By Attribute 选择器的 Static Mesh Spawner 节点中选择要在下游使用的网格体。
Transfer Attribute 根据相同数据集大小、相同类型(空间到空间或点到点)的对象设置属性

属性按位运算

节点 说明
And 计算两个属性之间按位AND运算的结果。
Not 计算两个属性之间按位NOT运算的结果。
Or 计算两个属性之间按位OR运算的结果。
Xor 计算两个属性之间按位XOR(异或)运算的结果

属性布尔运算

节点 说明
And 计算两个属性之间布尔AND运算的结果。
Not 计算两个属性之间布尔NOT运算的结果。
Or 计算两个属性之间布尔OR运算的结果。
Xor 计算两个属性之间布尔XOR(异或)运算的结果

属性比较运算

节点 说明
Equal 将两个属性之间的"等于"比较结果写入布尔属性。
Greater 将两个属性之间的"大于"比较结果写入布尔属性。
Greater or Equal 将两个属性之间的"大于或等于"比较结果写入布尔属性。
Less 将两个属性之间的"小于"比较结果写入布尔属性。
Less or Equal 将两个属性之间的"小于或等于"比较结果写入布尔属性。
Not Equal 将两个属性之间的"不等于"比较结果写入布尔属性。

属性数学运算

节点 说明
Abs 计算"绝对值"数学运算的值。将输入属性值转换为正值,并将结果写入属性。
Add 计算"加法"数学运算的值。取两个输入值,加起来,并将结果写入属性。
Ceil 计算"向上取整"数学运算的值。取一个输入值,向上舍入到下一个整数。
Clamp 计算"限制"数学运算的值。取输入值,将其约束到特定范围。
Clamp Max 提供"限制"数学运算的最大值。
Clamp Min 提供"限制"数学运算的最小值。
Divide 计算"除法"数学运算的值。取两个输入,将第一个输入除以第二个输入,并将结果写入属性。
Floor 计算"向下取整"数学运算的值。取一个输入值,向下舍入到最接近的整数,并将结果写入属性。
Frac 计算小数数学运算的值。取一个输入值,返回该值的小数部分。例如,对于输入值X,结果是X减去X的向下取整值。输出值的范围从0到1,含0,不含1。
Lerp 计算"线性插值"数学运算的值。此表达式将在两个点之间画一条线,使用第三个"比率"值确定该线上某个点的值。 接着将此值写入属性。
Max 计算对属性的"最大值"数学运算的值,并将结果写入属性。此运算取两个输入值,并输出两者中较大者。
Min 计算对属性的"最小值"数学运算的值,并将结果写入属性。 此运算取两个输入值,并输出两者中较小者。
Modulo 计算"取模"数学运算的值。取两个输入值,将第一个值除以第二个值。接着返回余数,并将其作为属性写入。
Multiply 计算"乘法"数学运算的值。取两个输入值,相乘,并将结果写入属性。
One Minus 计算对属性的"一减"数学运算的值,并将结果写入属性。此表达式将取一个输入值X,输出1-X,并将结果作为属性写入。
Pow 计算"幂"数学运算的值。此表达式将取两个值:底数和指数。它计算底数值的指数次幂,并将结果作为属性输出。
Round 计算"四舍五入"数学运算的值,并将结果写入属性。此表达式将取一个输入值,并将其舍入到最接近的整数。
Set 将输出属性设置为提供的属性的值。
Sign 计算"符号"数学运算的值,并将结果写入属性。对一个输入值求值,指示它是正数、负数还是刚好为零。如果输入为负数,此节点输出-1。如果输入刚好为0,此节点输出0。如果输入为正数,此节点输出1。
Sqrt 计算对输入的"平方根"数学运算的值,并将结果写入属性。
Subtract 计算"减法"数学运算的值。此表达式将取两个输入,从第一个输入减去第二个输入。
Truncate 计算"截断"数学运算的值,并将结果写入属性。此表达式将截断一个值,即舍弃小数部分,留下整数。例如,值1.4截断为1。

属性旋转体运算

节点 说明
Combine 合并两个旋转值,将结果作为属性写入,先合并A,然后合并B。
Inverse Transform Rotation 按提供的变换的逆变换来变换旋转体。
Invert 找到提供的旋转体的逆对象,将结果作为属性写入。
Lerp 基于 比率(Ratio) ,在两个旋转体输入 A 和 B 之间线性内插。这会在比率为0时应用100%的A,在比率为1时应用100%的B。
Normalize 将角度限制为-180到180的范围,将结果作为属性写入。
Transform Rotation 按给定变换来变换旋转。此节点将取一个旋转作为输入,应用给定的变换。

属性变换运算

节点 说明
Compose 按顺序合成两个变换:A B。合成变换时,顺序很重要。A B会生成一个变换,首先应用A,然后将B应用到后续变换。结果写入属性。
Invert 将输入变换反转,将新变换作为属性写入。
Lerp 基于 比率(Ratio) ,在两个变换输入 A 和 B 之间线性内插。这会在比率为0时应用100%的A,在比率为1时应用100%的B。

属性三角运算

节点 说明
Acos 返回输入的反余弦(arccos),将结果写入属性。
Asin 返回输入的反正弦(arcsin),将结果写入属性。
Atan 返回输入的反正切(arctan),将结果写入属性。
Atan 2 返回2个输入(B/A)的反正切(arctan2),将结果写入属性。
Cos 返回输入的余弦(cos),将结果写入属性。
Deg to Rad 基于以度数为单位的输入返回弧度值,将结果写入属性。
Rad to Deg 基于以弧度为单位的输入返回度数值,将结果写入属性。
Sin 返回输入的正弦(sin),将结果写入属性。
Tan 返回输入的正切(tan),将结果写入属性。

属性向量运算

节点 说明
Cross 输出两个输入向量的交叉积。
Distance 计算两个向量输入之间的距离。
Dot 返回两个输入向量的点积。
Inverse Transform Direction 按输入变换的逆变换来变换方向向量,但不改变其长度。结果写入属性。
Inverse Transform Location 按输入变换的逆变换来变换位置。结果写入属性。
Length 返回输入向量中存储的向量的长度。
Normalize 输出向量的规格化副本,确保基于长度这样做是安全的。如果向量长度太小,无法安全地规格化,则返回零向量。
Rotate Around Axis 计算并返回向量A围绕轴按角度(度数)旋转的结果。
Transform Direction 按提供的变换来变换输入方向向量。不会改变其长度。结果写入属性。
Transform Rotation 按输入变换来变换旋转体或四元数。结果写入属性。

属性旋转体运算

节点 说明
Make Rot from Angles 返回使用翻滚角值、俯仰角值、偏航角值创建的旋转体属性。
Make Rot from Axis 使用根据向前轴、向右轴、向上轴创建的参考帧返回旋转体。
Make Rot from X 返回仅使用X轴创建的旋转体属性。Y和Z轴未指定,但将标准正交。
Make Rot from XY 返回使用X轴和Y轴创建的旋转体属性。X轴保持固定,Y轴可以发生极小的变化,强制实施正交性。还会计算Z值。
Make Rot from XZ 返回使用X轴和Z轴创建的旋转体属性。X轴保持固定,Z轴可以发生极小的变化,强制实施正交性。还会计算Y值。
Make Rot from Y 返回仅使用Y轴创建的旋转体属性。X轴和Z轴未指定,但将标准正交。
Make Rot from YX 返回使用Y轴和X轴创建的旋转体属性。Y轴保持固定,X轴可以发生极小的变化,强制实施正交性。还会计算Z值。
Make Rot from YZ 返回使用Y轴和Z轴创建的旋转体属性。Y轴保持固定,Z轴可以发生极小的变化,强制实施正交性。还会计算X值。
Make Rot from Z 返回仅使用Z轴创建的旋转体属性。X轴和Y轴未指定,但将标准正交。
Make Rot from ZX 返回使用Z轴和X轴创建的旋转体属性。Z轴保持固定,X轴可以发生极小的变化,强制实施正交性。还会计算Y值。
Make Rot from ZY 返回使用Z轴和Y轴创建的旋转体属性。Z轴保持固定,Y轴可以发生极小的变化,强制实施正交性。还会计算X值。

参数

节点 说明
Get Actor Property 从保存PCG组件的Actor(或对象层级中更高的地方)检索属性的内容。默认情况下,它会查看Actor级别的属性(适合蓝图变量),但也可以使用 选择组件(Select Component) 选项查看组件属性。
Data Count 返回包含传递到输入引脚的数据数量的属性集。请注意,这不会忽略空的点数据

取样器

节点 说明
Copy Points 复制 Source per point in the Target 输入中所有点的实例。有多个选项可用于继承空间属性,但 Attribute Inheritance 对此节点的性能的影响最大。
Mesh Sampler 对指定静态网格体上的点取样。请注意,此运算开销高昂。需要 PCG几何体脚本交互操作(PCG Geometry Script Interop) 插件和 几何体脚本(Geometry Script) 插件。
Spline Sampler 使用样条线作为源材质,对点取样。在样条线上取样是指直接在样条线曲线上,而 水平(Horizontal) 、 垂直(Vertical) 和 体积(Volume) 选项在样条线体积(由Y/Z轴中的控制点的半径驱动)上取样。在样条线内取样需要样条线是闭合的。
Surface Sampler 在常规网格模式中,对表面数据上的点取样。此节点包含以下选项:点范围(Point Extents) :定义表面上的基本网格单元大小。松散度(Looseness) :定义允许变化的单元大小。在实践中,单元大小是点范围 * (1 + 松散度)。每平方米点数(Points Per Square Meter) :计算保留的单元的比率。此属性可在网格很大时避免过度拥挤。
Volume Sampler 对常规3D网格上提供的空间数据取样。这会表现出"类似体素"的行为,对于大型数据或高密度,可能开销高昂。

空间

节点 说明
Bounds Modifier 修改提供的点数据中的点上的边界属性。
Create Spline 根据输入点数据创建样条线。包含创建以下内容的选项:创建组件或仅创建数据闭合或线性样条线根据属性名称应用自定义输入和输出切线
Difference 针对差值的并集输出每个源的差值的结果。 此节点有以下选项:密度函数(Density Function) :控制在运算完成后使用哪个密度函数。包含以下选项:最小值(Minimum) :最终密度等于源的密度减去所有差值的最大密度。受限制的减法(Clamped Subtraction) :最终密度等于源的密度减去所有差值的密度总和。此值限制在0到1之间。二元(Binary) :如果密度差值大于0,最终密度等于0。否则,最终密度等于源的密度。模式(Mode) :控制存在具体空间数据与连续数据时的差值行为(其他类型,更接近分布函数)。请注意,在我们需要选择具体元素的一些情况下,这应该设置为"离散(Discrete)",否则生成的密度函数无法为扁平。包含以下选项:推断(Inferred) :源或差值为点则为离散,否则为连续。连续(Continuous) :不折叠密度函数。离散(Discrete) :折叠密度函数,意味着将数据转换为点数据。
Distance 对于第一个输入中的每个点,计算与第二个输入中的最接近点的距离,在计算从一个点数据集到相同点数据集的距离时自动忽略自身。可以选择将距离向量作为属性输出。
Extents Modifier 操控边界,修改点数据中每个点的范围。
Gather 取所有输入,生成保存所有输入数据的单个集合。主要用于整理。包含序列执行的 仅依赖项(Dependency Only) 引脚,用于它很重要的情况(例如,World Ray Hit Query与给定图表中生成的内容)。请注意,并非提供给此引脚的所有数据都会传递到输出。
Get Actor Data Get … Data节点的通用版本。 使用Actor筛选器和模式从Actor读取数据。它包含以下选项:Actor筛选器(Actor Filter) :确定在获取Actor数据时要考虑哪些Actor。包含子项(Include Children) :确定是否考虑输入的子Actor。模式(Mode) :包含以下选项:解析Actor组件(Parse Actor Components) :根据Actor上的组件构建PCG数据。获取单个点(Get Single Point) :返回一个点数据,其中针对每个Actor包含一个点,带有其变换和本地边界。请注意,在大部分情况下,会在此节点后使用一个Merge或Union节点。Get Data from PCG Component :返回另一个Actor的PCG执行的结果。请注意,只有传递到Output节点的数据会存储在PCG组件上,并且仅支持一些类型(点数据和属性集),将相应进行查询。PCG将确保在完成远程Actor的执行后继续执行。从PCG组件获取数据或解析Actor组件(Get Data from PCG component or Parse Actor components) :首先返回PCG输出(如果存在)。然后根据需要解析Actor。预期引脚(Expected Pins) :返回自定义输出节点引脚上的数据。
Get Landscape Data Get Actor Data 节点的特殊化,返回合适类型和构造的地形数据。
Get Number of Points 返回点数据中的点数。
Get Primitive Data Get Actor Data 节点的特殊化,返回合适类型和筛选的图元数据。
Get Spline Data Get Actor Data 节点的特殊化,返回合适类型和筛选的样条线数据。
Get Texture Data 将纹理加载到表面数据。请注意,对于压缩程度最大的纹理类型,这需要GPU才能执行。
Get Volume Data Get Actor Data 节点的特殊化,返回合适类型和筛选的体积数据。
Inner Intersection 计算提供给节点的所有数据之间的内相交,而不管其引脚。示例 : 输入[A, B, C]结果 : A ∩ B ∩ C
Intersection 计算 主源(Primary Source) 引脚中提供的每个数据的外相交,其中结果是主源引脚上每个数据针对其他每个 源(Source) 引脚上的数据并集的一个相交。示例 : 主源1包含[A, B] 源1包含[C, D] 源2包含[E]。结果 : A ∩ (C ∪ D) ∩ E, B ∩ (C ∪ D) ∩ E
Merge 将多个输入点数据合并为单个点数据。属性会合并,非公共属性根据需要设为默认值。
Normal To Density 基于点法线和提供的设置( 法线(Normal) 、 偏移(Offset) 、 强度(Strength) 、 密度模式(Density Mode) )计算点数据密度,类似于点积,但更灵活。
Point From Mesh 使用提供的静态网格体和该网格体的引用,构建包含一个点的点数据。
Projection 根据源数据创建投影数据,以投影到目标上。请注意,如果没有该源数据到该目标数据的特殊投影表示,则会将数据转换为点。
Spatial Noise 构造空间一致的噪点模式(例如Perlin噪点),并写入指定属性。
To Point 如果数据已经是点数据,将其投射到点数据,否则将空间数据离散化为点数据。
Transform Points 使用基本随机规则更改点变换(就地更改,或通过 应用于属性(Apply to Attribute) 更改为属性)。 变换的每个组成部分(平移、旋转、缩放)可以设置为绝对而不是相对,以允许更多控制权。它包含以下选项:均匀缩放(Uniform Scale) :将点数据缩放到相同的X、Y、Z比率。重新计算种子(Recompute Seed) :强制点种子根据其新世界位置更新。示例(Example) :使用带有绝对旋转且旋转Z为0的Transform Points节点,将确保点在Z中向上指。这会确保点在从地形取样后向上。
Union 从分布函数角度,创建数据之间的逻辑并集。结果依赖于所选密度函数选项。密度函数(Density Function) :控制在运算完成后使用哪个密度函数。包含以下选项:最大值(Maximum) :最终密度等于源的最大密度。受限制的加法(Clamped Addition) :最终密度等于所有差值中的密度总和。此值限制在0到1之间。二元(Binary) :如果源的任何密度大于0,最终密度等于1。请注意,这基本上只在二元差值的情况下有用。
World Ray Hit Query 创建类似表面的数据,在物理世界中执行光线投射。它可以将数据传递到预期表面数据的节点。默认情况下,光线的大小和方向由源组件的Actor属性(很可能是体积)驱动,但光线属性可以覆盖。 它包含以下选项:应用地形中的元数据(Apply Metadata From Landscape) :光线投射击中地形时,获取地形层值。请注意,这会带来较小的性能开销。忽略PCG击中(Ignore PCG Hits) :忽略PCG生成的所有资产。相较于在世界中创建数据的其他节点(或其他图表),没有强制实施顺序时很有用。可以选择返回物理材质和Actor击中。筛选元素用于精细控制,仅忽略或保留部分击中。
World Volumetric Query 创建类似体积的数据,从物理世界收集点。它可以将数据传递到预期表面数据的节点。"搜索重叠"检查控制是将重叠作为点范围,还是仅返回不与任何内容重叠的查询(受筛选影响)。还可以选择返回在该体积中"找到"的Actor。

生成器

节点 说明
Create Points 根据点的静态说明,创建包含点的点数据。
Create Points Grid 创建点数据,其中包含设置所定义的点的简单网格。
Create Target Actor 根据模板创建空Actor,可用作要将PCG构件写入的目标,例如静态网格体生成器。
Mesh Sockets to Points 根据静态网格体编辑器中定义的静态网格体插槽,创建点。插槽可以按标签筛选。
Point from Player Pawn 在当前玩家Pawn位置创建点。在运行时生成期间使用。
Spawn Actor 生成Actor的内容,或提供的输入数据中每个点的Actor的内容。根据设置,Actor由模板Actor类、实例化模板Actor或属性驱动。它包含以下选项:模板Actor类(Template Actor Class) :项目中可用Actor的列表。选项(Option) :折叠Actor(Collapse Actors) :收集一些Actor组件(静态网格体组件和PCG组件)以及目标Actor中折叠的Actor。仅合并PCG(Merge PCG only) :生成的Actor有PCG组件时,每个点生成一个Actor,其输入捆绑为单个图表执行。无合并(No Merging) :每个点生成一个Actor。
Static Mesh Spawner 在提供的点数据中每个点生成一个静态网格体。静态网格体选项添加到网格体条目数组,并使用每个条目的 权重(Weight) 选择。具体做法是取所有权重值的总和,将其转换为每个条目的百分比。例如,如果数组中有四个条目,每个条目的值为1,则总和的值为4。每个条目的权重会除以总和,转换为百分比。这意味着每个条目有25%的机会生成。静态网格体的选择是基于所选 网格体选择器类型(Mesh Selector Type) 选项使用变体完成的。它包含以下选项:PCG网格体选择器加权(PCG Mesh Selector Weighted) :基于条目的总权重选择一个条目。PCG网格体选择器(按属性)(PCG Mesh Selector By Attribute) :基于网格体上存在的属性选择一个条目。PCG网格体选择器加权(按类别)(PCG Mesh Selector Weighted By Category) :在点上查找属性以选择类别,然后基于权重选择一个条目。

子图表

节点 说明
Loop 将另一个图表作为子图表执行,循环引脚中的每个数据执行一次。非循环引脚按原样传递。
Subgraph 将另一个图表作为子图表执行。

变换

节点 说明
Apply Scale to Bounds 将边界乘以比例,并为点数据中的所有点将比例重置为单元向量。
WangShuXian6 commented 11 months ago

UE5 PCG工作流程[官方]

https://www.bilibili.com/video/BV1L94y1H7HJ/?vd_source=f259d77343588259f8e1b4ae567b1d34#reply199042498448 https://www.youtube.com/watch?v=LMQDCEiLaQY 本课程将探索使用虚幻引擎进行程序内容生成 (PCG) 的激动人心的世界。我们将详细介绍 PCG 的基础知识,并向您展示如何使用它来创建各种环境。在整个课程中,我们将引导您完成 PCG 的构建和工作流程,并与 3ds Max 中的 Rail Clone 或 Maya 中的 XGen/Bifrost 等传统散射工具进行比较。您将学习如何使用这些工具创建详细且复杂的环境,同时保持对最终结果的控制。在本课程结束时,您将对 PCG 以及如何使用它在虚幻引擎中创建令人惊叹的环境有深入的了解。

素材来源 Quixel image image

为小屋制作PCG瓦片屋顶

合并屋顶,方便整体添加瓦片

UE5-建模模式-XForm-shift 选择两个屋顶-Merge

选项模式 新建瓦片PCG 内容侧滑菜单-PCG_DTO目录-新建 PCG图表[PCG_Roof_UF] image

将 PCG_Roof_UF 拖进关卡

在内容侧滑菜单中双击打开 PCG_Roof_UF,开始编辑添加PCG节点 image

左侧或右键可搜索添加节点,但部分节点之只能从左侧找出,例如蓝图节点。

对房顶几何图形采样以生成点

房顶几何网格的细分要足够多,否则产生的瓦片数量不够 右键添加 Mesh Sampler 节点 即 采样器-网格体采样器 image

在 网格体采样器 细节面板中 为 Static Mesh 选择房顶的静态网格体

使用采样信息生成瓦片静态网格

从 网格体采样器 Out 拖出搜索添加 static mesh spawner[静态网格体生成器] image image 多选节点-按q键-使其对齐

在 静态网格体生成器-设置-网格体条目 增加一项【当前只需要一种瓦片,也可添加种瓦片】 在 第一项的 静态网格体 选择瓦片静态网格 image image

瓦片组将在世界原点生成 房顶位置非世界原点,所以与瓦片组偏移

调整瓦片生成方式

选择 网格体采样器 细节面板-设置-sampling method [采样方式]-one point per vertex [每个顶点采样一个点] image

调整瓦片方向

从 网格体采样器 out 输出 拖出搜索添加 transform points[空间-变换点] image 按住 ALT 左键点击连线 断开 网格体采样器 与 静态网格体生成器 的连线 将 变换点 输出连接至 静态网格体生成器 输入 image

选择节点 变换点-设置-旋转最小 z -88 旋转最大 z -93 [5度的随机偏转] 选择节点 变换点-设置-缩放最小 xyz 5 缩放最大 xyz 5

制作 PCG 栅栏 基于样条线

新建 继承自actor的蓝图 BP_Fence_UF 打开蓝图 取消勾选 actor tick -启用Tick并开始

添加一个分量 : spline 样条组件 image 用来定义栅栏的位置和形状 image

添加一个PCG组件 与根组件同级 image image

为PCG组件新建PCG图表

内从侧滑菜单-PCG_DTO-新建PCG图表: PCG_Fence_UF

在 蓝图 BP_Fence_UF-PCG组件-细节面板-实例-图-指定新建的PCG图表 PCG_Fence_UF image

编译,保存该蓝图

将蓝图 BP_Fence_UF 拖入关卡 image 点击样条线端点 按住 ALT 添加多个控制点 image image 可以弯曲样条线改变形状 image

使用样条线生成网格体

选择关卡的 PCG_Fence_UF 的细节面板-PCG - 实例-图 image 双击打开PCG图表编辑器 image

获取样条曲线信息

右键添加 get spline data 获取样条线数据 节点 image

使用获取的样条数据创建点

添加 spline sampler 样条线采样器 节点, image

样条线数据 的输出连接到 样条线采样器 的输入 image 以使用这些样本数据来创建点,然后从中生成几何图形

样条线采样器-设置-模式-切换为 距离 模式 【而非默认的 细分 模式】 以使用曲线的间距 image

生成栅栏网格

在 样条线采样器 输出连接 static mesh spawner image image 增加一个 网格体条目-并设置一个 栅栏静态网格体 image

image

调整栅格间距

选择 样条线采样器-设置-距离增量 调整使栅栏网格适应样条线间距 image

image 旋转调整栅栏长度与形状 image

选择 样条线采样器 按 a 键,可打开检查【左上角显示黄色圆圈】,可以看到目前有13条数据 image 对应13节栅栏 image

为栅栏顶部添加青苔

使用栅栏创建点,用以生成青苔静态网格体

在 PCG_Fence_UF 图表中新建 mesh sampler 网格体采样器

image image 设置-static mesh- 指定之前的栅格静态网格体,将作为采样部分 image

添加 copy points 复制点 节点

网格体采样器 输出 连接到 复制点 source image image 这将得到栅栏的所有点【每个三角形对应一个点】

采样所有栅栏

将 之前的 静态网格体生成器 输出 连接到 复制点的target image

选择 复制点 节点,按 D 键,打开调试【节点左上角显示一个青色圆形】

image 打开调试后可看到栅栏上所有的点【白色,可用以生成静态网格体,青苔】 image

通过一个灰度值表示栅栏顶部,进行过滤运算,将只存在栅栏顶部的点分离出来

添加节点 normal to density 法线转为密度 复制点 输出 连接 法线转为密度 输入 image image

选择 法线转为密度 按D键打开调试,显示灰度 其中 白色值为1 ,黑色值为0,灰色为中间部分 image 即 基于法线向量生成密度值

密度过滤器,过滤栅栏底部点

添加节点 density filter 密度过滤器 image image 选中 密度过滤器 按D调试,调节 设置-下边界 上边界 的值以过滤底部点,只显示顶部点

image image

通过 体素voxelize 增加点密度

选中节点 网格体采样器-设置-voxelize options-勾选 voxelize 这将打开体素 image

默认voxe体素值为100,将看不到 点 将voxe体素改为 1 image

添加噪音,分散点

为 复制点 节点连接 spatial noise空间噪声 节点

image image 按D 为 空间噪声 打开调试,取消其他节点调试

空间噪声-细节面板-设置-对比-4

空间噪声-细节面板-变换-旋转 x -67 空间噪声-细节面板-变换-缩放 xyz -999 555 555 生成斑点状噪音 image

结合 密度与噪声节点

添加 multiply 乘 节点 image

将 节点 法线转为密度,空间噪声 的输出分别连接 乘节点的A,B输入 修复乘法节点输入源 选择 乘法节点 细节面板-输入-输入源1-点加号-选择 密度 细节面板-输入-输入源2-点加号-选择 密度 image image

选择 乘法节点 打开调试 image

连接到密度过滤器

将 乘法节点输出 连接 密度过滤器 输入 选择 密度过滤器 打开调试 image 可以接续调整斑点块 密度过滤器-细节面板-设置-下边界

生成静态网格体

添加 static mesh spawner 静态网格体生成器节点 将 密度过滤器 输入连接 静态网格体生成器 输入 image

为 静态网格体生成器 新增一个 网格体条目,并选择一个 青苔 静态网格体 如果生成错误,则断开节点连线,重新连接节点 image

调节苔藓大小

断开 密度过滤器 与 静态网格体生成器,在期间添加节点 transform points 变换点 image image

变换点-细节面板-缩放最小-xyz 0.3 变换点-细节面板-缩放最大-xyz 0.4 image

当前苔藓分布过于集中

添加噪声

添加节点 attribute noise 放置与乘法与密度过滤器之间

image image attribute noise-细节面板-设置-模式-乘 image

image

通过插座 模块化 栅栏

使栅栏的网格体小部件随机化

WangShuXian6 commented 11 months ago

UE 5.3 PCG 更新功能

空间-获取地形数据 代替 地形(Landscape)

ue5.3已废弃地形(Landscape) 输出,请使用 空间-获取地形数据 代替 地形(Landscape) 输出 】

WangShuXian6 commented 11 months ago

PCG 生成森林

关卡

使用 基本(Basic) 关卡模板创建新关卡。保存关卡。

删除 地板(Floor) 静态网格体并使用地形模式向关卡添加新地形

使用塑造工具,向你的地形添加一些变化。

蓝图与PCG图表

返回 选择(Selection) 模式

新建PCG图表 PCG_Tree_UF

新建蓝图 BP_Tree BP_Tree 添加box组件[可选] box-细节面板-盒体范围-xyz 500

添加PCG组件 PCG-细节面板-实例-图-选择 PCG_Tree_UF

将 BP_Tree 拖入关卡

BP_Tree

选择关卡的 BP_Tree 将 BP_Tree 位置归零 缩放 BP_Tree 之与地图大小相等[或任意自定义大][默认地图 2.8 2.8 2] image

image

PCG图表

打开 PCG_Tree_UF

添加 空间-获取地形节点 添加 表面采样器节点 获取地形节点 输出 连接至 表面采样器 surface 选择 表面采样器 ,按D键开启调试,显示即将生成的点数据 image image

之后步骤同 https://github.com/WangShuXian6/blog/issues/178#issuecomment-1859048734 添加变化部分