几何体脚本用户指南

关于使用几何体脚本函数和蓝图节点的指南

Choose your operating system:

Windows

macOS

Linux

什么是几何体脚本?

几何体脚本(Geometry Script)是一种虚幻引擎插件,包含一组函数库,可供用户通过Blueprints和Python生成和编辑网格体几何体。

几何体脚本UFunction和蓝图节点将对UDynamicMesh对象进行运算,而这些对象使用FDynamicMesh3 C++三角形网格体数据结构创建。几何体处理(Geometry Processing)插件和建模编辑器模式(Modeling Editor Mode)使用的也是这种数据结构。

几何体脚本可以在编辑器工具控件和资产操作中用于创建自定义网格体分析/处理/编辑工具。它还可以在Actor蓝图中用来创建"流程性对象"和实现复杂几何查询。

几何体脚本有各种潜在用法:

  • 对第三方网格体导入程序进行测试和质量分析。

  • 分析网格体UV以识别存在纹理空间浪费的资产。

  • 使用脚本合并网格体资产以用于制片工作流程。

  • 流程性网格体Actor,例如Lyra示例游戏中使用的关卡设计工具对象。

DynamicMesh对象

几何体脚本会对多种新对象类型进行运算:

  • UDynamicMesh

  • UDynamicMeshComponent

  • ADynamicMeshActor

与静态网格体/StaticMeshComponent/StaticMeshActor架构相似,这些类并非几何体脚本插件的具体组成部分,而是位于几何体框架(Geometry Framework)引擎模块中,并可以独立于几何体脚本使用。

UDynamicMesh

启用几何体脚本的核心组件是 UDynamicMesh 对象。此UObject是未绑定到特定组件的网格体数据结构的容器。这与 UProceduralMeshComponent 等之前的虚幻引擎方法不同之处在于,网格体几何体可以在没有显式场景呈现的情况下进行创建和操控。

例如,UDynamicMesh可以基于 UStaticMesh 资产初始化、编辑,然后存储回资产中。此方法与编辑器工具控件一起提供用户界面,使技术美术师能够在Blueprint中自行创建拥有特定用途的网格体编辑工具,或通过Python为网格体资产的查询/编辑操作编写脚本。

其他各种编辑器网格体几何体类型也可以与UDynamicMesh相互转换,例如Gameplay体积。

DynamicMeshComponent

除了UDynamicMesh,UDynamicMeshComponent 也已提升为"真正"(非临时、可序列化)的组件。此组件本质上与UProceduralMeshComponent类似,但由UDynamicMesh提供支持,而后者可通过几何体脚本进行操控。

UDynamicMeshComponent在过去几年一直作为网格体建模工具集的一部分进行开发,一直用于提供网格体编辑的实时预览。与UProceduralMeshComponent类似,它支持更新网格体几何体,不仅仅是更新顶点属性,还要创建和修改整个网格体拓扑。这可以在编辑器中以及在运行时完成。支持光线追踪,但不支持Nanite和Lumen。

DynamicMeshActor

ADynamicMeshActor与AStaticMeshActor类似之处在于,它主要是UDynamicMeshComponent的容器。但是,DynamicMeshActor确实为想要基于UDynamicMesh实现流程性网格体生成的Actor蓝图提供了一些特定支持。

之前只能创建新StaticMesh资产的建模模式工具现在还可以创建新DynamicMeshActor,并且编辑工具可以编辑任一类型的网格体Actor(以及体积)。

GeneratedDynamicMeshActor

AGeneratedDynamicMeshActor是ADynamicMeshActor的子类,可为实现基于蓝图的流程性网格体Actor提供额外支持。具体来说,此类提供了函数 On Rebuild Generated Mesh ,该函数可以在BP子类中实现以生成网格体,而不必在构造脚本(Construction Script)中实现。这可提供更好的编辑器中交互性能,并为将来更细致地管理大规模流程性几何体的生成操作留下了空间。

GeneratedDynamicMeshActor目前只能在编辑器中使用。

UStaticMesh和UDynamicMesh的主要差别

