码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-05-13 12:25:23      阅读:403      评论:0      收藏:0      [点我收藏+]

标签:geometry   github仓库   add   等等   info   single   WebG   aci   三维图形   

简介

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

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

标签:geometry   github仓库   add   等等   info   single   WebG   aci   三维图形   

原文地址:https://www.cnblogs.com/flowell/p/10838972.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!