張偉ZHANG Wei
(中鐵第四勘察設計院集團有限公司,武漢 430063)
隨著“鐵路數(shù)字化”概念的提出和發(fā)展,三維BIM 模型在鐵路工程中也得到了廣泛的應用。其不僅可以向用戶進行直觀的模型展示還可以協(xié)助完成鐵路線路的規(guī)劃和設計,極大地推動了鐵路行業(yè)的數(shù)字化進程。為了更好將三維BIM 模型融合到GIS 行業(yè)中,ESRI 公司提出了I3S規(guī)范,并基于該規(guī)范定義了新的三維數(shù)據(jù)格式SLPK(scene layer package)。SLPK 格式優(yōu)化了BIM 模型的數(shù)據(jù)存儲和樹形結(jié)構(gòu),相較于其它三維數(shù)據(jù)格式,其在Arcgis客戶端進行加載時更加高效。目前鐵路行業(yè)應用較廣的Blender、3DMax、Revit 等三維設計軟件無法直接導出SLPK格式的模型供Arcgis 使用,但可以支持glTF 格式的導出[1]。本文通過研究glTF 格式數(shù)據(jù)組織結(jié)構(gòu),并基于SharpGLTF和i3s 等開源庫進行二次開發(fā),實現(xiàn)了三維模型從glTF 格式到SLPK 格式的轉(zhuǎn)換。同時為了更方便地在Arcgis 中使用三維模型,在轉(zhuǎn)換過程中可以支持將模型導出為Web 墨卡托坐標或經(jīng)緯度坐標。其轉(zhuǎn)換流程如圖1 所示。
圖1 模型轉(zhuǎn)換流程
glTF(GL Transmission Format)是一種基于JSON 的三維模型文件格式,具有通用性強和數(shù)據(jù)解析簡單的特點,目前絕大多數(shù)主流三維設計軟件都支持對該格式的加載和導出。glTF 文件有兩種后綴格式可以選擇,.gltf 和.glb,其中.glb 是glTF 格式的二進制表示形式。
glTF 的數(shù)據(jù)組織結(jié)構(gòu)主要包括JSON 文件和關(guān)聯(lián)外部數(shù)據(jù)文件,具體來說外部數(shù)據(jù)文件包括圖像文件、GLSL文件和bin 文件[2]。如圖2 所示。
圖2 glTF 數(shù)據(jù)組織結(jié)構(gòu)
JSON 文件是glTF 數(shù)據(jù)的核心部分,文件中記述了模型相關(guān)的場景信息及數(shù)據(jù)的索引信息。JSON 文件由一系列的元素節(jié)點構(gòu)成,其中scenes 和nodes 元素描述了模型場景的基本結(jié)構(gòu)和層次信息,meshes、textures、materials 和images 等元素描述了場景中三維模型的幾何和材質(zhì)紋理信息,buffers、bufferviews 和accessors 等元素描述了模型的數(shù)據(jù)類信息。各元素之間的引用關(guān)系如圖3 所示[3]。
圖3 元素引用關(guān)系
要實現(xiàn)三維模型從glTF 格式到SLPK 格式的轉(zhuǎn)換,首先需要將三維模型的相關(guān)屬性信息從glTF 模型中提取出來[4]。這些屬性包括三角面片信息、頂點位置信息、頂點紋理坐標、紋理貼圖信息、模型材質(zhì)信息、法向量信息等。為了方便存儲以上屬性信息,在程序中定義了一個數(shù)據(jù)存儲類ModelData,其中MeshData 類用來存儲模型的三角面片信息,VertexData 類用來存儲模型的頂點信息,Point3D 和Point2D 類分別用來存儲三維點和二維點信息,其類圖如圖4 所示。
圖4 ModelData 類圖
程序中對glTF 文件的加載和屬性提取可以借助于現(xiàn)有的一些比較成熟的開源庫進行。SharpGLTF 是一款輕量級的glTF 模型處理開源庫,支持對glTF 模型的讀寫,可以滿足提取模型屬性的需求。在使用SharpGLTF 對glTF 模型進行屬性提取時需要注意以下幾點:①在加載glTF 模型后應調(diào)用SharpGLTF 部分原生接口直接獲取模型的三角網(wǎng)列表信息,這樣可以方便模型屬性的提?。虎趶膅lTF模型中獲取的顏色值需要乘255 以獲取其真實的RGBA信息;③獲取到模型的頂點Position 信息后,可以根據(jù)需要將其處理為Web 墨卡托坐標或經(jīng)緯度坐標,這樣在導出為SLPK 模型后,模型就可以適配相應坐標系。
SLPK 模型文件屬于一種數(shù)據(jù)壓縮包文件,解壓后可以看到其有一系列的JSON 文件和二進制文件組成,JSON文件和二進制文件均使用gzip 壓縮。其中3DSceneLayer.json 描述的是整個模型場景的信息,如模型的圖層類型、參考坐標系和材質(zhì)及紋理定義信息等。nodes 目錄存放“節(jié)點”信息,每個文件夾代表一個模型節(jié)點。nodePages 目錄存放“節(jié)點頁”信息[5]。
完成glTF 模型屬性提取,基于獲取的ModelData 對象和i3s 開源庫就可以導出生成SLPK 三維模型了。
創(chuàng)建Layer_write 部分代碼如下所示:
上述代碼中配置的Layer_meta 信息最終會寫入的SLPK 數(shù)據(jù)文件中的3DSceneLayer.json 文件中。代碼中wkid 表示要生成的模型的坐標系類型,我們可以通過配置wkid 的值來使模型使用不同的坐標系。其中wkid=3857 表示當前模型使用的坐標是Web 墨卡托坐標,wkid=4326 表示當前模型使用的坐標是經(jīng)緯度坐標。
遍歷ModelData 中的MeshList,實例化i3slib::i3s::Simple_raw_mesh raw_mesh 對象,并將前面獲取的MeshData 中的頂點坐標、法向量、紋理坐標,紋理貼圖和顏色依次賦值給raw_mesh.abs_xyz、raw_mesh.normals、raw_mesh.uv、raw_mesh.img 和raw_mesh.colors。之后再依次調(diào)用i3sLayerWriter 對象的create_mesh_from_raw ()和create_node()函數(shù)創(chuàng)建mesh 節(jié)點。對于SLPK 格式,每個模型節(jié)點下都有一個node_depth 屬性,其值表示節(jié)點的層級。mesh 節(jié)點的node_depth 設置為1。
調(diào)用i3sLayerWriter 對象的create_node () 函數(shù)創(chuàng)建root 節(jié)點。root 節(jié)點的node_depth 設置為0,并將上一步創(chuàng)建的mesh 節(jié)點掛載在root 節(jié)點下。
調(diào)用i3sLayerWriter 對象的save()函數(shù)輸出SLPK 文件。由于SLPK 是一種數(shù)據(jù)壓縮包文件,一般情況下同一個三維模型,其SLPK 文件的存儲大小要小于其glTF 文件,這從而也提高了SLPK 模型在程序中的加載效率。如圖5 所示。圖6、圖7 分別是轉(zhuǎn)換前glTF 格式的三維模型和轉(zhuǎn)換后SLPK 格式的三維模型。
圖5 glTF 文件與SLPK 文件對比
圖6 原始glTF 格式三維模型
圖7 轉(zhuǎn)換后SLPK 格式三維模型
在基于Arcgis 平臺三維可視化選線系統(tǒng)中,為了更直觀的顯示線路設計效果,需要沿鐵路線加載路基、隧道、站場和橋梁等三維BIM 模型。但目前已有BIM 模型都為glTF 格式,當加載模型過多時會出現(xiàn)場景卡頓等現(xiàn)象,而Argis 對SLPK 模型的的加載調(diào)動機制較好,故可以將glTF 模型統(tǒng)一轉(zhuǎn)換為SLPK 格式進行加載以解決大場景加載問題。同時由于在glTF 格式向SLPK 格式轉(zhuǎn)換過程中,我們已經(jīng)將模型的相對坐標轉(zhuǎn)換為了Web 墨卡托坐標或經(jīng)緯度坐標,在加載模型時不需要再對模型進行定位擺放,可以進一步可以優(yōu)化模型加載效率,并且加載后的模型位置定位準確且與地形的貼合度也較好。圖8 為轉(zhuǎn)換后的SLPK 模型在基于Arcgis 的鐵路選線系統(tǒng)中的展示效果。
圖8 站場模型展示效果
通過探索和研究,本文創(chuàng)新性通過對SharpGLTF 和i3s 等開源庫進行二次開發(fā),解決了三維BIM 模型由glTF格式到SLPK 格式的轉(zhuǎn)換問題。在鐵路行業(yè)廣泛的存在著大量輔助設計的glTF 格式的三維模型,利用本文方法既可以單獨提取模型信息進行輔助設計,也可以進行模型格式的轉(zhuǎn)換,拓展模型的應用范圍,提升大場景模型加載效率。故該項技術(shù)在鐵路行業(yè)也有著廣泛的應用前景[6]。