UE5.2 | PCG程序化生成插件【生态域制作】对比Houdini如何?
Game艺视界原创文章原创 15864 0
实名

通过了实名认证的内容创造者

发布于 2023-4-28 16:11:53

您需要 登录 才可以下载或查看,没有账号?注册

x

本期笔记分享
如何设置项目以使用 PCG * 如何在景观上散布点 * 如何在这些点上生成静态网格 * 如何在网格中引入随机性
点边界是什么以及它们如何影响生成 * 如何删除同一点云中的重叠点。* 如何去除 2 个点云之间的重叠点 * 如何快速分析图表
#插件开启
程序化内容生成工具开启

02d2851dad3cde3910b2f5dc1e30b91b.png

重启引擎后我们在文件夹右键有个PCG
5999f718128619f61d106250ac4eb161.png

为确保它已被激活可以转到“放置 Actors” 尝试编写 PCGVolume,如果您有PCGVolumes则表示它成功了!PCGVolume 是一个非常简单的盒子,我们可以像这样将它放入我们的世界 它包含一个PCGComponent 该 PCGComponent 还将包含一个 PCGGraph该 PCGGraph 将具有生成内容的所有规则盒子通常定义生成的边界。所以在我的情况下,我希望它大一点在细节里面调整缩放


创建图表后重新命名,双击打开一个与蓝图非常相似的新编辑器,首先看到是输入和输出。左侧窗口中是我们后面需要用的节点命令



您也可以右键单击并查看所有节点一些节点是在 C++ 中本地定义的其中一些还在蓝图中定义,使人们可以非常快速地制作原型 如果您想在 C++ 中创建新节点


最常见的用途之一是散布在表面上在这张地图上你有这片森林


我们有一个名为 SurfaceSampler 的节点,我们想要做的是能够对表面进行采样在表面上取一些点所以我们要做的是进入输入


你可以找到多种类型的输入 在我们的例子中 您有“地形”和“地形高度”,“地形”包含更多信息 而不仅仅是高度但在我们的例子中 我们只需要高度 所以我们将只使用那个高度所以只需单击并拖动到表面


现在我可以转到我的组件并尝试点击生成,这时候我们在场景并没有看到任何生成的内容


为确保我们有点,可以右键单击要分析的节点去检查,然后选择一个生成组件你将得到由该节点生成的所有点的列表。可以看到我们生成了很多点


为了帮助设计师调试我们还有一个调试选项



在景观上的点!因此您可以准确地看到所有生成的点在列表中,您可以看到它的位置、旋转、比例以及更多有趣的信息,同样有趣的是如果您正在修改边界它也会自动重新生成,如果你稍微移动一下盒子你会看到它产生了新的东西,您可以看到它的位置、旋转、比例以及更多有趣的信息点有不同的颜色对于调试信息它与密度有关,密度为0为黑色密度为1为白色。密度介于 0 和 1之间对于表面采样器 默认情况下密度也是随机的


选择图表在右侧,我们改变我们的点数假设我想要更少的数量





如果我设置0.5那么我们看到的和0.1之间并没有什么变化,那是因为每个点都有一定的边界范围,并且便面采样器会将点放在彼此之间一定距离处 这意味着如果我想要更多的点我需要减少它的范围



或者你也可以改变松散度,如果我改变松散度假设我希望它不那么松散,你可以看到点彼此更接近。我可以继续拥有非常非常接近的东西我也可以改变范围


让我们把它们的大小减半你可以看到我有更多的点因为点更小了


PCG支持的另一件事是您拥有可以在编辑器中完成的工作流程,因此您可以直接在编辑器中生成点同时也可以清除点,您会看到我有这个“生成触发器” 即“加载时生成”这意味着当在游戏中加载体积时它会生成


因此 如果我点击播放 你会看到它是在运行时直接生成的这意味着你可以在游戏过程中生成 PCG 我们将在以后的视频中看到如何做到这一点


我们要添加一些树!为此我将只使用一些资产,然后我们添加一个新节点称为“Static Mesh Spawner”添加我们的模型更多的种类我要做的是添加新条目,默认情况下它只会根据权重进行选择在我的例子中我到处都有1的重量,这意味着我有尽可能多的机会将一个网格置于另一个网格之上





当我们添加多种植被时如何设置所占百分比



所有的树都具有与您所看到的相同的大小并且具有相同的方向,为了解决这个问题我们将只添加一个名为“转换点”的新节点


我们还可以做的一件事是尝试随机定位,如果我们想在Z轴上随机旋转它们,我们只需将旋转最大值设置在 0 到 360 度之间以度为单位,然后你拥有了所有具有不同方向的点





快捷键 E:隐藏生态域



然后按“D”调试变换点您会看到这些框有不同的大小,你有更大的有更小的这正是我们想要的让树的大小具有一些随机性


