glTF格式介绍(2)—— 一个最简单的glTF文件

原文地址:https://github.com/javagl/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_003_MinimalGltfFile.md

一、一个最简单的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"
  }
}

其对应的是一个三角形,绘制显示的结果如下:

其具体的数据构成为:

1.scene和nodes结构

每个scene包含一个叫nodes的数组,里面包含了node的索引。

"scenes" : [
    {
      "nodes" : [ 0 ]
    }
  ],
  
  "nodes" : [
    {
      "mesh" : 0
    }
  ],

2.mesh结构:

每个mesh结构代表一个在场景中出现的真实的几何实例,mesh本身不包含任何属性,只包含一个mesh.primitive图元数组对象,作为模型的组成部分。每个图元包含一个对mesh几何数据的描述。

下面的例子只包含一个mesh,并且只有一个图元。图元中有一个attributes数组,描述了mesh几何对象的顶点属性。此处只有Position属性用来描述顶点位置。通过indices属性,可以知道该mesh是一个索引几何。例子中indices为0,表示使用第一个accessor来解析该mesh。默认描述的是三角形。

 "meshes" : [
    {
      "primitives" : [ {
        "attributes" : {
          "POSITION" : 1
        },
        "indices" : 0
      } ]
    }
  ],

3.buffer、bufferview和accessor

这三个属性提供了mesh图元的几何数据信息.

(1)buffers:定义了一个原始的数据块

  • 1)buffer包含一个uri,通过这个uri,可以指向一个外部的二进制文件(.bin文件),或者也可以在json文件中直接包含二进制数据块

  • 2)此外还有要给byteLength属性,定义了数据的长度

(2)bufferviews:bufferview是buffer的“块”或“切片”

例子中有两个bufferview,第一个是三角形的索引,第二个则是三角形的顶点位置

"bufferViews" : [
    {
      "buffer" : 0,
      "byteOffset" : 0,
      "byteLength" : 6,
      "target" : 34963
    },
    {
      "buffer" : 0,
      "byteOffset" : 8,
      "byteLength" : 36,
      "target" : 34962
    }
  ],

(3)accessor通过描述数据类型和布局,来描述bufferview中的数据应如何解读

  • 1)bufferview字段描述该访问器是针对哪个bufferview
  • 2)count、type描述数据长度和数据类型(如标量还是向量)
  • 3)componentType描述的是变量类型(如float)

例子中有两个accessor,第一个访问器描述了几何数据的索引,通过bufferview:0可知,它是第一个bufferview的访问器。该访问器中有三个标量,数据类型是unsigned shorttype

第二个访问器中有三个三维向量,数据类型是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 ]
    }
  ],

 

猜你喜欢

转载自blog.csdn.net/qq_31709249/article/details/86477973