gltf教程系列-glTF的基本结构(二)
glTF的核心是一个JSON文件。该文件描述了3D场景的全部内容。它由场景结构本身的描述组成,它由定义场景图的节点层次结构给出。场景中出现的3D对象是使用附加到节点的网格定义的。材质定义对象的外观。动画描述3D对象如何随时间变换(例如,旋转到平移),并且外观定义如何基于骨架姿势变形对象的几何形状。摄像机描述渲染器的视图配置。
JSON结构
场景对象存储在JSON文件中的数组中。可以使用数组中相应对象的索引访问它们:
"meshes" :
[
{ ... }
{ ... }
...
],
这些索引还用于定义对象之间的关系。上面的示例定义了多个网格,并且节点可以使用网格索引引用其中一个网格,以指示网格应该附加到此节点:
"nodes":
[
{ "mesh": 0, ... },
{ "mesh": 5, ... },
...
}
下图(改编自glTF概念部分)概述了glTF结构的JSON部分的顶级元素:
这里简要概括这些元素,并给出glTF规范各个部分的链接。以下各节将更详细地解释这些元素之间的关系。
scene
是存储在glTF的场景描述的入口点。它指的是定义场景图的节点(s)。node
是场景图层次结构中的一个节点。它可以包含变换(例如旋转或平移),并且它可以指代其他(子)节点。另外,它可以指代附着”到节点的mesh
或camera
“实例,或者描述网格变形的skin
。camera
定义了用于渲染场景视图的配置。mesh
描述了场景中出现的几何对象。它指的是用于访问实际几何数据的accessor
对象,以及在呈现对象时定义对象外观的material(
s)。skin
定义了顶点蒙皮所需要的参数,这允许基于虚拟角色姿态的mesh的变形。这些参数的值来自accessor
。animation
描述了某些节点随着时间的变化如何转变(例如,旋转或平移)。accessor
被用作任意数据的抽象源。它由mesh
,skin
和animation
所使用,并提供几何数据、蒙皮参数和时间相关的动画值。它指的是bufferView
,bufferView
是包含实际原始二进制数据的buffer
的一部分。material
包含定义对象的外观的参数。它通常指的是将应用于渲染几何体的texture
对象。texture
由sampler
和image
定义。sampler
定义了纹理、image
如何
放置在物体上。
参考外部数据
二进制数据(如3D对象的几何和纹理)通常不包含在JSON文件中。相反,它们存储在专用文件中,而JSON仅包含这些文件的链接。这允许二进制数据以非常紧凑的形式存储,并且可以通过网络有效地传输。此外,数据以可直接在渲染器中使用的格式存储,无需解析,解码或预处理数据。
如上图所示,有两种类型的对象可能包含到外部资源的链接,即buffers
和images
。稍后将更详细地解释这些对象。
阅读和管理外部数据
读取和处理glTF结构从解析JSON结构开始。解析结构后,buffers
和images
数组顶级中的buffer
和image
对象就可以调用了。这些对象中的每一个指代二进制数据块。为了进一步处理,数据将被读入存储器。通常情况下,数据将被存储在一个阵列,这样就可以用指向的buffer
或image
对象相同的索引中查找到它们。
二进制数据 buffers
一个buffer
包含一个指向包含原始二进制缓冲区数据的文件的URI:
“ buffer01 ”: {
“ byteLength ”: 12352,
“ type ”: “ arraybuffer ”,
“ uri ”: “ buffer01.bin ”
}
这个二进制数据只是从buffer
的URI中读取的原始内存块,没有固有的含义或结构。 Buffers, BufferViews, and Accessors 部分将讲述这些原始数据是如何扩展数据类型和数据布局信息的。利用该信息,数据的一部分可以被解释为动画数据,而另一部分可以被解释为几何数据。以二进制形式存储数据比JSON格式存储能更有效地在网络中传输,并且二进制数据可以直接传递给渲染器而无需解码或预处理它。
Images中的图像数据
一个image
可以是指可用于作为再现对象的纹理的外部图像文件:
“ image01 ”: {
“ uri ”: “ image01.png ”
}
该引用以通常指向PNG或JPG文件的URI的形式给出。这些格式显著减小了文件的大小,因此网络可以更有效地传输它们。在某些情况下,image
对象可能不会引用外部文件,而是引用存储在buffer
文件中的数据。详细信息将在Textures, Images, and Samplers部分中进行说明。
数据URI中的二进制数据
通常,buffer
和image
对象中包含的URI 将指向包含实际数据的文件。作为替代方案,可以通过使用数据URI将数据以二进制格式嵌入到JSON中。