原创作者: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中主要涉及到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 |