MetaCore/docs/designs/metacore-gltf-glb-importer-design.md

9.2 KiB
Raw Blame History

MetaCore glTF/glb 首批导入器设计

生成时间2026-03-28
状态:草案
范围M2 资源与模型导入循环

目的

这份文档用于明确 MetaCore 第一阶段首批生产级模型导入器为什么优先选择 glTF/.glb,以及这条导入链应该如何设计。

它要解决的问题不是“能不能识别扩展名”,而是:

  • glTF/.glb 导入后要产出哪些 MetaCore 资产
  • 模型节点层级如何进入场景或资源系统
  • 材质和贴图如何抽取
  • 重导入如何保持资源身份稳定
  • 第一阶段哪些能力必须做,哪些应后置

结论先说

MetaCore 第一阶段首批真正应做成生产级闭环的模型导入格式,应明确为:

P0glTF/.glb

不是因为它覆盖一切,而是因为它最适合作为:

  • 第一阶段材质系统的起点
  • 第一阶段模型导入工作流的基线
  • 第一阶段数字孪生项目资产导入的主格式

FBX 很重要,但不应该先拿来卡死整个导入架构。

为什么 glTF/.glb 应该是第一优先级

1. 更适合现代 PBR 工作流

第一阶段 MetaCore 已经确定:

  • 材质层先走基础 PBR
  • shader 后端先接 panda3d-simplepbr

在这个前提下,glTF/.glb 的材质语义更接近第一阶段目标:

  • BaseColor
  • Metallic
  • Roughness
  • Normal
  • Emissive
  • DoubleSided
  • AlphaMode

这比先做 FBX 的材质归一化成本更低,也更稳。

2. 对引擎资源化更友好

MetaCore 第一阶段不是只想“显示模型”,而是要把模型转成:

  • Mesh Asset
  • Material Asset
  • Texture Asset

glTF/.glb 更适合做这种规范化导入起点。

3. 更适合做第一条闭环

第一阶段的目标不是“支持格式列表尽量长”,而是先让至少一种格式形成真正可用闭环:

导入
  -> 生成正式资源
    -> 放进场景
      -> 保存
        -> 重新打开
          -> Player 正确渲染

glTF/.glb 是最适合先把这条链打通的格式。

第一阶段范围

必须完成

  • .glb 导入
  • .gltf + 外部贴图/二进制 导入
  • Mesh 解析
  • 节点层级解析
  • Material 解析
  • Texture 引用抽取
  • 生成 MetaCore Mesh / Material / Texture 资产
  • 生成导入元数据
  • 支持重新导入

可以后置

  • 动画
  • 蒙皮
  • Morph Targets
  • 相机导入
  • 灯光导入
  • 扩展插件全量支持
  • 非标准材质扩展的完整支持

第一阶段要非常克制,只先把静态模型和基础材质工作流做硬。

导入器总链路

flowchart LR
    A[".glb / .gltf"] --> B["glTF 导入器"]
    B --> C["导入结果文档"]
    C --> D["Mesh Assets"]
    C --> E["Material Assets"]
    C --> F["Texture Assets"]
    C --> G["Model/Node 描述"]
    D --> H["Asset Database"]
    E --> H
    F --> H
    G --> H

第一阶段推荐输出资产

导入一个 glTF/.glb 文件后,第一阶段至少应输出:

  • 一个导入元数据文档
  • 零个或多个 Mesh Asset
  • 零个或多个 Material Asset
  • 零个或多个 Texture Asset
  • 一个模型节点描述文档或模型资源文档

为什么要有“模型节点描述文档”

因为静态模型导入不只是生成网格和材质,还要保留:

  • 原始节点层级
  • 节点名称
  • 节点局部变换
  • 节点到 Mesh 的关系

如果没有这层,后面把模型拖进场景时就只能变成一个平面资源引用,无法还原源模型结构。

第一阶段推荐的导入输出结构

1. MetaCoreImportedAssetDocument

继续作为导入来源的基本记录,表达:

  • 源文件路径
  • 导入器 ID
  • 源文件 Hash
  • 资产类型

2. MetaCoreGltfModelImportDocument

建议新增一份导入结果文档,专门记录:

  • 源模型名称
  • 生成的 Mesh Asset 列表
  • 生成的 Material Asset 列表
  • 生成的 Texture Asset 列表
  • 节点层级描述

这份文档的作用是:

  • 为重导入提供稳定参照
  • 为调试提供可读结构
  • 为“拖入场景时生成对象树”提供输入

3. Mesh Asset

每个 glTF mesh primitive 或合并策略后的 mesh 生成正式 Mesh Asset

4. Material Asset

每个 glTF material 生成正式 Material Asset

5. Texture Asset

对被材质引用的贴图生成正式 Texture Asset

节点层级映射规则

这是第一阶段必须明确的设计点。

规则 1保留源节点层级

