原创作者:flowell,转载请标明出处:https://www.cnblogs.com/flowell/p/10838972.html


简介

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

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

模型大小

处理前

处理后

轻量化幅度

OneWall

7KB

4KB

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源码解析(一):简介-LMLPHP

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

l  APP:程序入口类

l  MainWindow:程序主界面

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

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

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

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

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

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

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

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

05-12 07:56