如果你熟悉将 3D 资源导出到游戏引擎的过程,那么无疑也会熟悉 3D 资源的 PBR 和 GLB 导出过程。 这是我们之前概述的内容,也是我们交互式工作的所有资产准备的基石。
然而,从传统的管道意义上来说,能够用元数据标记网格有很多逻辑,以便可以通过代码以某种方式处理它们。
好处如下:
- 你可以轻松设置更复杂的行为。
- 你可以将文本、链接或任何其他自定义数据(例如 JSON 架构)嵌入到各个网格中。
- 你可以标记单个资源中的网格组。
- 你不受对象命名更改的束缚,因此强大的创建管道也不需要按部件名称过滤对象。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割
1、Babylon 的标签机制
Babylon 中的标签非常有用,也是我们使用的东西,但它是在运行时使用的。 您仍在对对象进行过滤或排序到数组中,或者在创建对象时进行添加。 GLB 元数据使我们可以选择将数据保存到资产模型本身中。
我们使用 3dsMax 来准备我们的资源,工具和过程是我们之前介绍过的。 我们的 Github 存储库中有一些用于此目的的工具。
Babylon.js 是一个很棒的 WebGL 平台,也是我们喜欢用于交互式项目的平台。 因此,通过为 3dsMax 编写一个工具脚本来添加元数据预导出来添加到工具集中是有意义的,这样结构就可以由项目负责人或 TD 定义,并且可以为开发人员提供一个包含大量选项的模型。 保持相同的嵌入数据格式,你可以交换模型并在应用程序之间具有类似的功能,几乎不需要任何代码重构。
我们将在示例中使用此模型,即 Draco 编码的叉车动画。
2、设置自定义元数据属性
提取 GLTF 工具存储库后,你将可以访问属性工具。 这是使用默认属性设置的,该属性应该可以处理几乎大多数标记网格体的场景。
_attr
文件夹保存默认属性 - 如果你了解一些脚本,可以构建任意数量的自定义属性类型来保存任何级别的数据,甚至只是一些自定义值。
在 3dsMax 中,你可以将属性批量添加到每个对象。 要使用它,请运行babylonMetadata.ms 脚本文件。 你可以将它们添加到 #userscripts
目录中,但它将从任何地方运行。
元数据脚本会将相同的属性参数添加到每个网格的基础对象上 - 它是一个映射函数,因此它将循环选择来执行此操作。
你可以单独选择每个对象并自定义数据,也可以使用以下函数整体选择 -
SetBabylonMetadataOnSelection()
将特定网格设置为触发对象
其他子网格可以用不同的属性进行标记,以便在运行时自动过滤它们并向它们附加任何额外的数据 -
我将 HUD 动画设置为不同的 MeshID,因为我可以将其添加到发光层
完成此操作后,你可以运行导出器并以通常的方式保存,你将能够看到导出器在日志中正确添加元数据 -
请记住,Babylon 导出器仅添加到网格中!
导出网格体将带有此附加属性
3、验证嵌入的元数据
此沙箱提供了带有嵌入式元数据的 GLB 的简单示例。
这是检索元数据的代码 -
meshTask.onSuccess = function (task) { task.loadedMeshes.forEach(meshPart => { // check for metadata on the meshestry {console.log( “Custom Metadata Mesh — “ , meshPart.name , meshPart.metadata.gltf.extras);} catch (error) {console.log( “Null Objects”, meshPart.name); }}); }
我们可以在 Chrome 控制台中看到我们如何获得所有对象的良好数据集。
我希望这可以很好地概述如何使用 Babylon.js 导出器将数据嵌入到外部网格中。 如果需要更多信息,请参阅帮助文档中存储的信息,正是这个信息真正触发了整个过程。
原文链接:Babylon读取GLB元数据 - BimAnt