- 0
- 0
- 0
分享
- Electric Dreams PCG技术详解(三)——森林、岩石和场景背景
-
2023-07-05
森林
需要有一个地形 公开参数(父项蓝图Actor中的变量) 用于执行森林图表的PCG组件 父项蓝图Actor上的PCG体积或盒体碰撞组件,用于生成内容。
森林图表位于:
/Game/PCG/Graphs/Forest/PCGDemo_Forest
独立的蓝图Actor(包含用于执行森林图表的PCG组件)位于:
/Game/PCG/Graphs/Forest/PCGDemo_ForestBP
森林图表使用的所有公开参数都来自“PCGDemo_ForestBP”,这些参数可以覆盖很多节点设置,例如采样器、密度、变换、种子和范围。这些参数可以在世界中的蓝图Actor上编辑,在编辑中和在编辑器中运行时触发森林的实时更新。
参数在蓝图中以两种不同的方式创建。全局参数是可以直接影响所有预设的变量,并直接驻留在蓝图中,而其他参数来自蓝图使用的一个预定义结构并作为预设,可以保存和循环。源结构资产位于:
/Game/PCG/Graphs/Forest/PCGDemo_ForestSettings
《Electric Dreams》环境示例项目中已经包含森林规则的关卡:
ElectricDreams_Env: /Game/Levels/ElectricDreams_Env ElectricDreams_PCG: /Game/Levels/PCG/ElectricDreams_PCG ElectricDreams_PCGForest: /Game/Levels/PCG/Breakdown_Levels/ElectricDreams_PCGForest
地形采样和生成岩石
使用两个单独的表面采样器对地形进行采样,为岩石Assembly和标准岩石网格体生成点。 表面采样器的设置通过“获取Actor属性(Get Actor Property)”节点,使用父项蓝图“当前设置(CurrentSettings)”结构中设置的参数和值进行覆盖。 两个流的采样点数据都使用“ForestToMountainsSwitch”子图表对法线和高度进行筛选,以防止山下的森林规则和山上的森林规则重叠。 在生成森林前,通过密度和筛选操作控制总体密度和分布。 使用“DiscardPointsInBumpyArea”子图表对主要岩石目标点进行Flat Area检测。将通过Flat Area检测的有效点输入“复制点(Copy Points)”,按属性输入“静态网格体生成器(Static Mesh Spawner)”节点。 使用“点过滤(Point Filter)”节点将标准岩石点分成三个子流,再将它们输入加权的“静态网格体生成器(Static Mesh Spawner)”节点,分别设置相应的网格体和权重。
岩石的二级生成
“合并(Merge)”节点用于合并之前被分入不同数据流的所有岩石点。将合并后的点数据合集分为两个流,用于在一级标准岩石点上生成地表细节和额外的岩石。 输入每个流的二级源点数据是使用“导入数据表(Import Data Table)”和“创建点网格阵列(Create Points Grid)”节点创建的,旨在实现不同的布局。然后通过“复制点(Copy Points)”节点将源点数据复制到每个目标点上。 所有复制点都将通过“投影(Projection)”节点投影到地形表面上。 使用“密度噪点(Density Noise)”和“密度过滤器(Density Filter)”控制点的分布,然后生成网格体。
通过地形采样和岩石排除生成主要树木、标准树木以及林中空地
使用三个独立的表面采样器对地形进行采样,为三个流创建点:主要树木、标准树木和林中空地。 表面采样器的设置通过“获取Actor属性(Get Actor Property)”和“属性过滤器(Attribute Filter)”节点,使用父项蓝图“当前设置(CurrentSettings)”结构中设置的参数和值进行覆盖。 每个流都使用“ForestToMountainsSwitch”子图表对法线和高度进行筛选,以防止山下的森林规则和山上的森林规则重叠。 然后将一级岩石作为与主要和标准树木点的二进制差异,用于避免重叠。 使用“距离(Distance)”节点和公开的范围参数计算标准树木点到林中空地点中心的距离。将标准化的距离写入标准树木点的密度属性。这可以让我们通过下游的选择和筛选过程调整树木的大小,在林中空地上生成特定的资产。
主要树木及其二级生成
主要树木点不仅用于生成密集的大树,还用于生成枯树。每棵主要树木周围还会生成二级资产。
主要树木点流将经历多次密度噪点、法线和筛选操作,然后生成枯树和密集的主要树木模型。 大型悬崖结构和林中空地通过“差异(Difference)”节点删除主要树木点。 二级资产通过两种方式创建/选择: 生成根和地块的点来自“导入数据表(Import Data Table)”节点,这些点被复制到每个主要树木点上,再被投射到地形表面。 小型树木和岩石来自标准树木流中经过筛选的点子集,根据它们与主要树木点的接近程度来选择。没有通过这项距离测试的点将用于在下游填充标准树木。
使用“距离(Distance)”节点计算从世界原点开始的距离向量。另外,将这个距离写入点的密度(Density)属性。 然后,将计算出的距离向量标准化,用于相对于阳光照射方向(在“创建属性(Create Attribute)”节点中设置)的属性向量点运算。利用该运算结果将点分为两个不同的区域:朝阳点和阴影点。 将密度噪点乘以根据距离值获取的点密度。使用经过噪点处理的到世界原点的距离密度值对两块区域进行细分,最终创建出四个区域:靠近/远离太阳的朝阳点、靠近/远离太阳的阴影点。 对每个经过筛选的数据流使用特定的“点配对和设置(PointMatchAndSet)”节点,确定每个区域中允许进行的加权材质覆盖。将材质软对象路径字符串写入每个点的“材质(Material)”属性。 所有数据流都流入一个“静态网格体生成器(Static Mesh Spawner)”节点,并启用“按属性覆盖材质(By Attribute Material Overrides)”,将“属性[0](Index[0])”设为“材质(Material)”
所有树流通过一个“合并(Merge)”节点合并在一起,作为“复制点(Copy Points)”节点的目标输入。 “复制点(Copy Points)”节点的源点数据由“导入数据表(Import Data Table)”提供。 经过参数化筛选后,将三级点投射到地形表面上,再生成网格体。
红色的点表示三级点,下图为最终结果。
大型悬崖结构是导出到PCG设置资产的Assembly,仅在森林空地周围生成。利用公开的参数改变交错的空地和标准树木采样器也会影响大型悬崖的生成效果。大型悬崖结构会删除森林中的树木和岩石,并在其周围添加碎石堆。
标准树木流以及到林中空地的距离密度被作为点数据重复使用,用于生成大型悬崖。 到林中空地的距离已被写入这些点数据的“密度(Density)”中,通过密度筛选在低密度范围内选择点的子集。 再用“DistanceToNeighbors(到相邻点的距离)”子图表进一步筛选点,在相同的点数据上找到一组附近的点。 使用蓝图中公开的覆盖参数进行变换。 使用“复制点(Copy points)”节点将四个大型悬崖PCG设置资产的源点复制到它们各自的目标点数据上。通过对输入流进行密度噪点和密度筛选处理,为每个Assembly划分目标数据。
大型悬崖Assembly点,下边为最终结果。
使用“获取地形数据(Get Landscape Data)节点”和表面采样器生成用于放置雾气卡片的点。 检测是否与树流有交集,确保只在有树木的地方生成雾气卡片点。 使用自定义PCG蓝图元素“LookAt(看向)”对雾气卡片点进行重定向,使其朝向世界中某个确定的位置,确保在中远距离的PCG序列视角获得最佳效果。 使用自定义PCG蓝图元素“Distance To Density(距离到密度)”计算雾气卡片到中心的距离,根据该距离将森林中的雾气卡片从世界中心区域删除,防止其与河床区域重叠。剩余点输入“静态网格体生成器(Static Mesh Spawner)”节点。
设置:
分区功能在PCG组件中启用或禁用(“属性们”->“高级”->“Is Partitioned(是否分区)”)。任何PCG图表都可以使用或不使用分区功能。《Electric Dreams》的森林蓝图PCG组件默认不使用分区功能,关卡中的Actor的PCG组件启用分区功能。
世界中的PCG世界Actor是在首次生成PCG组件时创建的。如果是2D或3D网格,并且带有“使用2D网格(Use 2DGrid)”开关,你可以在这个PCG世界Actor中设置“分区网格大小(Partition Grid Size)”。PCG世界Actor是所有PCG分区Actor的父项,PCG分区Actor是在生成分区PCG组件时自动创建的。“ElectricDreams_Env”和“ElectricDreams_PCG”关卡的分区网格大小为51200厘米。
要想在启用分区功能时检查PCG编辑器中的节点,必须在编辑器上下文下拉菜单中选择要检查的分区Actor。属性视图只会显示所选分区Actor上下文中的数据。
重要提示:采样器默认与其PCG体积绑定。启用分区功能时,采样器与每个分区Actor体积绑定,这是为了防止对每个分区Actor之外的点进行采样和在每个分区Actor之外生成点,以免创建出重复重叠的点,导致内存或性能问题。如有需要,可以提供其他绑定形状,或在必须以其他方式进行采样的特殊情况下,将采样器设为无限范围。
手动创建和封闭范围PCG区域的删除
《Electric Dreams》环境是结合传统工作流程和程序化工作流程构建出来的。在“ElectricDreams_Env”世界的核心区域,你会发现一个手动创建的区域,我们必须把它排除在程序化规则之外,以免发生重叠或出现制作问题。
我们采用的方法是利用样条将特定空间排除在程序化生成规则之外。我们还用程序化生成这部分区域的沟渠堤墙样条排除了PCG封闭范围区域。
红色样条 = 手动创建区域,白色样条 = PCG封闭范围溪床区域
为了在森林和背景规则中保存和使用参数预设,我们使用了“结构(Structure)”资产,其中包含专门用于覆盖节点设置的变量。结构中的这些变量必须是术语表属性描述中列出的PCG支持的类型。
创建一个结构资产,添加变量,设置面向用户的理想变量名和PCG支持的类型。
在我们想获取属性的Actor蓝图中设置结构。如果是森林,“PCGDemo_ForestBP”有一个“PCGDemo Forest Settings”类型的“CurrentSettings”变量,一个自定义结构。 在PCG图表中使用“获取Actor属性(Get Actor Property)”节点,启用“Extract Object and Struct(提取对象和结构体)”,将“Property Name(属性名称)”设为蓝图中的结构变量名。这将创建出一个属性集,其中包含结构中的所有变量。 使用“过滤属性(Filter Attribute)”节点为其相应的覆盖选择一个属性。在下图中,“获取Actor属性(Get Actor Property)”节点通过“CurrentSettings”结构创建了属性集,然后通过筛选主要树木的特定属性,覆盖“表面采样器(Surface Sampler)”的设置。
设置
背景图表依赖以下条件:
地形 自定义蓝图Actor,支持基于蓝图结构的预设系统,可以为图表提供参数。
背景图表位于:
/Game/PCG/Graphs/Forest/PCGDemo_Background
相关子图表:
/Game/PCG/Graphs/Forest/PCGDemo_Background_PlacementSubGraph /Game/PCG/Graphs/Forest/PCGDemo_Background_VariantsSubGraph /Game/PCG/Graphs/Forest/PCGDemo_Background_VariantsSubGraph_NoCulling
蓝图Actor(包含用于执行背景图表的PCG组件和预设系统)位于:
/Game/PCG/Graphs/Forest/PCGDemo_BackgroundBP
相关蓝图结构:
/Game/PCG/Graphs/Forest/PCGDemo_BackgroundSettings
《Electric Dreams》环境示例项目中已经包含背景规则的关卡:
ElectricDreams_Env:/Game/Levels/ElectricDreams_Env ElectricDreams_PCG:/Game/Levels/PCG/ElectricDreams_PCG
<<>>
用于填充背景的PCG设置资产
(使用预制的岩石和树木资产)
图表概览
绿色为近景层 黄色为中景层 红色为远景层 紫色为更远的远景
使用表面采样器,根据地形生成初始点,连接Distance To Density(距离到密度)节点,计算这些点到Global_WorldOrigin向量参数(在蓝图Actor中公开)的距离。 使用Global_WorldScale参数将这个距离重映射成0-1的范围,保存为点的密度属性。 使用密度过滤器(Density Filter)节点删除密度高于Global_MaxRange参数值的点,它也来自一个蓝图Actor变量。 由此得到的点以Global_WorldOrigin为中心形成一个圆盘,使用Global_WorldScale进行缩放,使用Global_MaxRange进行剪裁。 使用密度噪点(DensityNoise)为密度添加噪点。
从蓝图Actor的CurrentSettings_Far结构变量中提取RangeLowerBound
和RangeUpperBound的值,覆盖密度过滤器(DensityFilter)节点的属性。
密度过滤器(Density Filter)将使用这些值删除点,在圆盘中创建一个洞。
然后使用子图表 PCGDemo_Background_PlacementSubGraph来处理复杂的放置和堆叠工作。将整个CurrentSettings_Far属性集输入子图表,用来控制子图表的行为。
PCGDemo_Background_PlacementSubGraph 这个子图表的作用是创建一组经过堆叠、旋转和缩放的点,提升山脉的结构感。
随机选择输入点。 使用DistanceToNeighbors(到相邻点的距离)PCG蓝图节点寻找点集群。这一过程的描述请参见“附加信息”。 使用变换点从点集群中创建额外的点,使用随机约束垂直偏移和缩放值创建点堆栈。 使用LookAt(看向)PCG蓝图节点重定向所有点(聚集堆叠的点和单独的点),让它们朝向中点(Global_WorldOrigin / 参考点) 应用另一层随机约束垂直偏移和缩放值。 一部分点围绕Z轴旋转90度,另一部分点围绕Z轴旋转180度,围绕中心形成十字图案。 根据点到中心的距离增加点的缩放值和高度。
-
阅读原文
* 文章为作者独立观点,不代表数艺网立场转载须知
- 本文内容由数艺网收录采集自微信公众号虚幻引擎 ,并经数艺网进行了排版优化。转载此文章请在文章开头和结尾标注“作者”、“来源:数艺网” 并附上本页链接: 如您不希望被数艺网所收录,感觉到侵犯到了您的权益,请及时告知数艺网,我们表示诚挚的歉意,并及时处理或删除。