最小的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
和节点
结构
这个scene
是存储在glTF中的场景描述的入口点。解析glTF JSON文件时,场景结构的遍历将从这里开始。每个场景都包含一个名为节点
,其中包含node
物体。这些节点是场景图层次的根节点。
这里的示例由一个场景组成。它指的是本例中唯一的节点,即索引为0的节点。而该节点又指索引为0的唯一网格:
"scenes" : [
{
"nodes" : [ 0 ]
}
],
"nodes" : [
{
"mesh" : 0
}
],
有关场景和节点及其属性的详细信息将在场景和节点第节
这个meshes
Amesh
表示出现在场景中的实际几何对象。网格本身通常没有任何属性,但只包含mesh.primitive
对象,作为较大模型的构建块。每个网格图元都包含网格所包含的几何体数据的描述。
该示例由一个网格组成,并且有一个mesh.primitive
对象。网格基本体有一个数组属性
. 这些是网格几何体顶点的属性,在本例中,这只是POSITION
属性,描述顶点的位置。基本体描述网格索引几何图形,由indices
财产。默认情况下,假设它描述一组三角形,因此三个连续的索引是一个三角形顶点的索引。
网格图元的实际几何数据由attributes
以及指数
. 它们都是指accessor
对象,将在下面解释
"meshes" : [
{
"primitives" : [ {
"attributes" : {
"POSITION" : 1
},
"indices" : 0
} ]
}
],
有关网格和网格基本体的详细描述,请参见网格第节
这个buffer
,bufferView
,和accessor
概念
这个buffer
,bufferView
,和accessor
对象提供有关网格基本体所包含的几何体数据的信息。基于具体的例子,我们很快就介绍了它们。有关这些概念的更详细的描述将在缓冲区、缓冲区视图和访问器
缓冲器
Abuffer
非结构化数据定义了一个没有固有意义的原始数据块。它包含一个uri
,它可以指向包含数据的外部文件,也可以是数据URI它直接在JSON文件中对二进制数据进行编码。
在示例文件中,使用第二种方法:有一个包含44个字节的缓冲区,该缓冲区的数据被编码为数据URI:
"buffers" : [
{
"uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=",
"byteLength" : 44
}
],
此数据包含三角形的索引和三角形的顶点位置。但是为了实际使用这些数据作为网格图元的几何数据,有关结构此数据是必需的。有关结构的信息编码在bufferView
和存取器
物体
缓冲区视图
AbufferView
描述整个原始缓冲区数据的“块”或“片”。在给定的示例中,有两个缓冲区视图。它们都指向同一个缓冲区。第一个缓冲区视图是指包含索引数据的缓冲区部分:它有一个字节偏移量
表示整个缓冲区数据的0,以及byteLength
第二个缓冲区视图是指包含顶点位置的缓冲区部分。从a开始字节偏移量
有一个byteLength
36个;也就是说,它延伸到整个缓冲区的末尾。
"bufferViews" : [
{
"buffer" : 0,
"byteOffset" : 0,
"byteLength" : 6,
"target" : 34963
},
{
"buffer" : 0,
"byteOffset" : 8,
"byteLength" : 36,
"target" : 34962
}
],
访问器
结构数据的第二步是用accessor
物体。它们定义了缓冲视图
必须通过提供有关数据类型和布局的信息来解释。
在本例中,有两个访问器对象。
第一个访问器描述几何数据的索引。它指的是bufferView
索引为0,它是缓冲器
包含索引的原始数据。此外,它还指定count
和类型
元素和它们的componentType
. 在本例中,有3个标量元素,它们的组件类型由一个表示无符号短
类型
第二个访问器描述顶点位置。它包含对缓冲区数据相关部分的引用,通过bufferView
索引为1,并且计数
,type
,和组件类型
属性表示三维向量有三个元素,每个元素都有float
组件
"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
描述
在gltf1.0中,这个属性仍然是可选的,但是在随后的glTF版本中,JSON文件必须包含asset
包含版本
数字。这里的示例说明资产符合glTF版本2.0:
"asset" : {
"version" : "2.0"
}
这个asset
属性可能包含中描述的其他元数据asset
规范 .