glTF学习笔记(2)——glTF Tutorials/Basic glTF Structure

本文深入探讨了glTF格式的3D模型结构,介绍了其核心组件,包括JSON结构、二进制数据处理、纹理及动画数据的管理。glTF通过高效的二进制数据存储和紧凑的JSON描述,实现快速加载和渲染。

https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_002_BasicGltfStructure.md

Table of Contents

The Basic Structure of glTF

The JSON structure

References to external data

Reading and managing external data

Binary data in buffers

Image data in images

Binary data in data URIs


The Basic Structure of glTF

glTF的核心是一个JSON文件。这个文件描述了三维场景的全部内容。它由对自身场景结构的描述组成,这个描述通过给出结点(nodes)的继承关系(hierarchy)来定义场景图(scene graph)。场景中的三维对象(3D objects)通过附加到nodesmeshes来定义。Materials定义对象的外观。Animation定义三维对象随时间的变换(比如旋转、翻转等)。Skins定义了对象是如何基于一个骨架(skeleton pose)进行几何形状的变形。Cameras描述了渲染器(renderer)的视图配置(view configuration)。

The JSON structure

场景对象存储在JSON文件的数组中,可以使用数组中各个对象的索引来对其进行访问:

"meshes" : 
[
    { ... }
    { ... }
    ...
],

 这些索引还用于定义对象间的关系。上面的代码片段定义了多个meshes,一个node可能会使用这些meshes中的一个。通过使用mesh的索引,可以说明哪个mesh应该绑定到node上:

"nodes": 
[
    { "mesh": 0, ... },
    { "mesh": 5, ... },
    ...
}

Image 1: The glTF JSON structure

  • scene是存储在glTF中整个场景描述的入口,它指向定义了场景图的结点node S。一个scene可以指向多个node,每个node又可以有子节点(children node)。
  • node是场景图层级结构中的一个结点。它可以包含一个变换(如旋转或翻转等),而且它可以指向其他子节点(nodes)。另外,一个node可以指向附加到该结点的mesh或camera实例,也可以指向skin,描述mesh的形变。
  • camera定义场景渲染时的视图配置(view configuration)。
  • mesh描述了一个场景中的几何对象。它会指向accessor对象和material。accessor对象用于获得具体的几何数据。material定义了渲染时对象的外观。
  • skin定义了vertex skinning需要的参数,使得mesh可以基于虚拟角色的姿势发生形变。这些参数的值是从accessor获得的。
  • animation描述了一定的nodes如何随时间变化发生变换。
  • accessor是任意数据(arbitrary data)的抽象源(abstract source)。mesh、skin、animation都需要用到它提供的几何数据(geometry data)、skinning parameters和基于时间的动画值(time-dependant animation values)。可以看到图1中,mesh、skin、animation都有箭头指向accessor。accessor会引用一个bufferView,一个bufferView是buffer的一部分,buffer包含了实际的原始二进制数据。
  • material包括了定义对象外观的参数。它通常引用texture对象,将其应用到渲染几何中。
  • texture通过一个sampler和一个image来定义。sampler定义纹理图像image应该如何放置在对象上。

References to external data

像三维对象的几何和纹理数据这样的二进制数据,通常不会包括在JSON文件中,而是将它们存储在专门的文件中,JSON部分仅包含指向这些文件的链接。这使得二进制数据以非常紧凑的形式存储,并且可以有效地通过web传输。另外,数据可以以渲染器可以直接使用的形式存储,不需要解析(parse)、解码(decode)或预处理(preprocess)数据。

Image 2: The glTF structure

从图2可以看到,有两类对象(buffers和images)有可能包含上述的链接,连接到外部资源。这在后面会更加详细地介绍。

Reading and managing external data

读取和处理glTF asset时,从解析JSON结构开始。成功解析结构后,buffer和image对象在通过顶层的buffers和images数组中各自可用(available好难翻译好诶!)。上述的每一个对象(buffer和image)都可能引用数个二进制数据块(block)。为了进一步处理,这些数据会被读入到存储器(memory)中。一般而言,会将数据存储在数据中,这样就可以通过一样的索引来查找它们,该索引可以被用于引用它们所属的buffer或image对象。

