news 2026/10/6 18:36:51

glTF 2.0 扩展 MPEG_mesh_linking 详解:通过 Shadow Mesh 驱动网格变换与动画

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
glTF 2.0 扩展 MPEG_mesh_linking 详解:通过 Shadow Mesh 驱动网格变换与动画
  • 图形学

【免费下载链接】glTF

glTF – Runtime 3D Asset Delivery

项目地址:https://gitcode.com/gh_mirrors/gl/glTF
点击查看免费下载

MPEG_mesh_linking是 glTF 2.0 扩展注册表中的一项 Vendor 扩展,由 ISO/IEC SC29 WG3(MPEG Systems)场景描述工作组提出,用于在一个 glTF 资产中把"依赖网格"(dependent mesh)与"阴影网格"(shadow mesh)建立逻辑链接,使依赖网格能够复用阴影网格的变换与动画。阅读本文后,你将掌握该扩展的设计动机、correspondence/mesh/pose/weights四个核心属性的语义与数据类型约束,理解它如何与 glTF 2.0 的accessor、morph target 等核心机制协同工作,并能在自己的资产中正确声明与校验这一扩展。

扩展背景:MPEG-I 场景描述中的网格复用需求

MPEG_mesh_linking建立在 ISO/IEC FDIS 23090-14 中,它与MPEG_accessor_timed、MPEG_animation_timing、MPEG_audio_spatial、MPEG_buffer_circular、MPEG_media、MPEG_scene_dynamic、MPEG_texture_video、MPEG_viewport_recommended等一同被列为 Vendor 扩展,覆盖了动态场景、时序访问、媒体与音频等沉浸式场景描述所需的增强能力。

在沉浸式媒体(如 MPEG-I 的 6DoF 视频、交互式场景)中,一个常见的需求是:同一份网格数据需要以多种方式被复用或驱动。例如,一个高精度的依赖网格希望"跟随"另一个由动画或变换驱动的网格一起运动,而不必重复存贮或重复驱动其变换。MPEG_mesh_linking正是为这一需求提供标准的声明方式——它不修改 glTF 2.0 核心的数据模型,而是在现有mesh对象之上增加一个逻辑链接层。

核心概念:Shadow Mesh 与 Dependent Mesh

扩展 README 的 Overview 部分给出了两个关键角色:

  • 阴影网格(shadow mesh):指 glTF 资产中普通、常规的网格数据,它本身不携带MPEG_mesh_linking扩展,完全符合 glTF 2.0 核心规范的定义。它的作用相当于"驱动源"——承载可供依赖网格复用的变换或形变信息。
  • 依赖网格(dependent mesh):指携带了MPEG_mesh_linking扩展的网格。扩展通过引用阴影网格并附带对应的数据缓冲区,使依赖网格能够"依靠"(rely on)阴影网格完成变换或动画。

换句话说,阴影网格作为辅助角色存在于 glTF 资产中,其唯一使命就是帮助实现对依赖网格的变换施加(application of transformation onto the dependent mesh)。扩展本身不引入新的渲染语义,而是建立一条"链接",并指明驱动这条链接所需的数据存放位置。

从 JSON Schema 的顶层描述(MPEG_mesh_linking.schema.json)可以印证这一点——其 description 即为 "glTF extension to specify a logical link between two meshes",即"指定两个网格之间逻辑链接的 glTF 扩展"。

扩展属性详解

扩展挂载在mesh对象的extensions对象之下,其声明结构如下表(摘自 README 的属性表,并对照 Schema 补充了默认行为):

属性类型说明是否必需
correspondenceinteger引用一个accessor(accessors 数组中的索引),其缓冲区存放依赖网格与关联阴影网格之间的对应值(correspondence values)✅ 是
meshinteger引用阴影mesh(meshes 数组中的索引),即与依赖网格建立对应关系的目标网格✅ 是
poseinteger引用一个accessor,其缓冲区存放与依赖网格关联的节点的变换(pose)✅ 是
weightsinteger引用一个accessor,其缓冲区存放应用于阴影网格 morph targets 的"权重"否
extensionsobject扩展专属对象的 JSON 对象否
extrasany应用自定义数据否

Schema 中明确声明"required": [ "correspondence", "mesh", "pose" ],即前三者是扩展可用的强制字段,weights为可选字段;同时遵循 glTF 扩展惯例允许附加属性(additional properties allowed)。三个integer类型的属性均通过glTFid.schema.json约束,其最小值为>= 0,与 glTF 2.0 中所有 ID 型字段的约定一致(见 glTFid.schema.json)。

correspondence:定义网格间的对应关系

correspondence通过指定accessors数组中的索引来引用一个accessor,该 accessor 描述的缓冲区中存放"依赖网格与其关联阴影网格之间的对应值"。这条对应关系是扩展能够工作的基础——它回答了"依赖网格的哪些部分对应阴影网格的哪些部分"这一问题。

