为大规模3D游戏环境开发工具:Jolan Huijskes的Blender与UE5技术方案

AI3D 发表于 09-04 浏览 0 分类 创作分享

引言

大家好!我是 Jolan Huijskes,一名专注于技术解决方案的环境美术师。我最近以优等成绩毕业于布雷达应用科学大学。你可以在 ArtStation 上查看我的作品。

在之前的项目中,我展示了技术能力的价值,比如我曾制作过一个 剥落油漆效果。我喜欢这类技术挑战,所以在这个最新环境中,我决定在技术方面投入更多精力。

这个粉丝艺术项目旨在探索如何使用环境美术工具来创建大型游戏关卡,同时让关卡美术师拥有最大化的可控性。我的重点在于工具开发、构图和美术方向。

在这篇文章中,我将探讨我为这个粉丝艺术项目开发这些工具的方法和原因:

  • Blender 破碎生成(该工具将于不久后免费发布)
  • Unreal Engine 阵列工具
  • Unreal Engine 破碎工具
  • Unreal Engine PCG 散射(具备美术控制)
Developing Tools for Large-Scale 3D Game Environments
Developing Tools for Large-Scale 3D Game Environments
Developing Tools for Large-Scale 3D Game Environments
Developing Tools for Large-Scale 3D Game Environments

本项目的所有内容均由我本人制作,与我的专业工作无关。

工具理念

程序化解决方案无疑功能强大,在制作中也相当常见,但它们同样会让美术人员感到困扰。我曾在 Unreal Engine 中使用过一款 Houdini 工具——只要你点击下一个资源,它就会删除你之前的工作!

这个项目的目标是开发出我作为环境美术师乐于使用的工具。基于我在其他项目中的经验,我总结出几项设计原则:

减少摩擦:如果工具显得复杂或不够直观,美术师就会回避使用它。这可能导致环境未经优化或造成破坏性的制作流程。

减少等待时间:当需要等待 5 分钟才能得到结果时,美术师可能已经忘了是哪些改动导致了这一结果。这会加大工具的使用难度,并可能导致他们接受质量较差的结果。

最大化美术掌控:在 3A 级制作中,每个细节都很重要。美术会收到来自策划、组长和美术总监的极其具体的反馈。如果工具缺乏足够的手动控制,就无法满足他们的要求。

Blender 破碎生成

要打造我设想的破碎系统,我首先需要在保持网格模块化特性的同时,生成模块套件的破碎碎块。对于这种无缝衔接的建筑结构来说,这尤其具有挑战性。如果柱子顶部/底部有任何碎裂线或边缘破损,都会立刻暴露构件拼接的位置。

通常,离线网格破碎是在 Houdini 中通过诸如 RBD Fracture Node 之类的工具完成的。Houdini 无疑是最强大、最灵活的解决方案,但它与我前面列出的原则存在冲突:

  • 使用 Houdini 意味着引入额外软件,这会给美术增加阻力。
  • 使用 Houdini 意味着需要在 Houdini 中导入/导出内容,这会带来额外的开发时间。
  • 使用 Houdini 还意味着,只要网格有任何改动,都需要重新处理一遍。

如何解决这些问题?直接在 Blender 中构建一个快速且零阻力的解决方案。

起初,我尝试了原生的 Blender Cell Fracture,不过作为一个过时且复杂的 Python 插件,它让我很难针对自身目的进行定制。例如,我没有看到简单的方法来细分网格并添加噪点,从而生成更复杂的碎裂线。

Developing Tools for Large-Scale 3D Game Environments

于是,我决定使用几何节点(Geometry Nodes)来构建自己的破碎系统。几何节点已经相当强大,而且该系统仍在持续扩展新功能(在 5.2 中,新增了物理、几何包、列表,以及大家期待已久的 网格倒角节点 等)。

我的系统的起点与 CGMatter 的破碎系统相同。这个基础系统会产生一些有问题的结果:它生成极薄的碎块,也会生成极小的碎块,并且不会沿网格的自然断裂点切开。

经过查阅各种资料和多轮迭代,我构建了一个更一致且更真实的算法。以下是对该系统的简化说明(见图): 

基础破碎

对每个网格岛重复 X 次:

  1. 沿着网格最长的轴创建一个平面
  2. 使用 3D 噪波置换该平面
  3. 使用该平面做布尔运算,将网格岛切割成两半

内部细节

  1. 使用 3D 噪波置换内部

边缘破损

针对每个网格岛:

  1. 重新网格化
  2. 用三维噪波膨胀新网格
  3. 从原始网格中布尔减去新网格