Binary data in buffers

buffer包含一个URI,该URI指向一个包含原始二进制缓冲区数据的文件:

"buffer01": {
    "byteLength": 12352,
    "type": "arraybuffer",
    "uri": "buffer01.bin"
}

该二进制数据只是从buffer的URI中读取的原始内存块,没有固有的含义或结构。“Buffers, BufferViews, and Accessors ”部分会说明如何利用关于数据类型和数据布局(byteLength、type等)的信息来扩展原始数据。利用该信息,数据的不同部分可以被解释成不同的含义。一部分数据可以被解释成动画数据(animation data,另一部分解释成几何数据(geometry data)。与JSON格式相比,以二进制形式存储数据可以使它在Web上的传输效率更高,并且可以将二进制数据直接传递到渲染器,而无需对其进行解码或预处理。

Image data in images

一个image可能引用一个外部的图像文件,这个图像用于说明渲染对象的纹理。

"image01": {
    "uri": "image01.png"
}

这里的引用以URI的形式给出,它通常会指向一个PNG或JPG文件。这些格式大大减小了文件的大小,可以在Web间高效地传输。在某些情况下,图像对象可能不会引用外部文件,而是引用存储在buffer中的数据。这种间接的引用在“Textures, Images, and Samplers ”中说明。

Binary data in data URIs

通常,包含在缓冲区和图像对象中的URI将指向包含实际数据的文件。 或者,可以通过使用数据URI(data URIs)将数据以二进制格式嵌入JSON。

<think>好的,我现在需要为用户详细解释glTF模型文件。首先,我得回忆一下自己对glTF的了解,确保信息准确。glTF是3D模型的开放标准格式,由Khronos Group维护,对吧?用户可能需要知道它的全称是GL Transmission Format,用于高效传输和加载3D场景。 接下来,我应该考虑用户的需求。他们可能是一名开发者或3D设计师,想要了解glTF的结构、优势以及应用场景。需要分点说明,结构要清晰。可能需要先介绍基本概念,然后逐步深入到技术细节。 关于结构部分,glTF采用JSON格式描述场景结构,包括节点、网格、材质、纹理等。同时,它使用二进制数据存储几何和动画数据,这样分开存储可以提高加载效率。这里要确保术语准确,比如提到.bin文件和图像文件的分开存储。 优势方面,需要强调高效性、跨平台支持、扩展性。比如,对比其他格式如FBX或OBJ,glTF更适合实时应用,如WebGL、游戏引擎。可能需要举例说明,比如在Three.js中的使用。 另外,扩展机制也是glTF的重要部分,允许添加自定义功能。例如,KHR_lights_punctual扩展支持点光源和聚光灯。这里需要确认扩展的具体例子是否正确,避免错误。 版本方面,glTF 1.0在2015年发布,2.0在2017年有重大更新,比如PBR材质的支持。要确保时间线正确,避免过时信息。 应用场景部分,可以提到Web3D、AR/VR、游戏开发,这些是glTF的主要应用领域。需要确认是否有最新的应用案例,比如微软的Babylon.js或Google的模型查看器是否支持glTF。 可能用户还想知道如何创建或转换glTF文件,可以提及工具如Blender的导出插件,或者在线转换工具如COLLADA2GLTF。这部分需要验证工具的当前支持情况,是否有更新或更好的替代方案。 需要检查是否有遗漏的重要点,比如glTF支持动画、蒙皮、变形目标等特性,以及其二进制格式如何优化加载性能。同时,是否需要提到glb格式,即二进制版本的glTF,将资源打包成单一文件,方便分发。 最后,要确保语言通俗易懂,避免过于技术化的术语,但作为详解,适当的专业术语是必要的。结构上使用分点和小标题,帮助用户快速浏览。检查是否有错误,比如版本日期是否正确,扩展名称是否准确,工具是否仍然有效。 总结一下,回答的结构应该是:概述、核心结构、核心优势、扩展机制、版本演变、应用场景、工具支持,可能再加上示例。需要确保每个部分的信息准确,必要时参考官方文档或可靠来源进行验证,避免传播错误信息。</think>以下是对glTF模型文件的详细解析: --- ### **一、基本概念** **glTF**(GL Transmission Format)是Khronos Group推出的开放标准3D模型格式,专为高效传输和实时渲染设计。其核心目标是成为“3D领域的JPEG”,适用于Web、移动端、游戏引擎等场景。 --- ### **二、核心结构** glTF文件采用模块化设计,主要包含以下部分: 1. **JSON描述文件** - 存储场景层级结构(节点、父子关系) - 定义网格(Mesh)、材质(Material)、纹理(Texture)、动画(Animation)等元数据 - 通过URI引用外部资源(二进制数据、贴图) 2. **二进制数据文件(.bin)** - 存储顶点坐标、法线、UV、动画关键帧等二进制数据 - 采用紧凑布局以减少文件体积 3. **图像文件** - 支持JPEG/PNG等标准格式 - 可内嵌为Base64字符串或独立文件 --- ### **三、核心优势** 1. **高效性** - 数据直接映射到GPU缓冲区,无需格式转换 - 支持Draco压缩(减少50-70%体积) 2. **跨平台兼容** - 被WebGL、OpenGL、Vulkan、DirectX等主流API支持 - 兼容Unity、Unreal、Blender、Three.js等工具 3. **扩展机制** - 通过`extensions`字段支持自定义功能(如:KHR_lights_punctual光源扩展) - 官方扩展库涵盖PBR材质、镜头光斑等高级特性 --- ### **四、技术特性** | 功能 | 描述 | |-------------------|----------------------------------------------------------------------| | **材质系统** | 基于物理渲染(PBR)金属粗糙度工作流,支持法线贴图、透明通道 | | **动画支持** | 关键帧动画、骨骼动画(蒙皮)、变形动画(Morph Target) | | **LOD机制** | 通过扩展支持多细节层次模型自动切换 | | **场景图** | 树状节点结构实现复杂对象变换(平移/旋转/缩放) | --- ### **五、版本演进** - **glTF 1.0** (2015):基础模型描述,无PBR支持 - **glTF 2.0** (2017):重大更新,引入PBR材质、规范二进制存储 - **glTF 3.0** (草案):实验性功能如实时全局光照支持 --- ### **六、典型应用场景** 1. **Web3D** - Three.js、Babylon.js等库直接加载glTF - Google搜索3D结果、电商商品展示 2. **游戏开发** - Unity通过`GLTFUtility`插件导入 - Unreal Engine原生支持 3. **AR/VR** - 微软Mixed Reality、Oculus Quest应用常用格式 --- ### **七、工具生态** | 类型 | 推荐工具 | |------------|--------------------------------------------------------------------------| | **建模** | Blender(导出插件)、Maya/3ds Max(官方插件) | | **转换** | `COLLADA2GLTF`、`FBX2glTF`、在线工具[glTF Viewer](https://gltf-viewer.donmccurdy.com/) | | **优化** | `glTF-Pipeline`(压缩/校验)、`gltfpack`(网格优化) | --- ### **八、示例文件结构** ```json // glTF 2.0示例 { "scenes": [{ "nodes": [0] }], "nodes": [{ "mesh": 0 }], "meshes": [{ "primitives": [{ "attributes": { "POSITION": 1, "NORMAL": 2 }, "indices": 0, "material": 0 }] }], "buffers": [ {"uri": "data.bin", "byteLength": 24576} ] } ``` --- ### **九、扩展学习** - 官方文档:[glTF Tutorial](https://github.com/KhronosGroup/glTF-Tutorials) - 示例仓库:[KhronosGroup/glTF-Sample-Models](https://github.com/KhronosGroup/glTF-Sample-Models) 通过glTF,开发者可以构建从移动端到高端PC的统一3D内容管线,是元宇宙、数字孪生等领域的基础技术之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值