3、最小GLTF文件

总目录 >> 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"
  }
}

以上文件最后呈现出来的效果如图所示:
image.png

scenenodes 结构

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, bufferViewaccessor 对象提供了有关网格图元(mesh primitive)所包含的几何体数据的信息。缓冲区 buffer,、缓冲区视图bufferView和访问器accessor 部分将对这些概念进行更详细的描述。

buffers 缓冲区

缓冲区buffer定义了一块没有内在含义的原始非结构化数据。它包含一个uri,它既可以指向包含数据的外部文件(外部嵌入),也可以直接在JSON文件中编码二进制数据的数据uri(直接嵌入)。
在示例文件中,使用了第二种方法:有一个包含44个字节的缓冲区,该缓冲区的数据被编码为数据URI:

 "buffers" : [
    {
      "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=",
      "byteLength" : 44
    }
  ],

此数据包含三角形的索引和三角形的顶点位置。但是,为了实际使用这些数据作为网格图元的几何数据,需要有关这些数据的结构的其他信息。有关结构的信息编码在bufferViewaccessor对象中。

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包含对缓冲区数据相关部分的引用,其counttypecomponentType属性表示有三个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、BufferViewsAccessors章节以及Materials和technologies部分中给出了渲染器如何获取和处理访问器数据的更详细描述。

asset描述

在glTF 1.0中,此属性仍然是可选的,但是在后续的glTF版本中,JSON文件必须包含包含版本号的资产属性。此处的示例说明资产符合glTF版本2.0:

  "asset" : {
    "version" : "2.0"
  }

asset资产属性可以包含资产规范中描述的其他元数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值