总目录 >> threejs入门进阶到实战(目前已更新入门篇、基础篇和进阶篇)
3、最小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
节点对象的索引。这些节点是scene graph hierarchy场景图层次结构
的根节点。
这里的例子由一个场景组成。它引用本例中唯一的节点,即索引为0的节点。该节点相应地去引用索引为0的网格:
"scenes" : [
{
"nodes" : [ 0 ]
}
],
"nodes" : [
{
"mesh" : 0
}
],
有关场景和节点及其属性的更多详细信息,请参见场景和节点部分(scenes and nodes)。
网格(meshes)
mesh
表示出现在场景中的实际几何物体。网格本身通常没有任何属性,但包含一个mesh.primitive
对象数组,这个对象用于较大模型的构建。每个网格基本体(mesh primitive)都包含网格所包含的几何体数据的描述。
该示例由单个网格组成,并且具有单个mesh.primitive
对象。网格基本体(mesh primitive)有一个属性(attributes
)数组,这些是网格几何体顶点(vertices
)的属性。在本例中,只有描述顶点位置的“POSITION
”属性。网格基本体描述索引几何体,该几何体由“索引indices
”属性指示。默认情况下,假设它描述一组三角形(triangle),因此三个连续索引是一个三角形顶点的索引。
网格图元(mesh primitive)的实际几何数据由属性attributes
和索引indices
给出。这两个对象都指访问器accessor
对象,下面将对其进行解释。
"meshes" : [
{
"primitives" : [ {
"attributes" : {
"POSITION" : 1
},
"indices" : 0
} ]
}
],
有关网格和网格图元的更详细描述,请参见“网格”章节。
buffer、bufferView、accesor的概念
buffer
, bufferView
和 accessor
对象提供了有关网格图元(mesh primitive)所包含的几何体数据的信息。缓冲区 buffer
,、缓冲区视图bufferView
和访问器accessor
部分将对这些概念进行更详细的描述。
buffers 缓冲区
缓冲区buffer
定义了一块没有内在含义的原始非结构化数据。它包含一个uri
,它既可以指向包含数据的外部文件(外部嵌入),也可以直接在JSON文件中编码二进制数据的数据uri
(直接嵌入)。
在示例文件中,使用了第二种方法:有一个包含44个字节的缓冲区,该缓冲区的数据被编码为数据URI:
"buffers" : [
{
"uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=",
"byteLength" : 44
}
],
此数据包含三角形的索引和三角形的顶点位置。但是,为了实际使用这些数据作为网格图元的几何数据,需要有关这些数据的结构的其他信息。有关结构的信息编码在bufferView
和accessor
对象中。
buffer views
bufferView
描述整个原始缓冲区数据的“块chunk”或“片slice”。在给定的示例中,有两个缓冲区视图buffer views。它们都指同一个缓冲区 buffer。第一个缓冲区视图是指包含索引数据indices
的缓冲区部分:它的字节偏移量为0(相对于整个缓冲区数据),字节长度byteLength为6。第二个缓冲区视图是指缓冲区中包含顶点位置(vertices position
)的部分。它的字节偏移量byteOffset
为8,字节长度byteOffset
为36;也就是说,它扩展到整个缓冲区的末尾。
"bufferViews" : [
{
"buffer" : 0,
"byteOffset" : 0,
"byteLength" : 6,
"target" : 34963
},
{
"buffer" : 0,
"byteOffset" : 8,
"byteLength" : 36,
"target" : 34962
}
],
Accesors 访问器
构造数据的第二步是使用访问器accesor
对象完成的。它们通过提供有关数据类型和布局(data types and layout)的信息来定义如何解释bufferView
的数据。
在本例中,有两个访问器accesor
对象。
第一个访问器描述几何数据的索引indices
。它引用索引为0的bufferView
,它是包含索引原始数据的缓冲区buffer
的一部分。此外,它还指定元素的 count
and type
及其componentType。在这种情况下,有3个标量元素,它们的组件类型由一个表示无符号短类型unsigned short 的常量给出。
第二个访问器描述顶点位置(vertex positions)。它通过索引为1的bufferView
包含对缓冲区数据相关部分的引用,其count
、type
和componentType
属性表示有三个3D vectors,每个元素都有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
时,呈现程序可以解析底层缓冲区视图和缓冲区,并将所需的缓冲区部分以及有关数据类型和布局的信息发送给渲染程序。在Buffers、BufferViews
和Accessors
章节以及Materials和technologies部分中给出了渲染器如何获取和处理访问器数据的更详细描述。
asset描述
在glTF 1.0中,此属性仍然是可选的,但是在后续的glTF版本中,JSON文件必须包含包含版本号的资产属性。此处的示例说明资产符合glTF版本2.0:
"asset" : {
"version" : "2.0"
}
asset
资产属性可以包含资产规范中描述的其他元数据。