glTF入门——一个最小的gltf文件

科技一点鑫得 2024-03-08 03:20:48

glTF是Khronos推出的传输和加载3D模型的标准,glTF的愿景是使3D无处不在!

gltf整体结构

gltf描述的是场景scene,scene由多个node组成,一个场景一般只有一个根node节点,就像一个树形结构。这里以一个包含小汽车的场景描述gltf nodes的组成形式。

root节点对应nodes[0],其中children中的1、2分别对应nodes[1]、nodes[2],表示摄像头和car。nodes[1]表示摄像头。nodes[2]中的mesh中0对应meshs第0序列表示的网格,这里指car body;另外,它还包含了children属性,值3、4对应nodes[3]、nodes[4],分别对应front wheels、rear wheels。node[3]、nodes[4]中的mesh表示车轮几何体,其中又包含了rotation、translation属性,分别表示旋转和平移,应该是表示汽车开动的动画。

一个最小gltf文件示例

三角形是3D网格的基本单元,下面这个最小的glTF文件表示的就是一个简单的三角形

{ // scene表示默认显示scenes中第0个序列的场景 "scene": 0, // 解析从scenes开始,可以包含多个场景,每个scene由nodes组成 "scenes" : [ { // 这个场景只包含一个nodes,对应nodes第0个序列 "nodes" : [ 0 ] } ], "nodes" : [ { // 这个nodes只包含一个mesh网格,对应meshes第0个序列,mesh表示一个真正的几何物体 "mesh" : 0 } ], "meshes" : [ { "primitives" : [ { "attributes" : { // 1表示对应bufferViews[1]的数据,描述的是顶点坐标数据 "POSITION" : 1 }, // 0表示对应bufferViews[0]的数据,描述的是顶点索引数据 "indices" : 0 } ] } ], // buffers是存储3D物体真实数据的地方,也可以引用外部文件的方式指定 "buffers" : [ { // 这里直接将顶点索引和顶点坐标数据通过base64编码存放到uri中,具体十六进制表示见后面的图片展示 "uri" : "data:application/octet-stream;base64,AAABAAIAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAA=", // 表示数据共占用44字节 "byteLength" : 44 } ], // bufferViews表示如何分割buffers中的数据 "bufferViews" : [ { // 对应buffers第0个序列 "buffer" : 0, // 字节偏移为0 "byteOffset" : 0, // 字节长度为6字节 "byteLength" : 6, // 34963对应WebGL中的缓存数据类型ELEMENT_ARRAY_BUFFER "target" : 34963 }, { // 对应buffers第0个序列 "buffer" : 0, // 字节偏移为8 "byteOffset" : 8, // 字节长度为36字节 "byteLength" : 36, // 34962对应WebGL中的缓存数据类型ARRAY_BUFFER "target" : 34962 } ], // accessors表示如何解析bufferViews中的数据 "accessors" : [ { // 对应bufferViewss第0个序列 "bufferView" : 0, // 字节偏移量 "byteOffset" : 0, // 5123表示UNSIGNED_SHORT,占用两个字节 "componentType" : 5123, // 表示这个bufferView表示的数据共包含3组数据 "count" : 3, // 每个数据类型为标量 "type" : "SCALAR", // 最大值为2 "max" : [ 2 ], // 最小值为0 "min" : [ 0 ] }, { // 对应bufferViewss第1个序列 "bufferView" : 1, // 字节偏移量 "byteOffset" : 0, // 5126表示float,占用四个字节 "componentType" : 5126, // 表示这个bufferView表示的数据共包含3组数据 "count" : 3, // 每个数据类型为VEC3,三维向量 "type" : "VEC3", // 最大值和最小值,表达的是几何体的包围盒空间 "max" : [ 1.0, 1.0, 0.0 ], "min" : [ 0.0, 0.0, 0.0 ] } ], "asset" : { // gltf版本号 "version" : "2.0" }}

buffers中uri解码后数据的十六进制表示及与三角形的对应关系

注意这里float类型1.0的十六进制表示为0x0000803F,可以参考《深入理解计算机系统》信息的表示和处理章节关于浮点数表示的内容。

参考文献

[1]. https://github.khronos.org/glTF-Tutorials/gltfTutorial/[2]. 《深入理解计算机系统》第二章信息的表示和处理。

0 阅读:0

科技一点鑫得

简介:感谢大家的关注