原創做者: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
一般地,將一種存儲格式的文件轉換成另外一種存儲格式的文件,須要作如下三步操做: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 |