这里主要通过与gltf1.0标准格式规范进行比对,来分析BIMsurfer技术中的gltf文件(后面用Bgltf简单代指),以及他实现属性信息查看的方法。
-
所有文件
除了一个gltf文件还有三类外部文件,均在gltf中通过URI的方式指引调用。四个glsl文件,一个bin文件,一个xml文件。
Gltf文件:这里的gltf是基于1.0版本规范;
Glsl文件:是简单脚本,应该是用来解析自己在gltf中增加的项目的;
Bin文件:是外部数据文件,标准gltf文件也可以有这类文件,二进制,编辑器无法正常读取;
Xml文件:xml标准化的属性数据,用来存储各个部件的属性信息。
![](https://i-blog.csdnimg.cn/blog_migrate/1ed1f29164368f2f74378df0b3d23447.png)
-
Gltf标准格式结构
![https://github.com/KhronosGroup/glTF/raw/master/specification/1.0/figures/dictionary-objects.png](https://github.com/KhronosGroup/glTF/raw/master/specification/1.0/figures/dictionary-objects.png)
-
Bgltf的结构
整理过后可以看到Bgltf文件包含accessors、scene、scenes、materials、asset、animations、nodes、bufferViews、skins、buffers、meshs、programs、techniques、shaders项目。下面详细分析每个项目。
![](https://i-blog.csdnimg.cn/blog_migrate/37c1be43f1a360df4ff0ab4f29734d75.png)
-
详细对比
Accessors:访问器,它定义了如何通过提供有关数据类型和布局的信息来解释bufferView
中
的数据;
![](https://i-blog.csdnimg.cn/blog_migrate/cfec1b589ef4f61e020d5f8651a0062b.png)
Scene: 没啥用?
Scenes:场景,是存储在glTF的场景描述的入口点。解析glTF文件时,场景结构从这里开始遍历;
Materials:材质,包含有关对象外观的信息;
![](https://i-blog.csdnimg.cn/blog_migrate/9045786b804b2efb579a87e172233fae.png)
Json结构如上图所示,外部标签是其他部分访问这个材质的索引,他会在meshes中被引用。
![](https://i-blog.csdnimg.cn/blog_migrate/f120df35a412c7430298420e28c6ae55.png)
Asset:说明,版本等信息,在这里获知到这是gltf1.0版本。
Animations:动画,这里是空值。
Nodes:场景图层次结构中的一个节点,可以包含子节点,或mesh、camera实例
![](https://i-blog.csdnimg.cn/blog_migrate/4a489fc4e4db08e13b1f489a81107e84.png)
skins:蒙皮或者皮肤,这里是空值。
bufferViews:描述了整个原始buffer数据的“块”或“切片”。这里有两个块,都指向同一个原始数据文件,也就是buffers指向的*.bin。两个数据块长度之和等于总数据长度,一个数据块的起始接着另一个数据块的尾部。
buffers:这里指向了外部二进制文件 *.bin。
![](https://i-blog.csdnimg.cn/blog_migrate/36d3e661c3aec201f1f404f4e266fbd4.png)
meshes:表示出现在场景中的几何对象。Indices是索引文件,attributes定义对象的几何数据,顶点位置和顶点法线信息,material是材质,mode模式(这里4表示三角形)。
![](https://i-blog.csdnimg.cn/blog_migrate/8952b6bc6813d2368b7c3a84af228b82.png)
Techniques:技术描述了用于材料的阴影,就设置参数,没啥可解释的。
![](https://i-blog.csdnimg.cn/blog_migrate/3a71704d0ea67c4d21ef9d9427001dc4.png)
Programs:
技术的程序属性创建了一个阴影程序的实例(The program property of a technique creates an instance of a shader program)。Attributes
定义了传递给着色器的顶点属性,fragmentShader和vertexShader引用GLSL的片段和顶点着色器源代码文件,这里重新指向自定义文件。
![](https://i-blog.csdnimg.cn/blog_migrate/b87ccb944046b3d395a22ed69891468d.png)
Shaders:这里存储的着色器源文件。
![](https://i-blog.csdnimg.cn/blog_migrate/78f7d4de536c0e2135bdbbc05aa67780.png)
这里将其中的一个glsl文件示例列出来,可以看出,这个文件就是着色器的参数的设定,与属性值设置没有关系,无关紧要。
![](https://i-blog.csdnimg.cn/blog_migrate/4f2120f99392c5798ac1d884df9bf1b9.png)
-
Xml文件说明
值得一提的是,这里的xml文件也有一定的结构组织性,考虑了冗余数据的一次存储多次使用。如下图所示的一个floor,他在xml中是一个ifcslab的标签对表示的,其属性是内部的IfcPropertySet标签对代表,这些标签对通过id指向xml内部的IfcPropertySet连接,在IfcPropertySet内部用IfcPropertySingleValue标签对存储属性信息。这样,同样的属性信息能被多个对象重复使用。下图的例子中的一个属性组就被两个对象重复使用。
![](https://i-blog.csdnimg.cn/blog_migrate/54c050cd60e4238b395349cd3120b235.png)
![](https://i-blog.csdnimg.cn/blog_migrate/39481d225daf18c4e58432b9a011c8cb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1f37558c08df41f55e55da49963144ca.png)
-
结论
bimsurfer并不是在gltf中简单通过指定xml的id来连接三维模型对象和他的属性,这里应该是在bin文件中指定两者的对应关系,但是具体的映射关系需要更深入的研究。