Developing Tools for Large-Scale 3D Game Environments
Developing Tools for Large-Scale 3D Game Environments

基础破碎(Base Fracture)系统与 CGMatter 的教程非常相似,但有一些关键改进:

  • 首先,只切割较大的网格岛可以得到更一致的破碎尺寸
  • 其次,我使用矩阵 SVD 沿网格的最长轴进行切割(见图),从而产生更真实的断裂点
  • 其他细微改动用于提升一致性和性能
Developing Tools for Large-Scale 3D Game Environments

内部细节是通过置换碎片内部网格来完成的。当前版本使用的是三平面投影纹理,但我计划在免费发布时将其替换为三维噪波。

最后,边缘破损部分基于 Cartesian Caramel 的方法:对模型重新网格化,添加一些噪波,然后从原始网格中布尔减去它。

在开发过程中,我发现易用的调试工具非常有价值。我加入了移除或分离碎片以查看内部的选项,这些功能被证明非常有用。我建议为你的工具开发调试功能!

在应用几何节点效果后,网格会通过我制作的自定义插件进行导出准备。最终成果是一个在 Blender 中非破坏性应用的破碎工具。它易于使用且经过优化,不依赖于外部程序,后续也能轻松调整。

该工具即将免费发布。我正在改进工具的 UI/UX,移除所有依赖项,并使其支持自定义。另外,我还有一些未来改进的想法,例如手动单次切割选项,让用户精确控制切割位置和角度。关注我的 Twitter/X 以获取更新。

以下资源对我的工具开发起到了重要作用:

虚幻引擎阵列工具

为了构建我的粉丝艺术项目中无缝、垂直且重复的建筑,使用阵列工具似乎是显而易见的选择。其目标是使用模块化套件,以非破坏性的方式构建具有极大尺度的重复建筑。

这个系统的开发速度很快,因为它相当直接。使用 for 循环,可以轻松地将网格排列成一行;再加一个 for 循环,就能扩展到二维。

以下是该系统的简化概览:

1. 添加 Instanced Static Mesh Component

2. For 循环(重复 [Repeat 1] 次):

    2.1 在 [Transform 1] 处添加 Static Mesh Instance

3. For 循环(重复 [Repeat 2] 次):

    3.1 对每个现有实例:

        3.1.1 在 [Transform 2] 处添加 Static Mesh Instance

Developing Tools for Large-Scale 3D Game Environments

这个工具虽然简单,但因其直观的操控而使用起来很愉快。请确保在 Transform 参数中启用 “Show 3D Widget”。这样你就可以在 3D 视口中操作蓝色的 gizmo 了。

Developing Tools for Large-Scale 3D Game Environments

我使用蓝图中的组件脚本(Component Script)创建了这个系统。幸运的是,关于这个话题有很多现成内容。最大的挑战是加入随机化(网格的随机翻转),我并未完全解决。也许其他人可以改进它!

我的工具的另一个主要限制是,每个新蓝图(BP)都是一个新的实例化静态网格(Instanced Static Mesh)组件。也许你可以通过将关卡中的所有实例进行合并批处理来改进这个系统。如果你使用 World Partition,可以研究一下“ISMCellTransformer”(来自 Kay Volbeda 的建议)。

带着这些限制,我建议为这个工具探索虚幻引擎的 PCG。这样可以实现更好的优化,并与其他 PCG 系统更好地交互。

虚幻引擎破碎工具

破碎系统的下一步是在引擎内实现的:这是一个让关卡美术可以非破坏性地摧毁建筑结构的工具。同样,已有现成方案,通常是引擎内的 Houdini HDA。但我有意在 Blender 中预先破碎网格,以便在虚幻引擎中获得一个响应即时、不依赖其他软件连接的工具。

我知道大致概念:用较小的碎片重建网格,然后根据球体碰撞来删除/隐藏碎片。思考这个方案时,我意识到有一个主要问题需要解决:

  1. Blender 中破碎的网格是分离的
  2. 这些碎片需要居中的轴点,以便在引擎内手动布置场景
  3. 在虚幻引擎中,建筑网格必须由破碎网格重建
  4. 问题:系统如何知道在哪里放置碎片?碎片的位置如何保存、导出并在蓝图中使用?
Developing Tools for Large-Scale 3D Game Environments
Developing Tools for Large-Scale 3D Game Environments
Developing Tools for Large-Scale 3D Game Environments

