- 图形学
【免费下载链接】glTF
glTF – Runtime 3D Asset Delivery
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 补充了默认行为):
| 属性 | 类型 | 说明 | 是否必需 |
|---|---|---|---|
| correspondence | integer | 引用一个accessor(accessors 数组中的索引),其缓冲区存放依赖网格与关联阴影网格之间的对应值(correspondence values) | ✅ 是 |
| mesh | integer | 引用阴影mesh(meshes 数组中的索引),即与依赖网格建立对应关系的目标网格 | ✅ 是 |
| pose | integer | 引用一个accessor,其缓冲区存放与依赖网格关联的节点的变换(pose) | ✅ 是 |
| weights | integer | 引用一个accessor,其缓冲区存放应用于阴影网格 morph targets 的"权重" | 否 |
| extensions | object | 扩展专属对象的 JSON 对象 | 否 |
| extras | any | 应用自定义数据 | 否 |
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。
工作机制与典型使用流程
综合扩展概述与字段语义,依赖网格的驱动链路可以概括为:
- 声明链接:在依赖网格的
extensions.MPEG_mesh_linking中,通过mesh字段指向阴影网格,建立两网格之间的逻辑链接; - 建立对应:通过
correspondence引用的 SCALAR accessor,读取依赖网格与阴影网格之间的顶点/元素对应值,确定变换的施加范围与映射方式; - 提供姿态:通过
pose引用的 FLOAT/MAT4 accessor,获取与依赖网格关联节点的 4×4 变换矩阵。这些矩阵可由阴影网格节点动画、MPEG 系列时序扩展或运行期逻辑产生,依赖网格据此完成位姿同步; - 驱动形变(可选):当阴影网格定义了 morph targets 时,通过
weights引用的 FLOAT/SCALAR accessor 提供变形权重,使依赖网格同步跟随阴影网格的形变; - 渲染消费:运行期(渲染器 / 播放器)将上述变换与形变作用到依赖网格上,实现"复用一个网格的动画驱动另一个网格"的效果。
已知实现与生态状态
- 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
相关推荐
AVR-HAL核心组件解析:从通用抽象到Arduino专用实现
AVR HAL核心组件解析:从通用抽象到Arduino专用实现 AVR HAL是针对AVR微控制器的嵌入式硬件抽象层(HAL)实现,它基于 embedded h
嵌入式Unity轻量级网格动画库——Mesh-Animation
Unity轻量级网格动画库——Mesh Animation 1. 项目基础介绍 Mesh Animation 是一个开源项目,旨在为Unity开发提供一个轻量级
3D渲染图形学游戏开发Easy-Vibe 数据模型全景:文档、图、时序与向量四类模型的选型与实战
Easy Vibe 数据模型全景:文档、图、时序与向量四类模型的选型与实战 ::: tip 导读 本文是 Datawhale easy vibe 学习项目「5
图形学
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考