不同于UStaticMesh,UDynamicMesh并不是资产。UDynamicMeshComponent"拥有"其UDynamicMesh,它不像UStaticMesh那样在多个组件之间共享。这意味着,实例化渲染是不可用的,等等。UStaticMesh将存储为组件(以及Actor)的一部分,类似于ProceduralMeshComponent。这意味着,网格体存储"在关卡中",而不是在单独的资产文件中。复制UDynamicMeshComponent将创建网格体的 副本 ,并且在关卡或项目之间传输的操作必须通过 复制粘贴 来完成。

在许多方面,UDynamicMeshComponent的行为在很大程度上更像DCC工具中的网格体对象,例如Autodesk 3ds Max、Autodesk Maya或Blender。这确实会带来潜在的问题,因为巨大的网格会显著增加关卡文件的大小。但是,通过一个Actor一个文件,网格体数据将存储在OFPA Actor文件中,而不是在关卡中(所以,数据仍有可能很大,但会在单独的文件中)。

几何体脚本函数/节点模式

大部分几何体脚本函数/节点遵循非常标准的模式,类似于如下所示的 Apply Mesh Plane Cut 节点。

第一个参数 目标网格体(Target Mesh) 是将由该操作编辑的UDynamicMesh。一般来说,几何体脚本操作会修改输入网格体,而不是创建新网格体,以避免创建多个临时网格体对象。输入UDynamicMesh也总是作为输出返回,也称为 目标网格体(Target Mesh)(相同的名称 == 相同的对象)。这样就很容易按顺序将多个操作串连起来。

几何体脚本节点有许多参数和设置。最常用的选项作为参数公开,但更多选项通过特定于操作的 选项(Options) 结构提供。要创建正确的选项(Options)结构,最常见的方法是拖移空的选项(Options)引脚。想修改默认值时才有必要进行此操作。此外,你还可以右键点击 选项(Options) 引脚,并使用 分割结构体引脚(Split Struct Pin) 上下文菜单项直接展开节点中的选项(Options)结构,如下所示。

大部分节点还有调试(Debug)引脚,用于为网格体生成器提供几何调试支持。这在目前尚未加以利用,只是未来功能的占位符。

使用UDynamicMesh池

你经常需要在网格体生成器内创建临时网格体,例如,创建要从"主"网格体中去掉的图元网格体。为此,需要一个临时的UDynamicMesh。虽然你可以使用ConstructObjectFromClass创建这样一个临时网格体,但如果这是在流程性生成器中创建的,该网格体必须在使用后进行垃圾回收。如果会频繁运行生成器,更高效的做法是,在不同运行之间复用该网格体。

DynamicMeshActor 使用UDynamicMeshPool对这种情况提供了内置支持。具体做法是,调用 AllocateComputeMesh 以获取临时网格体,然后在蓝图执行路径结束前的某个地方将其释放。每个临时网格体可以使用 ReleaseComputeMesh 显式释放,或通过调用 ReleaseAllComputeMeshes 来释放,后者将释放当前从池中分配的所有临时网格体。

在编辑器工具控件中,没有可从中分配网格体的默认DynamicMeshPool实例,但你可以使用 CreateDynamicMeshPool 创建一个实例(例如,作为编辑器工具控件或工具蓝图中的变量)。

使用Actor蓝图创建流程性网格体对象

如上所述,几何体脚本有一个令人兴奋的用例,即使用Actor蓝图创建流程性网格体"对象"。下面显示了使用BP子类 GeneratedDynamicMeshActor 的示例。On Rebuild Generated Mesh Event 用于填充 UDynamicMeshComponentUDynamicMesh几何体脚本引用中介绍了这些类。UDynamicMesh会传递到几何体脚本函数 Append Box ,后者会根据输入变量创建网格体。

下面的剪辑片段显示了使用此BP Actor的实例的一个例子,我们大体上是仅仅使用几个BP节点创建了一个参数化盒体图元网格体。添加更多节点后,我们可以直接在蓝图中构建越来越复杂的网格体生成器。当前的几何体脚本库包含用于生成和编辑网格体的150多个函数/节点。

procedural-box-example-2.gif

本文基于此前的虚幻引擎版本编写,未针对当前的虚幻引擎5.0版本更新过。