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

简介

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

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

时间: 2024-11-10 01:29:01

Xbim.GLTF源码解析(一):简介的相关文章

ArrayList源码解析

ArrayList源码解析 ArrayList简介: ArrayList 是list接口的一个常用实现类.它的对象可以认为是一维数组的"类版本".我们很快就可以看到,ArrayList 对象可以看做是一维数组的改良版本.类似于数组,ArrayList 对象支持元素的随机访问:也就是说,只要给出元素的索引,任何元素的访问时间都是常数.但是同数组不同的是,ArrayList 对象的大小在程序执行的过程中可以自动进行调整,并且ArrayList对象具有在任何索引位置插入和删除对象的方法,而数

Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45)第4部分 LinkedList遍历方式第5部分 LinkedL

Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayList有个整体认识,再学习它的源码,最后再通过例子来学习如何使用它.内容包括:第1部分 ArrayList简介第2部分 ArrayList数据结构第3部分 ArrayList源码解析(基于JDK1.6.0_45)第4部分 ArrayList遍历方式第5部分 toArray

Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要  和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数

Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayLis

【转】Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMap数据结构第3部分 TreeMap源码解析(基于JDK1.6.0_45)第4部分 TreeMap遍历方式第5部分 TreeMap示例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部

【转】Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例

概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayList有个整体认识,再学习它的源码,最后再通过例子来学习如何使用它.内容包括:第1部分 ArrayList简介第2部分 ArrayList数据结构第3部分 ArrayList源码解析(基于JDK1.6.0_45)第4部分 ArrayList遍历方式第5部分 toArray

Android EventBus3.0使用及源码解析

叨了个叨 最近因为换工作的一些琐事搞的我一个头两个大,也没怎么去学新东西,实在是有些愧疚.新项目用到了EventBus3.0,原来只是听说EventBus的鼎鼎大名,一直没仔细研究过.趁着周末有些时间,研究下代码,也算没有虚度光阴. EventBus GitHub : https://github.com/greenrobot/EventBus EventBus3.0简介 EventBus是greenrobot出品的一个用于Android中事件发布/订阅的库.以前传递对象可能通过接口.广播.文件

Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列 05 Vector详细介绍(源码解析)和使用示例 Java 集合系列 06 Stack详细介绍(源码解析)和使用示例 第1部分 Stack介绍 Stack简介 Stack是栈.它的特性是:先进后出(FILO, F