在数据类型上有明确约束:

  • type必须为SCALAR(标量);
  • componentType必须符合 ISO/IEC 23090-14:7.4 的规定(具体枚举由该国际标准定义,本扩展规范不另行放开)。

这意味着对应值以标量形式按序遍历存放在 buffer 中,其数量与网格顶点/图元数相对应,消费端据此建立两网格之间的索引映射。

mesh:指定阴影网格

mesh通过指定meshes数组中的索引来引用阴影网格。被引用的网格本身是普通 glTF 2.0 网格(不带本扩展),其结构遵循 mesh.schema.json:包含一个或多个primitives(每个 primitive 由attributes及可选的indices、material、mode、targets构成),并可选地携带weights数组(对应 morph targets 的默认权重)。

依赖网格与阴影网格之间可以处于不同的节点层级——扩展只负责声明"链接关系",阴影网格的节点变换或动画驱动由pose字段引用的数据体现。

pose:提供依赖网格的变换数据

pose通过指定accessors数组中的索引来引用一个accessor,该 accessor 描述的缓冲区存放"与依赖网格关联的节点的变换"。这些变换数据是驱动依赖网格位置、朝向、缩放的直接来源,可以来自阴影网格的动画采样结果,也可以是运行期动态计算的节点姿态。

数据类型约束非常明确:

  • componentType必须为FLOAT(即常量 5126,见 accessor.schema.json);
  • type必须为MAT4(4×4 变换矩阵)。

每个节点对应一个 4×4 齐次变换矩阵,因此该 accessor 的count应等于需要驱动的节点数量,其bufferView与byteOffset遵循核心规范中 accessor 的对齐与偏移规则。

weights:驱动阴影网格的 Morph Targets(可选)

weights是唯一可选的数值字段,通过引用一个accessor,使其缓冲区存放"应用于阴影网格 morph targets 的权重"。这是为了支持这样一种场景:依赖网格不仅要跟随阴影网格的刚体变换,还要驱动阴影网格上的变形目标(morph targets)——即利用阴影网格的形变来带动依赖网格的形变。

其数据类型约束为:

  • componentType必须为FLOAT;
  • type必须为SCALAR。

权重值的个数应与阴影网格 morph target 的数量一致——这与 glTF 2.0 核心规范中 mesh.schema.json 对顶层weights数组的约定("数组元素数量必须与 morph targets 数量一致")相呼应;阴影网格 morph targets 本身在 mesh.primitive.schema.json 中由targets数组定义,每个 target 以POSITION、NORMAL、TANGENT语义映射到位移 accessor。当weights缺省时,可回退到阴影网格自身的 morph target 权重(即 mesh 顶层weights属性)。

extensions 与 extras

与 glTF 2.0 所有对象一致(参考 glTFProperty.schema.json 的扩展机制说明),MPEG_mesh_linking自身也预留了:

  • extensions:object类型,允许在扩展内部再嵌套其他扩展专属数据(如与MPEG_animation_timing等 MPEG 系列扩展联动);
  • extras:any类型,用于存放应用自定义数据,不会影响扩展语义。

两者均为可选,Schema 中对应"extensions": {}、"extras": {}的宽松声明。

资产声明示例

下面是一个基于 MPEG_mesh_linking.schema.json 字段约束构造的示意性 glTF 片段,用于说明扩展在 JSON 资产中的挂载方式(具体索引与 buffer 布局需按实际资产填充):

{ "asset": { "version": "2.0" }, "extensionsUsed": [ "MPEG_mesh_linking" ], "meshes": [ { "name": "shadowMesh", "primitives": [ { "attributes": { "POSITION": 0, "NORMAL": 1 }, "targets": [ { "POSITION": 2 } ] } ], "weights": [ 0.0 ] }, { "name": "dependentMesh", "primitives": [ { "attributes": { "POSITION": 3, "NORMAL": 4 } } ], "extensions": { "MPEG_mesh_linking": { "correspondence": 5, "mesh": 0, "pose": 6, "weights": 7 } } } ], "accessors": [ { "bufferView": 0, "componentType": 5126, "count": 4, "type": "VEC3" }, { "bufferView": 1, "componentType": 5126, "count": 4, "type": "VEC3" }, { "bufferView": 2, "componentType": 5126, "count": 4, "type": "VEC3" }, { "bufferView": 3, "componentType": 5126, "count": 4, "type": "VEC3" }, { "bufferView": 4, "componentType": 5126, "count": 4, "type": "VEC3" }, { "bufferView": 5, "componentType": 5126, "count": 4, "type": "SCALAR" }, { "bufferView": 6, "componentType": 5126, "count": 1, "type": "MAT4" }, { "bufferView": 7, "componentType": 5126, "count": 1, "type": "SCALAR" } ] }

