下面是一个最小巧的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,AAAA为了排版而省略,可以使用英文原文中的代码",
"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结构
glTF格式使用scene对象来描述场景。对glTF数据的JSON文件进行解析时,对场景结构的遍历也是从scene对象开始。每个scene对象引用了一个nodes数组,nodes数组通过索引引用了场景的根结点。
示例中的代码只包含了一个scene对象,这一scene对象引用了一个索引为0的node对象,这个node对象引用了索引为0的mesh对象:
"scenes" : [
{
"nodes" : [ 0 ]
}
],
"nodes" : [
{
"mesh" : 0
}
],在之后的章节,我们会对scene对象和node对象进行更为详细地介绍。
meshes
mesh对象用于表示场景中出现的3D对象实际的几何数据。mesh对象本身不包含任何属性,只包含了一个primitives对象数组,用于描述整个网格所使用的几何数据。每个primitive对象描述了一部分mesh对象的几何数据。
示例只包含了一个mesh对象,这一mesh对象只包含了一个primitive对象。primitive对象包含了一个attribute对象数组,存储了mesh对象的几何数据信息。对于这个示例来说,只包含了一个POSITION属性,用于描述mesh对象的顶点位置信息。primitive对象的indices属性描述了用于渲染的顶点索引数据,默认情况下,连续3个顶点索引构成一个三角形。
mesh对象实际的几何数据由primitive对象的attributes对象数组和indices对象数组通过引用accessor对象给出:
"meshes" : [
{
"primitives" : [ {
"attributes" : {
"POSITION" : 1
},
"indices" : 0
} ]
}
],在之后的章节,我们会对mesh对象进行更为详细地介绍。
buffer,bufferView和accessor概念
buffer,bufferView和accessor对象提供了对mesh对象实际的几何数据的描述。我们在这里对它们进行简要地介绍,更为详细的说明会在之后的章节进行。
Buffers
buffer对象描述了一个没有任何结构和层次意义的数据块。它包含了一个uri属性,用于引用外部文件作为数据,或是直接使用数据URI作为数据内容。
对于示例,我们使用数据URI直接在JSON文件中编码长度为44字节的buffer数据:
"buffers" : [
{
"uri" : "data:application/octet-stream;base64,AAAAAAAAA为了排版而省略,可以使用英文原文中代码",
"byteLength" : 44
}
],上面代码中uri属性指定的数据包含了一个三角形3个顶点的索引和顶点位置信息。本身buffer对象所指定的数据是没有任何结构和层次意义的,所以需要使用bufferView和accessor对象来描述数据的结构和层次意义。
Buffer views
一个bufferView对象引用了一个buffer对象的一部分数据。对于这个示例来说,包含了2个bufferView对象,它们引用了同一个buffer对象的不同部分数据。第一个bufferView对象引用了三角形的索引数据,数据位置从偏移值byteOffset(0)开始,长度为6字节。第二个bufferView对象引用了三角形的顶点位置数据,数据位置从偏移值byteOffset(8)开始,长度为36字节:
"bufferViews" : [
{
"buffer" : 0,
"byteOffset" : 0,
"byteLength" : 6,
"target" : 34963
},
{
"buffer" : 0,
"byteOffset" : 8,
"byteLength" : 36,
"target" : 34962
}
],Accessors
accessor对象用于描述数据的结构和层次意义。它描述了bufferView所引用数据的解释方式。
对于本例,包含了两个accessor对象。
第一个accessor对象描述了顶点的索引数据,它引用了索引为0的bufferView对象,这一bufferView对象引用了顶点索引数据。accessor对象还包含了count,type和componentType3个属性,用来对数据进行描述。对于示例来说,这3个属性描述的的数据元素包含了3个类型为unsigned short的标量,
第二个accessor对象描述了顶点位置数据。它引用了索引为1的bufferView对象,这一bufferView对象引用了顶点位置数据。对于示例来说,这一accessor对象的count,type和componentType属性描述的数据元素的个数为3,每个数据元素是一个包含3个分量,每个分量类型为float的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属性引用accessor对象,通过索引使用几何数据:
"meshes" : [
{
"primitives" : [ {
"attributes" : {
"POSITION" : 1
},
"indices" : 0
} ]
}
],当需要使用几何数据进行渲染时,渲染程序可以通过引用关系,找到需要的几何数据。通过accessor对象,渲染程序可以获取数据元素的类型以及布局方式。
asset对象
对于glTF数据格式的1.0版本,asset对象是可选的,对于之后版本的glTF数据格式,必须包含asset对象,使用version属性指定glTF数据格式的版本。下面代码表示数据使用glTF数据格式的2.0版本进行描述:
"asset" : {
"version" : "2.0"
}