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

相關文章
相關標籤/搜索