要点说明:

  • 扩展名称MPEG_mesh_linking必须出现在顶层extensionsUsed数组中(若加载器不支持即无法正确驱动依赖网格,则还应列入extensionsRequired,参见 扩展注册表的机制说明);
  • mesh指向meshes[0](阴影网格),而扩展本身挂载在meshes[1](依赖网格)上;
  • correspondence(SCALAR)、pose(FLOAT + MAT4)、weights(FLOAT + SCALAR)三个 accessor 的数据类型严格遵守扩展规范;
  • 若资产未提供weights,则可回退使用阴影网格顶层weights数组驱动其 morph targets。

工作机制与典型使用流程

综合扩展概述与字段语义,依赖网格的驱动链路可以概括为:

  1. 声明链接:在依赖网格的extensions.MPEG_mesh_linking中,通过mesh字段指向阴影网格,建立两网格之间的逻辑链接;
  2. 建立对应:通过correspondence引用的 SCALAR accessor,读取依赖网格与阴影网格之间的顶点/元素对应值,确定变换的施加范围与映射方式;
  3. 提供姿态:通过pose引用的 FLOAT/MAT4 accessor,获取与依赖网格关联节点的 4×4 变换矩阵。这些矩阵可由阴影网格节点动画、MPEG 系列时序扩展或运行期逻辑产生,依赖网格据此完成位姿同步;
  4. 驱动形变(可选):当阴影网格定义了 morph targets 时,通过weights引用的 FLOAT/SCALAR accessor 提供变形权重,使依赖网格同步跟随阴影网格的形变;
  5. 渲染消费:运行期(渲染器 / 播放器)将上述变换与形变作用到依赖网格上,实现"复用一个网格的动画驱动另一个网格"的效果。

已知实现与生态状态

  • Known Implementations:README 中列出的已知实现为 ISO/IEC WD 23090-24(《Coded representation of immersive media — Part 24: Conformance and Reference Software for Scene Description for MPEG Media》),即 MPEG 场景描述的一致性测试与参考软件,用于验证该扩展等 MPEG 系列扩展的实现是否符合规范。
  • 注册表状态:在本仓库的 扩展注册表 中,MPEG_mesh_linking被列为Vendor 扩展(Vendor 前缀,不属 Khronos IP 框架覆盖),与其余 MPEG 系列扩展并列。它面向 MPEG-I 沉浸式媒体场景描述这一特定领域,并非通用渲染引擎的普遍依赖项。

兼容性与注意事项

  • 依赖版本:扩展针对 glTF 2.0 规范编写,所有引用对象(accessors、meshes)均遵循 glTF 2.0 核心 schema;
  • 扩展前缀与命名:MPEG前缀是经注册的厂商前缀(见 Prefixes.md),名称遵循<PREFIX>_<scope>_<feature>的推荐结构;
  • 加载器行为:若加载器不支持本扩展,依赖网格将无法正确获得变换/形变驱动。是否将其列入extensionsRequired取决于资产作者——若缺少该扩展会导致资产无法按预期渲染,则必须列入;若存在可接受的核心 glTF 回退表现,则仅需列入extensionsUsed;
  • 数据合规:correspondence的 componentType 由 ISO/IEC 23090-14:7.4 另行规定,pose/weights必须为FLOAT,对应type分别为MAT4/SCALAR,资产制作时应严格遵循,否则将无法通过参考软件(ISO/IEC 23090-24)的一致性验证。

延伸阅读

  • 扩展规范全文:extensions/2.0/Vendor/MPEG_mesh_linking/README.md
  • JSON Schema:extensions/2.0/Vendor/MPEG_mesh_linking/schema/MPEG_mesh_linking.schema.json
  • glTF 2.0 扩展注册表:extensions/README.md
  • 核心 accessor 定义:specification/2.0/schema/accessor.schema.json
  • 核心 mesh 与 morph targets 定义:specification/2.0/schema/mesh.schema.json、specification/2.0/schema/mesh.primitive.schema.json
  • 底层标准依据:ISO/IEC FDIS 23090-14(Scene Description)、ISO/IEC WD 23090-24(Conformance and Reference Software for Scene Description)

本扩展的完整使用语义(特别是correspondence的具体对应规则与componentType枚举)由 ISO/IEC 23090-14 标准正文定义,仓库内文档与 Schema 仅提供 glTF 集成层面的声明与约束;生产环境落地时,建议结合 MPEG 场景描述参考软件进行一致性验证。

  • 图形学

【免费下载链接】glTF

glTF – Runtime 3D Asset Delivery

项目地址:https://gitcode.com/gh_mirrors/gl/glTF
点击查看免费下载
上一篇:如何快速集成UIScrollView-InfiniteScroll?3分钟实现iOS列表无限加载
下一篇:3步掌握CDS API:Python气候数据下载终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 18:29:56

工业测距传感器选型实战:激光/超声波/毫米波三大方案深度对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 18:29:23

Type-C线材故障根因:CC引脚与E-MARK芯片深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 18:27:31

AP6256 WiFi蓝牙模块PCB设计实战:布局布线、阻抗与接地全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 18:27:08

ESP32-P4电源域与高速信号设计实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华