导入后应保留:

  • 节点名称
  • 父子关系
  • 局部变换

因为工业场景模型常常天然依赖节点组织来表达:

  • 设备结构
  • 部件结构
  • 装配关系

规则 2节点和 Mesh 资源分离

节点不是网格本身。

建议做法是:

  • 节点文档保存树结构
  • 节点引用 Mesh Asset
  • 节点再引用默认材质槽资源

规则 3拖入场景时由模型节点文档实例化对象树

也就是说:

  • 源文件导入阶段不直接生成 Scene 对象
  • 只有当用户将模型资源放入场景时,才根据节点描述生成 GameObject

这样资源与场景的边界更清楚。

材质抽取规则

第一阶段应按 glTF 的标准 PBR metal-rough 语义归一化。

应抽取的字段

  • baseColorFactor
  • baseColorTexture
  • metallicFactor
  • roughnessFactor
  • metallicRoughnessTexture
  • normalTexture
  • emissiveFactor
  • emissiveTexture
  • occlusionTexture
  • alphaMode
  • alphaCutoff
  • doubleSided

第一阶段允许简化的点

  • 不追求所有扩展都支持
  • 不追求材质表现完全等价
  • 对复杂扩展给出 warning 即可

重点是输出统一、稳定的 MetaCore 材质资源。

贴图抽取规则

第一阶段应支持:

  • 嵌入式贴图
  • 外部文件贴图引用

导入后应生成正式 Texture Asset,而不是只保留源贴图路径字符串。

建议记录的信息

  • 来源 URI 或 bufferView
  • 目标纹理资源 GUID
  • 使用场景
  • 原始色彩空间推断结果

色彩空间建议

第一阶段至少做最基本区分:

  • BaseColor / EmissivesRGB
  • Normal / MetallicRoughness / AOLinear

重导入策略

这块必须第一阶段就定清楚。

目标

重导入后尽量保持:

  • Mesh 资源 GUID 稳定
  • Material 资源 GUID 稳定
  • Texture 资源 GUID 稳定

否则场景和 prefab 的引用会断。

推荐策略

第一阶段建议基于“稳定导出键”进行匹配,例如:

  • 源文件 GUID
  • 节点路径
  • mesh primitive 索引
  • material 名称或导出索引
  • texture 名称或导出索引

生成一套稳定导入键,再映射到已有资源 GUID。

第一阶段允许的限制

如果源文件结构变化过大,第一阶段允许:

  • 资源重建
  • 给出明确 warning

但默认路径应尽量保住已有 GUID。

失败模式与诊断

第一阶段至少要覆盖这些失败模式:

  • 文件损坏或不是合法 glTF
  • 外部贴图丢失
  • 顶点数据不完整
  • 节点引用丢失
  • 材质参数无法识别
  • 重导入时键冲突

对于这些问题,至少应在:

  • Import Console
  • Asset 日志
  • 导入结果摘要

中给出可定位提示。

第一阶段 Inspector / Project 工作流影响

导入这条线做完后,编辑器应至少能:

  • 在 Project 面板看到导入得到的模型相关资产
  • 区分源文件与生成资源
  • 查看模型资源包含多少 Mesh / Material / Texture
  • 将模型资源拖入场景
  • 在 Inspector 查看材质槽与 Mesh 引用

否则导入链就还没有真正进入生产工作流。

推荐实现顺序

建议按下面顺序推进:

  1. 选定 glTF 解析库和接入方式
  2. 建立 glTF 导入器 骨架
  3. 先打通 .glb 单文件导入
  4. 打通 .gltf + 外部资源 导入
  5. 生成 Mesh / Material / Texture 正式资源
  6. 生成模型节点描述文档
  7. 支持拖入场景生成对象树
  8. 支持重导入
  9. 补错误诊断与测试

测试建议

第一阶段至少要有下面几类样例:

  • 单网格、单材质
  • 多 SubMesh、多材质
  • 带法线贴图
  • 带 emissive
  • 带透明模式
  • 带外部贴图引用
  • 节点层级多层嵌套

必测项

  • 导入成功
  • 资产数量正确
  • 材质参数映射正确
  • 节点层级正确
  • 重新导入后 GUID 尽量保持稳定
  • 场景引用后保存/重开仍然有效
  • Player 渲染结果基本正确

与其他文档的关系

这份文档是下面几份文档的具体化:

它负责把“首批格式”和“首批导入器”真正定成一个可执行方向。

最终建议

第一阶段不要追求“支持所有模型格式”,而要追求:

glTF/.glb 做成真正的生产级基线导入格式。

只要这条线做实MetaCore 就会第一次真正拥有:

  • 模型导入
  • 材质抽取
  • 层级保留
  • 资源生成
  • 场景实例化
  • 打包运行

这一整套能支撑工业数字孪生项目开发的基础内容工作流。