下面是一个最小巧的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"
  }
}
3D模型查看与格式转换教程配图
图3a:一个简单的三角形

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"
  }