创建可破坏的建筑物
介绍
大家好,我叫 Erwin Smeenge,目前在荷兰布雷达应用科技大学学习国际游戏架构与设计。
我从小就对艺术和游戏充满热情。我一直喜欢钻研幻想世界,完全迷失在游戏知识中,同时也对艺术感到惊讶。
高中毕业后,我在兹沃勒的 Deltion 学院开始了我的第一个游戏艺术相关学习。在这项研究中,我很快就对 3D 艺术产生了热情。学习 3D 建模、编码、纹理和使用引擎。在这项研究期间,我还在 Wolfdog Interactive 做了一年的实习,在那里我担任了 Skyworld 游戏的 3D 通才。
从 Deltion 毕业后,我想学习更多,变得更好。这促使我申请在我目前学习的布雷达应用科学大学 (BUas) 学习游戏架构和设计。
视觉特效之路
在 BUas 的第一年,我开始对游戏艺术的更多技术方面产生越来越大的兴趣。学习 Houdini 是其中很重要的一部分。
我知道我想成为一名 VFX 艺术家的那一刻是在我的第二年,当时我有一个项目,让我可以全职专注于研究 VFX。在这个块中,我探索了虚幻引擎中的 Niagara 和蓝图。我发现在这个过程中我用视觉效果解决技术问题更有趣,所以我决定把重点放在 VFX 上。这也让我在为自己设置小项目/研究时回到了 Houdini,我对这些可能性感到惊讶。我特别喜欢与 RBD 和 Vellum 合作。
布雷达应用科技大学
目前,我在3次我的研究在多学科小组今年我们工作的一个游戏项目全年的一年。我是外包团队的一员,担任 VFX 艺术家。外包团队是一个选项,您可以选择为多个游戏团队提供所需的效果或提供有助于改进其游戏项目的解决方案。
一周的整体结构分为四个项目日和一个研讨会日,您可以参加讲座和研讨会。或者去专门的学习社区(公会)。
概念破坏钻机
当一个突然的想法出现时,我正在进行一些个人研究,并了解更多 Houdini 中 RBD 的可能性。这个想法是一个工作流,将对象拆分为可破坏的集群,然后在虚幻蓝图中重新组装。由于破坏是我今年重点关注的重要部分,我认为这是一个有趣的想法。
![](https://cdn.80.lv/api/upload/content/b5/609273e6afaba.gif)
因此,我跟进它为自己设定了一个目标,即创建一个工作流程来平衡 Houdini 中 RBD 的艺术方向与尽可能多的引擎内控制。
![](https://cdn.80.lv/api/upload/content/07/images/609273e883ffe/widen_920x0.jpg)
一开始,我已经确信我最好的选择是使用骨架网格物体,因为我会在 Unreal 中获得骨骼信息。当将破坏模拟与骨骼配对时,我获得了与操纵角色或其他动画网格相似的控制和交互量。当我开始研究动画蓝图时,我看到了如果我可以将破坏模拟与此集成,我将获得的潜在控制权。
![](https://cdn.80.lv/api/upload/content/de/images/609273eb770e3/widen_920x0.jpg)
第一次迭代
对于我的第一次迭代,我设置了一个简单的建筑生成器,然后将其分解并分成簇,然后我使用 RBD 子弹求解器进行模拟。最初,我想分别导出集群,每个集群都是它们自己独特的资产,然后在 Unreal Blueprints 中重新组合在一起。
![](https://cdn.80.lv/api/upload/content/4d/images/6092741bba0cf/widen_920x0.jpg)
虽然这在 Houdini 中使用 RBD 到 FBX 节点有效,但它在所有骨架资产的引擎中造成了相当大的混乱。它也没有提供我想要的控制量,并要求我执行重复的蓝图操作来激活集群。
设置模拟
所以回到 Houdini,我重新设计了 RBD 之前的工作流程。我发现了 Labs Building Generator SOP 并在 Blender 中制作了一些网格来设置它。对于这座新建筑,我需要重建聚类和压裂工作流程,因为完全压裂这座建筑并不是最佳选择。
所以,首先我需要确定和分割我想要破坏的区域。我没有使用布尔值,而是对打包的几何图形进行了分组。这适用于开箱即用的较小模块化对象。然而,更大的表面需要初始断裂才能使孔更逼真。然后我拆分集群组并使用保险丝、Labs Dissolve Flat Edges SOP 和 Clean SOP 节点清理初始断裂。
![](https://cdn.80.lv/api/upload/content/0c/images/609274de68f8a/widen_920x0.jpg)
然后,簇根据它们的材料 ID 进行断裂,每个材料 ID 都有自己的断裂程序。在设置约束之前,我在每个集群周围添加了一个环。
在 RBD 模拟中,环被设置为非活动状态,但确实有粘合约束。这个环作为集群的容器,在撞击碰撞物体撞击之前将碎片保持在适当的位置,同时也创造了一个合适的拼图,以合并回静态建筑。
RBD 模拟本身的其余部分主要涉及调整约束和力值。
后RBD
准备好这个新的模拟后,我研究将其转换为钻机。但在此之前,我需要稍微清理一下模拟,因为每个打包的部分都等于一个骨骼。为此,我使用了 Labs Destruction Cleanup SOP。此 SOP 识别并组合可以在模拟中视为一个的部分。
由于棋子周围的环设置为非活动状态,因此它们会合并为一个棋子。这使我可以轻松地将其从模拟中分离出来,并将其合并回主建筑。与胶水簇一起,这大大减少了骨骼数量。
索具
清理后,RBD 准备好进入 Rig 创建过程。在此过程中,将创建其余几何体、捕捉装备和动画装备。
![](https://cdn.80.lv/api/upload/content/a6/images/6092762b3e0a2/widen_920x0.jpg)
首先,我遍历每个集群并将它们连接到以每个集群为中心的父骨骼。
然后这些父骨骼连接到作为整个静态对象中心的“骨盆”。该骨骼还具有所有静态网格体的蒙皮。最后我将这个骨盆骨连接到根部。
![](https://cdn.80.lv/api/upload/content/a3/images/6092762cc5ce2/widen_920x0.jpg)
在此过程中,使用打包几何体的内在数据有助于保持钻机的正确变换。
![](https://cdn.80.lv/api/upload/content/7a/images/6092762fa5dca/widen_920x0.jpg)
在此工作流程中,两个方面最重要:名称属性和在骨骼之间创建的折线。这两个方面控制着装备的层次结构和骨骼名称。设置骨架后,我使用 Rig Doctor SOP 和 Capture Packed Geo SOP(这是新的 KineFX 工具集的一部分)来设置装备。
虚幻导入
在 Unreal 中导入的工作方式与任何其他骨架网格体相同。为了测试动画,我可以简单地将动画资源添加到场景中的骨架网格物体中。
![](https://cdn.80.lv/api/upload/content/b1/images/609276c042d66/widen_920x0.jpg)
动画蓝图
为了拆分模拟,我使用了动画蓝图。在此蓝图中,我混合了多个状态机,其中每个状态机类似于一个集群。在这个状态机中,有一个转换规则检查名称数组是否等于集群父骨骼。如果满足此规则,则可以播放该集群的动画。
![](https://cdn.80.lv/api/upload/content/4c/images/609277405533f/widen_920x0.jpg)
为了使多个建筑物更易于访问,我设置了遵循相同规则的子蓝图。这样我只需要切换动画和骨架资源,就可以让这个动画蓝图适用于多个不同的建筑和模拟。
![](https://cdn.80.lv/api/upload/content/22/images/60927742d6b33/widen_920x0.jpg)
![](https://cdn.80.lv/api/upload/content/58/images/6092775a54a02/widen_920x0.jpg)
![](https://cdn.80.lv/api/upload/content/52/images/6092775ccb9fc/widen_920x0.jpg)
控制蓝图
控制蓝图用作数据传输器。它将有效的集群骨骼存储在一个数组中,然后可以从那里访问这些骨骼。
![](https://cdn.80.lv/api/upload/content/a1/images/609277b65cb6b/widen_920x0.jpg)
在构建蓝图中,我使用这些骨骼位置和一些矢量数学来创建朝向集群的程序样条。这些样条用于为火箭创建路径。这在迭代模拟时非常有用,因为我不必为每次迭代手动替换样条。
![](https://cdn.80.lv/api/upload/content/78/images/60927796d8877/widen_920x0.jpg)
然后在此演示中的游戏时间内,控件蓝图每隔几秒钟随机选择此数组中的一个骨骼,并将所选骨骼发送到动画蓝图。将骨骼名称发送到动画蓝图后,该骨骼符合状态机的规则,因此激活集群动画。然后控制蓝图生成所需的视觉效果作为爆炸和相机抖动。
![](https://cdn.80.lv/api/upload/content/0d/images/609277bac95a2/widen_920x0.jpg)
我认为建立这个通信管道是这个工作流程中最困难的挑战。并且需要多次迭代才能顺利进行。
未来的计划
目前,我正在探索多种方法来应用我所使用的方法。我想出了一个原型,表明破坏构建集群并不是你可以用这个工作流程做的唯一事情。
![](https://cdn.80.lv/api/upload/content/e4/images/6092782a9e4b2/widen_920x0.jpg)
在这个原型中,我创建了一座桥梁的 RBD 模拟,然后将整个桥梁划分为集群。然后在 Unreal 中,我不是随机激活这些集群,而是检查玩家到集群的距离,然后如果集群在设定范围内,则播放 RBD 模拟的逆过程。
![](https://cdn.80.lv/api/upload/content/eb/6092783009f0f.gif)
构建集群和此工作流中的整体破坏模拟都是预先烘焙的,但它们可以在引擎内进行部分操作,例如反转或改变其速度。当前工作流程最突出的地方是控制何时以及应该播放模拟的哪个部分。
我仍然想探索和测试多个场景。例如,添加动画阶段、在游戏事件期间创建样条线,或将其与动画与虚幻中的物理资源相结合。
![](https://cdn.80.lv/api/upload/content/eb/6092783e9705d.gif)
后记
我要感谢 80 Level 让我有机会展示和分享我的作品。这个项目对我来说是一次非常好的学习经历,我仍然想继续努力以扩展和检查它的局限性。此外,对于未来的项目,我想继续探索不同的 Houdini 动态求解器,并在 Unreal 中扩展我的蓝图知识。
对于任何不熟悉 Houdini 动态或一般 Houdini 的人,我建议从简单开始并从那里扩展。探索Bubble Pins、Simon Houdini和Entagma等 YouTube 频道对我学习和理解 Houdini 有很大帮助。