对于每个破碎网格,都需要存储一个位置(矢量)。我想过几个不同的选项:

  • 导出文件中的自定义数据:FBX 如何处理?我是否需要为此使用 GLTF?听起来很复杂
  • 将数据列表保存为 JSON:非常软件无关,是一种值得学习的技能,但听起来也很有挑战性。Blender 究竟如何将此数据导出为 JSON?
  • 在每个网格的正确位置放置一个隐藏顶点:如何从蓝图内部访问该顶点位置?
  • 解决方案:Socket(插槽)

Socket 是虚幻引擎的一项功能。它们是存储在静态网格中的特殊变换,用于附加其他网格(例如将门附加到门框,或将剑附加到角色的手部)。我决定利用这个功能来存储我的数据。

如果 Blender 中的空对象命名为 SOCKET_{SocketName},虚幻引擎会将其识别为 Socket。因此,我编写了一个 Blender 插件,让每个破碎网格都在正确位置随一个空对象一起导出。然后就可以在虚幻引擎中通过蓝图访问该 Socket 的位置。

Developing Tools for Large-Scale 3D Game Environments

在虚幻引擎中使用构造脚本(Construction Script),我构建了这个工具的逻辑。以下是该系统的简化概览:

1. 破碎球体蓝图投射到附近的网格蓝图:

    1.1 删除主网格

    1.2 对于数组中的每个破碎网格:

          1.2.1 添加破碎网格

          1.2.2 将破碎网格移动到 Socket 中存储的位置

          1.2.3 检查与附近破碎球体的重叠

          1.2.4 如果重叠,删除破碎网格

重叠检测可通过节点“Component Overlap Actors”和“Sphere Overlap Components”完成。Socket 位置可通过节点“Find Socket”找到。

Developing Tools for Large-Scale 3D Game Environments

最终成果是我用过的最顺手的工具之一。它响应即时、易于使用,并且完全由美术掌控。这个工具并非没有缺点。首先,我没有把它和阵列工具(Array Tool)集成。如果我有更多时间,可能会尝试合并两者的逻辑。这完全可行,但很耗时。

其次,当使用大量破碎球体(超过150个)时,我确实遇到了一些轻微的性能问题。我不确定如何改善性能。如果你有任何建议,请告诉我!

具有美术控制的虚幻引擎 PCG 散布

在大多数环境中,散布瓦砾、植被等资产是常见操作。PCG 近来已成为此需求的流行解决方案,但也伴随一些挑战。与手动放置或植被绘制不同,它默认缺少给美术的操控性。在精细的游戏环境中,手动控制非常重要:例如构图、清晰的玩家行进路线,以及环境叙事。

尽管如此,PCG 性能良好、灵活,并能与其他虚幻引擎系统很好地集成。我给自己设定了一个挑战:打造一套既程序化又可控制的 PCG 系统。首先要强调的一个实用元素是使用“Actor Data”节点,配合“All World Actors”“By Tag”和“Get Single Point”。这能让你的 PCG 图表更具关卡感知能力。我用它在破碎建筑周围散布瓦砾,但我相信你能想到自己的创意应用。

Developing Tools for Large-Scale 3D Game Environments

我通过创建一个 Actor 数组变量(Actor Array Variable)增加了手动控制。将其接入“Actor Data”节点后,你就可以手动从关卡中拾取 Actor。你可以用它来在这些 Actor 周围散布更多网格,也可以用它移除该区域的网格。

“Select”节点很适合在同一图表中包含不同行为。例如,我的碎片只应在带标签的网格附近生成,而草则应在所有地方生成。

Developing Tools for Large-Scale 3D Game Environments

将上述想法整合起来后,我创建了这个程序化工具来补充我的毁坏建筑。我依赖 Tags 和 Picker(拾取器),但你也可以探索其他选项!也许它应该更多由地形数据或蓝图 Actor 来驱动。

关于 Unreal Engine PCG 的最佳学习资源,我强烈推荐 Adrien Logut 的 YouTube 频道 和 Procedural Minds 频道。你也可以在 Unreal Source Discord 服务器中提问。

结论

希望这篇文章让你有所收获!当你开发自己的工具时,请确保它们响应迅速、易于使用,并能由美术人员控制。 

我计划免费发布我的 Blender 破碎生成器(Fracture Generator)。我需要修复一些依赖问题、优化 UI/UX,并找到最佳的上线方式。请持续关注后续动态!

如果你有任何问题,欢迎随时联系我!

欢迎在我的 ArtStation 上查看我的作品集。

欢迎在 LinkedIn 上与我联系。

欢迎在 Twitter/X 上关注我。

Jolan Huijskes,环境美术师

相关链接

原文链接:https://80.lv/articles/developing-tools-for-large-scale-3d-game-environments

喜欢这篇内容吗?