原文参考:https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_002_BasicGltfStructure.md
glTF的核心是JSON文件。此文件描述三维场景的全部内容。它包括了 场景(scene)结构本身,该描述由定义场景树(scene graph)的节点层次(node hierarchy)。场景中出现的三维对象是使用附着到节点的网格(Mesh)定义的。材质定义对象的外观。动画描述了随着时间的推移,三维对象是如何变换的(例如:旋转,平移),而皮肤定义了基于骨架姿势的对象几何体是如何变形的。摄影机描述渲染器的视图配置。
场景对象存储在JSON文件的数组中。可以使用数组中相应对象的索引来访问它们:
"meshes" :
[
{ ... }
{ ... }
...
],
这些索引还用于定义物体(object)之间的关系。上面的示例定义了多个网格,一个节点可以使用网格索引引用其中一个网格,以指示网格应附加到此节点:
"nodes":
[
{ "mesh": 0, ... },
{ "mesh": 5, ... },
...
}
The following image (adapted from the glTF concepts section) gives an overview of the top-level elements of the JSON part of a glTF asset:
下图(改编自glTF概念部分)概述了glTF文件中JSON部分的 顶层(top-level)元素:
这里将快速总结这些元素并提供概述,并链接到glTF规范的各个部分。以下章节将对这些元素之间的关系进行更详细的解释。
scene
(场景 )是存储在glTF中的场景描述的入口点。它是指定义场景图(scene graph)的节点(node)。node
(节点),是场景图层次中的一个节点。它可以包含一个矩阵转换(例如,旋转或平移),并且可以引用其他(子)节点。此外,它还可以“附加”上(通过引用节点的网格或摄影机实例),或指描述网格变形的蒙皮(skin)。camera
摄影机定义用于渲染场景的视图配置。mesh
网格描述出现在场景中的几何对象。它指用于访问实际几何数据的accessor
访问器对象,以及在渲染物体时定义其外观的材质。skin
蒙皮定义顶点蒙皮所需的参数,该参数允许基于虚拟角色的姿势变形网格。这些参数的值是从accessor
访问器获取的。animation
动画描述特定节点的变换(例如旋转或平移)如何随时间变化。accessor
访问器用作任意数据的抽象源。它被网格mesh
、蒙皮skin
和动画animation
使用,并提供几何体数据、蒙皮参数和与时间相关的动画值。它指向bufferView
,它是包含实际原始二进制数据的buffer
一部分。material
材质包含定义物体外观的参数。它通常指将应用于渲染几何体的纹理对象。texure
纹理 由采样器和图像定义。采样器sampler
将定义如何将纹理图像放置在物体上。二进制数据,如3D物体的几何样貌和纹理,通常不包含在JSON文件中。相反,它们存储在专用文件中,JSON部分只包含指向这些文件的链接。这允许二进制数据以非常紧凑的形式存储,并且可以通过web高效地传输。此外,数据可以以一种可以直接在渲染器(renderer)中使用,而无需解析、解码或预处理数据。
如上图所示,有两种类型的对象可能包含到外部资源的链接,buffers
缓冲区和 images
图像。稍后将更详细地解释这些对象。
读取和处理glTF格式首先要解析JSON结构。解析结构后,顶层缓冲区 buffers
和 images
图像数组中的缓冲区buffer
和图像 image
对象可用。这些对象中的每一个都可以引用二进制数据块。为了进一步处理,这些数据被读入存储器。通常,数据将存储在一个数组中,以便可以使用用于引用它们所属的缓冲区buffer
和图像 image
对象的相同索引来查找它们。
buffer
缓冲区包含了一个链接 URI ,指向了包含原始,缓冲区数据的二进制数据。
"buffer01": {
"byteLength": 12352,
"type": "arraybuffer",
"uri": "buffer01.bin"
}
二进制数据只是从缓冲区的URI读取的原始内存块,没有内在的含义或结构。Buffers
、BufferViews
和Accessors
部分将显示如何使用有关数据类型和数据布局的信息扩展此原始数据。例如,数据的一部分可以被解释为动画数据,而另一部分可以被解释为几何数据。将数据存储为二进制格式可以使其在web上传输比JSON格式高效得多,并且二进制数据可以直接传递到渲染器(renderer),而无需对其进行解码或预处理。
images
image
可以指向外部的图像文件,这个图像文件可以作为被渲染对象的纹理。
"image01": {
"uri": "image01.png"
}
该引用以通常指向PNG或JPG文件的URI形式给出。这些格式显著地减小了文件的大小,因此可以通过web高效地传输。在某些情况下,image
图像对象可能不是指向外部文件,而是指存储在缓冲区中的数据。这个没那么直接的细节将在纹理、图像和采样器部分中解释。
通常, URIs 被包括在 buffer
和 image
对象中,这个URI会指向包含实际数据的文件。
作为替代方案,可以使用数据URI将数据以二进制格式嵌入JSON。