Table of Contents
Reading and managing external data
The Basic Structure of glTF
glTF的核心是一个JSON文件。这个文件描述了三维场景的全部内容。它由对自身场景结构的描述组成,这个描述通过给出结点(nodes)的继承关系(hierarchy)来定义场景图(scene graph)。场景中的三维对象(3D objects)通过附加到nodes的meshes来定义。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。
本文深入探讨了glTF格式的3D模型结构,介绍了其核心组件,包括JSON结构、二进制数据处理、纹理及动画数据的管理。glTF通过高效的二进制数据存储和紧凑的JSON描述,实现快速加载和渲染。
694

被折叠的 条评论
为什么被折叠?



