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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值