Xbim.GLTF源码解析(一):简介

原创做者:flowell,转载请标明出处:http://www.javashuo.com/article/p-xjyhxrqs-bd.htmlhtml


 

简介

Xbim.GLTF是将IFC文件转换成GLTF文件的一个组件。IFC是建筑行业的存储规范,而GLTF则是计算机领域的存储规范,GLTF中只包含与三维图形相关的图元数据。而IFC中不只包含建筑模型的三维视图,还会包含各类各样的属性信息,类型信息等等非几何的数据。将IFC文件转换成GLTF文件,除了剔除非几何信息以外,还要注意初始IFC文件中几何模型的数据完整性。git

如下是进行几何数据提取后,装载成GLTF的文件和原IFC文件的大小对比,能够看到,该方案能够将模型文件压缩至50%左右。github

模型大小架构

处理前函数

处理后ui

轻量化幅度spa

OneWall设计

7KBorm

4KBhtm

42.86%

TwoWallsTwoColour

13KB

7KB

46.15%

TwoColumsOneBeam

14KB

16KB

-14.29%

SampleHouse

2269KB

989KB

56.41%

rac_basic_sample_project

27677KB

9099KB

67.12%

zp

38991KB

16827KB

56.84%

轻量化幅度

Xbim是为IFC提供解决方案的一个组织,旗下的XBIM.Essentials提供面向对象解析IFC文件的解决方案。而本系列介绍的Xbim.Gltf也是Xbim旗下的一个项目,Xbim.Gltf关联的项目有Xbim.Essential和Khronos.glTF-CSharp-Loader,Khronos是gltf官方组织,除此以外,WebGL也在Khronos组织之下。

XBIM.GLTF的Github仓库:

https://github.com/xBimTeam/XbimGltf

本文剖析的是维护中的maintenance分支:

https://github.com/xBimTeam/XbimGltf/tree/maintenance/Xbim4.x

KHRONOS.GLTF-CSHARP-LOADER的Github仓库:

https://github.com/KhronosGroup/glTF-CSharp-Loader

 

IFC-GLTF

一般地,将一种存储格式的文件转换成另外一种存储格式的文件,须要作如下三步操做:1.将文件提取到内存中;2.将文件转换成目标格式;3.将内存中的数据装载成目标存储格式并写出。

为了将IFC文件转换成GLTF文件,也须要作以上三步。第一步文件的提取利用到上文提到的Xbim.Essentials组件,该组件能够解析IFC文件,并提供面向对象的访问方式访问IFC文件。也就是说该组件完成了IFC文件的提取工做,在后续操做中咱们能够像访问内存中的文件对象同样访问IFC文件。第二步则是文件的转换,通过第一步的处理,内存中的数据仍然是以IFC格式组织起来的。所以咱们在第二步中要将按照须要提取内存中IFC格式的数据,以便在下一步中能够将这些数据装载成目标格式。第三步基于第二步提取出的数据,将其装载成GLTF格式。在这步中,咱们将利用GLTF-CSHARP-LOADER能够作到,咱们只需将提取的数据按照GLTF的组织形式写进loader中,像调用写文件函数同样调用loader.save()函数即可将数据写到磁盘中。

 

 

总体架构:

Xbim.GLTF中部分类的关系图

 

Xbim.GLTF中主要涉及到IFC-GLTF转换的只有以上几个类,其他的类也是基于以上的类衍生而来,所以本系列中不作分析。

l  APP:程序入口类

l  MainWindow:程序主界面

l  MultipleFilesExporter:多文件转换类,将一个IFC文件转换成多个GLTF文件

l  SingleFileExporter:单文件转换类,将一个IFC文件转换成单个GLTF文件

l  Builder:模型提取,模型转换类

l  XbimMesher:模型实体类,存储提取的模型数据。

 

XBIM.GLTF中涉及到的Xbim.Essential类关系图

 

 

模型提取主要用到的类和接口:

IfcStore,Xbim3DModelContext,IGeometryStore,IGeometryStoreReader,XbimShapeInstance,BinaryReader,XbimShapeTriangulation,XbimFaceTriangulation。

 

l  IfcStore类是是使用任何格式(.xbim,.ifc等)的模型文件的主要入口点。该类处理任何格式的ifc文件的打开、解析和导出工做,是IFC文件数据的访问入口,以及提供访问内部XBIM格式(如*.xbim)文件。本文使用该类打开对应文件名的IFC格式的文件。

l  Xbim3DmodelContext类表明几何信息的上下文,用以建立对应的IGeometryStore。

l  IGeometryStore是模型几何信息的访问控制接口,能够经过该类的BeginRead函数获取IgeometryStoreReader接口的实例。

l  IGeometryStoreReader访问模型的几何实例的接口,经过Instances属性访问模型所包含的全部的几何实例。

l  XbimShapeInstance在语义上是空间中一个具体的实例,实际上表明着一个几何网格,包含了纹理,材质和顶点信息,也就是本文将要提取的构件在空间上的最小单位。

l  BinaryReader,二进制流读取类,Xbim.Essentials在System.IO,BinaryReader基础上拓展了ReadShapeTriangulation函数,用以从二进制形式的IFC文件流中提取并解析BIM模型,并生成对应的XbimShapeTriangulation实例。

l  XbimShapeTriangulation是存储Shape中全部三角形面的类。经过构建本类并调用本类的ToPointsWithNormalsAndIndices函数,能够获取构成本Shape的顶点,法向量和面的拓扑索引。本文将使用该类提取IFC文件中的BIM模型的三维模型信息,提取完成后,再进行轻量化操做。

l  XbimFaceTriangulation是存储Face中全部三角形面的类,Shape由Face构成,事实上,XbimShapeTriangulation类的实例拥有多个XbimFaceTriangulation类的实例。

l  Xbim.Essentials组件设计的使用方式与普通文件库相似,使用IModel接口类打开IFC文件后,即可以以面向对象的形式访问IFC文件。本模块使用到的Xbim.Essentials中的类的调用流程以下表所示:

本模块使用的Xbim.Essentials类调用图

步骤

类或接口

成员或函数

调用参数

返回值

IModel

Open

Filename

IModel

IModel

GeometryStore

Void

GeometryStore

IGeometryStore

BeginRead

Void

GeometryStoreReader

IGeometryStoreReader

ShapeGeometry

Void

XbimShapeGeometry

XbimShapeGeometry

ShapeData

Void

XbimShapeGeometryData

XbimShapeTriangulation

ToPointsWithNormalsAndIndices

Position,Index

Void

相关文章
相关标签/搜索