添加更多网格物体(如岩石或一些树叶)以获得更好看的森林,我们将看到点边界的实用性,它将帮助我们从另一组点中排除点。添加更多的网格(如岩石或一些树叶)以获得更好看的森林是很有用的同时不会生成它们与其他网格物体重叠,这将很有用。我们还将了解如何衡量图形生成的性能以及如何组织图形
上面我们使用了三个节点。第一个是获取表面上的景观和采样点,然后我们对比例和旋转应用随机变换,然后我们生成具有不同概率的不同树木的不同网格添加更多的网格(如岩石或一些树叶)以获得更好看的森林是很有用的,同时不会生成它们与其他网格物体重叠,这将很有用。我们还将了解如何衡量图形生成的性能以及如何组织图形
首先我们添加岩石如果我放大,你会看到有些重叠,彼此非常接近,我们那里的岩石太多了,这不是我们想要的


所以我们有两个问题:第一个,如果我们在变换点上启用调试信息,您可以看到表示边界的框不符合网格的最终形状,然后第二个问题是对于变换点,我们有重叠的框,所以我们需要删除所有重叠以避免这些网格碰撞。所以调试信息对我们有很大帮助,让我们尝试解决我们的第一个问题


因此,对于第一个,我们需要更改边界,我们有多种方法可以这样做。


我们将添加一个新节点。该节点称为“边界修改器”。所以我们将把它添加到变换点和静态网格生成器之间。



通过修改静态网格缩放来减少物体重叠(以自身坐标的缩放)


我们继续添加另一个节点:自修剪self Pruning所以当前的修剪类型是“从大到小”,这意味着我们优先考虑大盒子。如果我反过来从小到大,我们会有更多的小盒子,有多种模式,你可以玩一下。但我们会从大到小。




所以现在我们要确保树木不与岩石重叠,因此我们需要确保树木的边界良好。所以让我们回到我们的图表,让我们在静态网格生成器上为树木启用调试,然后我们可以放大



我们引入差异节点,所以我们想要的是:我们想要排除来自岩石的点和来自树木的差异点。那么让我再解释一下幕后发生的事情。使用源点云,即我们的岩石,它正在对另一个点云上的树木进行投影。在这种情况下,投影在两个有边界的点云之间意味着什么,它只会尝试为源中的每个点找到在另一个点云中重叠的所有点,如果我们使用的是最简单的二元密度函数一,这意味着如果投影成功对于一个源点,我们发现在差异点云上重叠的点它将被丢弃。因此,如果我禁用网格生成器,可以看到,在没有自修剪调试信息的情况下,我们删除了很多点







接下来我们预览下可以看到岩石不再与树木相交,我们没有更多的树干进入岩石,这很酷!


好吧,现在最后一步!让我们添加树叶。我有一个非常简单的网格,我们将它散布在体积周围,并且不会与树木和岩石发生碰撞。因此,让我们尝试禁用树木和岩石网格并添加一个新的表面采样器。我们需要很多树叶,所以让我们尝试减少我们的点范围彼此靠近,以减少松散度,然后我们将用5.0添加更多点


准确知道撒点数量



接下来使用变换点来添加随机性。我们仍然希望围绕 Z 轴旋转,但也许我们可以围绕Y轴和 X 轴进行一些旋转,但不要旋转太多,因为我们不希望它悬停在地面上,然后我们可以像我们一样缩放它 做 90% 和110% 是的,我们只是要调试变换点,这就是我们所拥有的!我们点比较相近所以我们使用bounds修饰符来减少边界,一下子生成这么多需要一点时间,具体取决于你的CPU,接下来链接到我们静态网格生成器添加静态网格可以看到到处都是树叶


静态网格生成的主要问题是它是在主线程上完成的,因此我们不能对其进行多线程处理。所以我们有点被困在一次产生它们。要准确查看静态网格物体生成器的成本,我们可以打开性能分析窗口,然后按生成,然后您会看到:您的静态网格物体生成器需要 250 毫秒才能生成,这很长


有可能减少?答案是肯定的,因为在这种情况下,当您生成大量网格时,成本非常高的是通过碰撞来生成它们。因此,对于那种树叶,您不需要碰撞或不需要碰撞,因此至少在本演示中通过它们是可以的,因此我们将更改参数。因此,如果我回到碰撞预设,我可以将其设置为无碰撞,然后更改是即时的。您可以看到现在生成网格需要 4 毫秒而不是 250 毫秒,这是一个巨大的提升。





我们树里面有树叶树林里面也有这是不理想的所以我们想要做的是同样的事情添加差异节点,我们想要从草的点中移除我们想要移除树木和岩石然后我们可以将它更改为二进制以排除所有重叠的框......重新连接树叶按保存并按播放



现在你拥有它!树叶围绕着岩石,围绕着树木,但从不与它们重叠。然后你就拥有了!我们的森林变得更有趣了。大家可以更新5.2尝试下对比Houdini如何


点击阅读原文观看视频版坚持与您分享最有价值“干货”内容,本期分享就到这里,我们下期见!


微信公众号:Game艺视界
使用道具 <
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表