【译】glTF教程:最小的glTF文件(三)
最小的glTF文件
以下是一个最小但完整的glTF结构,包含一个索引三角形。您可以将其复制并粘贴到gltf文件中,并且每个基于glTF的应用程序都应该能够加载和呈现它。本节将基于此示例解释glTF的基本概念。
{
"scenes" : [
{
"nodes" : [ 0 ]
}
],
"nodes" : [
{
"mesh" : 0
}
],
"meshes" : [
{
"primitives" : [ {
"attributes" : {
"POSITION" : 1
},
"indices" : 0
} ]
}
],
"buffers" : [
{
"uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=",
"byteLength" : 44
}
],
"bufferViews" : [
{
"buffer" : 0,
"byteOffset" : 0,
"byteLength" : 6,
"target" : 34963
},
{
"buffer" : 0,
"byteOffset" : 8,
"byteLength" : 36,
"target" : 34962
}
],
"accessors" : [
{
"bufferView" : 0,
"byteOffset" : 0,
"componentType" : 5123,
"count" : 3,
"type" : "SCALAR",
"max" : [ 2 ],
"min" : [ 0 ]
},
{
"bufferView" : 1,
"byteOffset" : 0,
"componentType" : 5126,
"count" : 3,
"type" : "VEC3",
"max" : [ 1.0, 1.0, 0.0 ],
"min" : [ 0.0, 0.0, 0.0 ]
}
],
"asset" : {
"version" : "2.0"
}
}
scene和nodes结构
scene
是存储在glTF的场景描述的入口点。解析glTF JSON文件时,场景结构的遍历将从此处开始。每个场景都包含一个名为nodes的数组,node
数组包含node对象的索引。这些节点是场景图层次结构的根节点。
示例包含单个场景。也就是说此示例中只有一个节点,索引为0。此节点又指定了唯一的格网,其索引为0:
"scenes" : [
{
"nodes" : [ 0 ]
}
],
"nodes" : [
{
"mesh" : 0
}
],
更多有关场景和节点及其属性的详细信息将在Scenes and Nodes部分中给出。
meshes
格网mesh
表示场景中出现的实际几何对象。格网本身通常没有任何属性,只包含一个格网基元mesh.primitive
对象数组,这些对象在较大模型用作构建块。每个格网图元都包含格网所包含的几何数据的描述。
该示例由具有单个格网基元mesh.primitive
对象的单个格网组成。格网基元有一个属性(attributes)数组。属性是格网几何体顶点的属性,在这种情况下,这只是描述顶点位置的属性。格网基元描述用indices表示的索引几何。默认情况下,假设描述一组三角形,因此连续三个索引是一个三角形顶点的索引。
格网图元的实际几何数据由attributes和indices给出。attributes和indices都指向accessor对象,后面解释accessor对象。
"meshes" : [
{
"primitives" : [ {
"attributes" : {
"POSITION" : 1
},
"indices" : 0
} ]
}
],
有关格网和格网图元的更详细说明,请参见 meshes部分。
buffer
, bufferView
, 和 accessor
概念
buffer
, bufferView
, 和 accessor
对象提供有关该格网图元包括的几何形状数据的信息。这里基于具体示例简要介绍,有关这些概念的更详细说明,请参见Buffers, BufferViews, 和 Accessors 部分。
buffer缓冲区
一个 buffer
定义了一块没有固有含义的原始非结构化数据块。它包含一个uri,它可以指向包含数据的外部文件,也可以是直接在JSON文件中编码二进制数据的data URI。
在示例文件中,使用第二种方法:有一个包含44个字节的缓冲区,,并且此缓冲区的数据被编码为数据URI:
"buffers" : [
{
"uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=",
"byteLength" : 44
}
],
该数据包含三角形的索引和三角形的顶点位置。但是为了实际作为格网图元的几何数据使用该数据,需要附加有关的结构信息。有关结构的信息在bufferView和accessor对象中编码。
bufferView缓冲视图
bufferView
描述了整个原始缓冲数据的“块”或“切片”。在给出的示例中,有两个缓冲区视图。它们都指向相同的缓冲区。第一个缓冲区视图指出包含索引数据的缓冲区部分:它对整个缓冲区数据偏移值byteOffset为0,长度byteLength为6。第二个缓冲区视图指的是缓冲区的一部分,包含顶点位置的那部分。它从偏移值8 开始,长度36; 也就是说,它延伸到整个缓冲区的末尾。
"bufferViews" : [
{
"buffer" : 0,
"byteOffset" : 0,
"byteLength" : 6,
"target" : 34963
},
{
"buffer" : 0,
"byteOffset" : 8,
"byteLength" : 36,
"target" : 34962
}
],
accessor访问器
构造数据的第二步是使用 accessor
对象完成的。它定义了如何通过提供有关数据类型和布局的信息来解释bufferView
的数据。
在该示例中,有两个访问者对象。
第一个访问器描述几何数据的索引。它引用索引为0的bufferView,它是buffer包含索引元数据的那部分。此外,它规定了元素的count与type以及componentType。在此例子中,有3个标量元素,它们的组件类型由代表该unsigned short类型的常量给出。
第二个访问器描述顶点位置。它包含一个参考缓冲器中的数据的相关部分,通过索引为1的bufferView,其count,type以及componentType属性描述其有三个3D矢量元素,每一个都是浮点型。
"accessors" : [
{
"bufferView" : 0,
"byteOffset" : 0,
"componentType" : 5123,
"count" : 3,
"type" : "SCALAR",
"max" : [ 2 ],
"min" : [ 0 ]
},
{
"bufferView" : 1,
"byteOffset" : 0,
"componentType" : 5126,
"count" : 3,
"type" : "VEC3",
"max" : [ 1.0, 1.0, 0.0 ],
"min" : [ 0.0, 0.0, 0.0 ]
}
],
如上所述, mesh.primitive
现在可以使用它们的索引来引用这些访问器:
"meshes" : [
{
"primitives" : [ {
"attributes" : {
"POSITION" : 1
},
"indices" : 0
} ]
}
],
当 mesh.primitive
渲染时,渲染器可以解析底层缓冲区视图和缓冲区,并将缓冲区的所需部分连同有关数据类型和布局的信息一起发送到渲染器。有关如何通过渲染器获取和处理访问者数据的更详细说明,请参见缓冲区、缓冲视图和访问器 部分以及 简单纹理部分。
asset说明
在glTF 1.0中,此属性仍然是可选的,但在随后的glTF版本中,JSON文件需要包含asset包含该version数字的属性。这里的例子说asset符合glTF 2.0版:
"asset" : {
"version" : "2.0"
}
The asset
property may contain additional metadata that is described in the asset
specification.
该asset属性可能包含
asset
specification.中描述的其他元数据