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