胡夏愷,陳俊濤,楊聃,朱悅林
(1. 武漢大學(xué)水資源與水電工程科學(xué)國家重點實驗室,湖北武漢,430072;2. 武漢大學(xué)水工巖石力學(xué)教育部重點實驗室,湖北武漢,430072;3. 國網(wǎng)浙江省電力有限公司緊水灘水力發(fā)電廠,浙江麗水,323000)
建筑信息模型(building information modeling,BIM)已被廣泛應(yīng)用于建筑領(lǐng)域。近年來,隨著HTML5和WebGL等互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,BIM與地理信息系統(tǒng)(geographic information system,GIS)的跨界融合成為新的趨勢,高精度的BIM 模型已經(jīng)成為3D WebGIS中重要的數(shù)據(jù)來源之一[1]。
BIM 是基于建筑、工程項目而開發(fā)的全生命周期管理工具,描述的是建筑內(nèi)部的微觀信息;GIS服務(wù)于地理空間行業(yè),描述的是大尺度的宏觀環(huán)境[2]。BIM 有助于擴大地理信息系統(tǒng)的作用范圍,使其向建筑內(nèi)部發(fā)展,GIS可用于管理BIM無法處理的環(huán)境數(shù)據(jù),兩者相輔相成。BIM與GIS的技術(shù)融合有效地促進了學(xué)科交叉發(fā)展,是城市精細化、智慧化管理的基礎(chǔ)[3]。吳敦等[4]基于BIM 和GIS技術(shù)提出城市軌道交通的信息全生命周期管理系統(tǒng);潘飛等[5]針對基于3D WebGIS的土木水利工程BIM集成和管理進行了研究;紀(jì)蓉等[6]開發(fā)了基于BIM+GIS的智慧管廊監(jiān)測管控運維一體化平臺,實現(xiàn)了環(huán)境監(jiān)測管理、安防監(jiān)控管理、資產(chǎn)與運維管理、大數(shù)據(jù)統(tǒng)計分析等功能。然而,BIM+WebGIS技術(shù)在實際應(yīng)用過程中還存在以下問題。
1) BIM 和GIS 所處的行業(yè)和服務(wù)對象不同,導(dǎo)致二者的模型存在差異。例如,在空間特征方面,BIM模型采用局部坐標(biāo)系,GIS模型采用地球坐標(biāo)系;在模型信息方面,BIM 模型除了幾何和外觀信息外,還包含了大量的語義信息。因此,BIM模型無法直接接入WebGIS平臺,需要進行模型轉(zhuǎn)換,同時保存BIM模型中的語義信息。
2) WebGIS 采用的WebGL 技術(shù)在瀏覽器端通過本地客戶端顯卡、內(nèi)存資源進行圖形渲染時,受到網(wǎng)絡(luò)寬帶和服務(wù)器性能的限制,高精度、大體量的模型在網(wǎng)絡(luò)傳輸與渲染方面的效率低,影響了用戶的使用體驗。
一些商業(yè)軟件(如FME 和IFCExplorer 等)中嵌入了能將BIM數(shù)據(jù)轉(zhuǎn)換為GIS數(shù)據(jù)的工具[7],但僅限于較低細節(jié)層次的模型轉(zhuǎn)換,對于多層次細節(jié)(level of details, LOD)對應(yīng)的劃分關(guān)系模糊,且與語義信息的耦合程度不高;湯圣君等[8?9]提出將IFC標(biāo)準(zhǔn)數(shù)據(jù)模型向CityGML 格式轉(zhuǎn)換的方案,并通過語義映射使BIM模型在GIS平臺中得到了應(yīng)用,但CityGML 在網(wǎng)絡(luò)傳輸時存在標(biāo)簽冗余、瀏覽器解析渲染過程復(fù)雜等問題;徐敬海等[10?11]提出了將IFC 數(shù)據(jù)轉(zhuǎn)換為3D Tiles 格式的方案,并實現(xiàn)了語義信息的重現(xiàn),但在格式轉(zhuǎn)換過程中需要借助OBJ格式作為中介,而且由于該方案缺少對BIM 模型體量的優(yōu)化處理、空間數(shù)據(jù)索引結(jié)構(gòu)的設(shè)計以及層次細節(jié)劃分,在模型的加載和渲染方面存在不足。
針對上述問題,本文以BIM 模型的數(shù)據(jù)轉(zhuǎn)換和空間數(shù)據(jù)的動態(tài)調(diào)度為研究內(nèi)容,提出一種基于Revit 二次開發(fā)的解決方案,以期在實現(xiàn)數(shù)據(jù)轉(zhuǎn)換的同時加快模型的傳輸速度,提高渲染效率,推進BIM與WebGIS融合應(yīng)用的深入發(fā)展。
本文以Revit 建立的BIM 模型為源模型數(shù)據(jù),將3D Tiles 作為目標(biāo)數(shù)據(jù)格式,通過Revit 二次開發(fā)工具自行設(shè)計和開發(fā)數(shù)據(jù)轉(zhuǎn)換接口,在無需IFC和OBJ 等中間格式的情況下實現(xiàn)模型數(shù)據(jù)格式的轉(zhuǎn)換。下面對Revit 二次開發(fā)工具和3D Tiles 數(shù)據(jù)格式進行簡要介紹。
Revit 具有完整的應(yīng)用程序編程接口(application program interface,API),開發(fā)人員可以通過API 對Revit 的功能進行擴展。Revit API 可用VisualBasic.NET、C#以及C++/CLI 等任何與.NET兼容的編程語言進行編程。本文使用C#語言在Visual Studio平臺下對Revit進行功能擴展。
Revit 提供2 種方式來擴展其功能:1)創(chuàng)建外部命令(IExternal Command),這種方式使用時必須在外部命令中繼承IExternalCommand 接口,并重載接口內(nèi)的抽象函數(shù)Execute 來實現(xiàn)接口功能。2)添加外部應(yīng)用(IExternal Application),這種方式需要在外部應(yīng)用中繼承IExternalApplication 接口,并重新加載其中2 個抽象函數(shù)即OnShutup 和OnShutdown 的編譯代碼來實現(xiàn)程序的開發(fā)[12]。本文通過調(diào)用外部命令的方式進行模型輕量化的二次開發(fā),在Visual Studio 平臺使用C#編程生成動態(tài)鏈接庫(dll)文件后,通過Autodesk 公司提供的AddinManager插件加載dll文件實現(xiàn)對Revit的功能擴展。
3D Tiles 是一種開放式數(shù)據(jù)規(guī)范[13],是在圖形語言交換格式(GL transmission format,glTF)基礎(chǔ)上結(jié)合空間數(shù)據(jù)結(jié)構(gòu)和層次結(jié)構(gòu)細節(jié)級別(HLOD)后得到的數(shù)據(jù)格式。3D Tiles將三維數(shù)據(jù)以分塊、分層的形式進行組織,減輕了瀏覽器和CPU的負(fù)擔(dān),從而實現(xiàn)了大量地理3D數(shù)據(jù)的流式傳輸和海量渲染,成為WebGL框架下Cesium[14]平臺的專用格式。3D Tiles 數(shù)據(jù)集(TileSet)是由一系列瓦片(tile)組成的樹狀結(jié)構(gòu),其數(shù)據(jù)格式及組成如圖1所示。
圖1 中,asset 定義了3D Tiles 的版本號;properties 包含了模型中的功能屬性;geometricError是一個非負(fù)數(shù),用于計算屏幕空間誤差,決定該TileSet是否被渲染;root存儲著真正的瓦片(Tile)數(shù)據(jù)。Tile 中包括:1)boundingVolume,為Tile 的最小包圍體;2) geometricError,為一個非負(fù)數(shù),決定該Tile 是否被渲染;3)refine,定義了Tile 的切換方式;4) content,指向真正的渲染數(shù)據(jù),數(shù)據(jù)類型分為批量三維模型(b3dm)、實例三維模型(i3dm)、點云模型(pnts)以及復(fù)合模型(cmpt),其中b3dm 和i3dm 是數(shù)據(jù)格式轉(zhuǎn)換中常用的2 種數(shù)據(jù)類型;5)children,存儲了當(dāng)前節(jié)點的所有子節(jié)點信息。
圖1 3D Tiles文件結(jié)構(gòu)Fig.1 3D Tiles file structure
glTF 是一種3D 圖形數(shù)據(jù)格式標(biāo)準(zhǔn)[15],其組成如圖2所示。
圖2 glTF文件結(jié)構(gòu)Fig.2 glTF file structure
在glTF 數(shù)據(jù)格式中,采取文本(JSON)與二進制塊(bin)相結(jié)合的方式進行數(shù)據(jù)存儲。對于內(nèi)存較小的數(shù)據(jù),選擇JSON格式,其結(jié)構(gòu)緊湊且易于解析;對于幾何信息、動畫等大型數(shù)據(jù),則采用bin格式以減小文件內(nèi)存。由于JSON和bin的數(shù)據(jù)結(jié)構(gòu)都與WebGL 接口一致,無需解析和處理,這種數(shù)據(jù)格式非常適用于3D內(nèi)容在Web端的加載和渲染。
本文設(shè)計的程序框架主要由模型輕量化處理、數(shù)據(jù)格式轉(zhuǎn)換以及數(shù)據(jù)動態(tài)調(diào)度組成,如圖3所示。
圖3 程序框架Fig.3 Program framework
首先將輕量化處理后的BIM 模型進行數(shù)據(jù)轉(zhuǎn)換,將幾何與外觀信息存儲為glTF 文件,將對應(yīng)的語義信息存入JSON 文本,并在此基礎(chǔ)上構(gòu)建b3dm類型的三維瓦片;然后,在不同LOD瓦片基礎(chǔ)上設(shè)計自適應(yīng)八叉樹空間索引結(jié)構(gòu),實現(xiàn)層次結(jié)構(gòu)細節(jié)的劃分;最后,通過添加視錐體剔除算法實現(xiàn)數(shù)據(jù)的動態(tài)調(diào)度,并將其轉(zhuǎn)換為3D Tiles目標(biāo)格式。
模型輕量化處理是指在不損失模型真實性的前提下,通過算法減少模型體量,其中幾何信息是模型信息的重要組成部分,決定模型文件占據(jù)的內(nèi)存空間,對模型的幾何信息進行簡化,可以極大程度地縮減模型體量,加快模型的傳輸速度。因此,本文將從模型中存在的大量重復(fù)構(gòu)件以及構(gòu)成幾何實體的網(wǎng)格信息兩個方面入手,進行模型的輕量化操作,主要內(nèi)容包括:模型重構(gòu)、重復(fù)構(gòu)件簡化以及網(wǎng)格信息簡化。
2.1.1 模型重構(gòu)
BIM 模型由大量的建筑、結(jié)構(gòu)及裝飾構(gòu)件組成,將模型作為整體進行格式轉(zhuǎn)換會導(dǎo)致構(gòu)件細節(jié)信息的丟失,因此需要將模型進行拆分。Revit中提供了一種“族”的分類概念[16],族代表了屬性設(shè)置相同而數(shù)值可能不同的一類圖元的集合,如圖4所示。但這樣的分類方法忽略了構(gòu)件幾何參數(shù)的差異,考慮到后續(xù)過程中重復(fù)構(gòu)件簡化的需要,本文在族的基礎(chǔ)上,自行設(shè)定并添加了一個形狀分類參數(shù),借此完成更細層次的模型重構(gòu),流程如圖5所示。
圖4 “族”示意圖Fig.4 Family diagram
圖5 模型重構(gòu)流程圖Fig.5 Flow chart of model reconstruction
在模型重構(gòu)的過程中,首先對模型中的所有構(gòu)件進行遍歷,根據(jù)其族類型進行第1次分組;然后對每個組內(nèi)的族實例再次進行遍歷,根據(jù)其形狀分類參數(shù)進行第2次分組。這樣就將整體模型拆分成了若干個幾何和語義信息完全相同且僅有所處空間位置不同的構(gòu)件組。
2.1.2 重復(fù)構(gòu)件簡化
完成模型重構(gòu)后,每個構(gòu)件組內(nèi)的族實例具有相同的幾何和語義信息,僅所處的空間位置不同。若對這些族實例的數(shù)據(jù)分別進行存儲,則會造成存儲空間的浪費。因此,在每個構(gòu)件組中選取1個參照例,導(dǎo)出其網(wǎng)格信息(mesh)并記錄位置(x0,y0,z0),組內(nèi)其他族實例則引用參照例的網(wǎng)格信息,并根據(jù)自身的形心位置(x1,y1,z1)和旋轉(zhuǎn)矩陣T3×3計算其與參照例之間的空間關(guān)系。重復(fù)構(gòu)件簡化的流程如圖6所示。
圖6 重復(fù)構(gòu)件簡化流程Fig.6 Simplified flow chart of repeated components
在glTF中,平移通過一個行向量表示:
其中,X=x1-x0,表示X軸方向的位移;Y=y1-y0,表示Y軸方向的位移;Z=z1-z0,表示Z軸方向的位移。
旋轉(zhuǎn)通過四元數(shù)表示:
2.1.3 網(wǎng)格信息簡化
模型的幾何信息存儲在三角面片網(wǎng)格(mesh)中,復(fù)雜的BIM 模型往往需要百萬級的三角網(wǎng)格刻畫模型特征,如此龐大的數(shù)據(jù)量對于模型在Web端的傳輸和渲染都是巨大的挑戰(zhàn)。因此,本文使用Revit API提供的基于二次誤差測度的Garland邊折疊算法[17]對三角面片網(wǎng)格進行簡化。
定義頂點v=[vx vy vz1]T折疊到新頂點-v的誤差Δ(v)為
式中:p=[a b c d]T,其中,ax+by+cz+d=0,且有a2+b2+c2= 1;Kp為p的基本誤差;Pv為與v相關(guān)聯(lián)的平面的集合。
式中:Qep1和Qep2分別為vep1和vep2的二次誤差測度矩陣。
邊折疊算法簡化后的模型網(wǎng)格分布均勻,同時可根據(jù)需要決定模型的細節(jié)層次,得到不同精細程度的模型,如圖7所示。
圖7 網(wǎng)格信息簡化效果Fig.7 Simplified rendering of grid information
為實現(xiàn)BIM 模型到3D Tiles 目標(biāo)格式的轉(zhuǎn)換,需要制作b3dm瓦片文件,其數(shù)據(jù)結(jié)構(gòu)如圖8所示。
圖8 b3dm數(shù)據(jù)結(jié)構(gòu)Fig.8 Data structure of b3dm
b3dm 文件由文件頭和文件體構(gòu)成,文件頭(header)記錄了文件類型、版本、內(nèi)存等信息,文件體(body)包括特征表(featureTable)、批量表(batchTable)以及二進制glTF,它們分別記錄了文件中的模型個數(shù)、語義信息以及幾何數(shù)據(jù)。其中文件體的構(gòu)建是核心部分,主要包括數(shù)據(jù)向glTF格式的轉(zhuǎn)換以及語義映射。
2.2.1 glTF格式轉(zhuǎn)換
glTF 由JSON 文本、bin 文件以及紋理貼圖PNG 或JPG 文件3 個部分組成,其中JSON 文本是glTF 的關(guān)鍵,相當(dāng)于檢索目錄,WebGL 通過搜索文本中的屬性字段,可以讀取相應(yīng)的內(nèi)容或數(shù)據(jù)存儲的位置信息,其基礎(chǔ)結(jié)構(gòu)如圖9所示。
圖9 JSON文本結(jié)構(gòu)Fig.9 JSON text structure
在轉(zhuǎn)換過程中,首先組織JSON 文本,由于glTF 坐標(biāo)系和Revit 坐標(biāo)系以及3D Tiles 所使用的WGS84地球坐標(biāo)系存在差異(如圖10所示),因此,需要在節(jié)點(root)中添加一個用于坐標(biāo)系變換的矩陣,先將glTF中的坐標(biāo)系沿X軸正向旋轉(zhuǎn)90°,再將其轉(zhuǎn)換為WGS84坐標(biāo)系。轉(zhuǎn)換矩陣可由式(13)~(18)得到:
圖10 坐標(biāo)系對比Fig.10 Comparison of coordinate systems
式中:(xO,yO,zO)為模型局部坐標(biāo)系原點在WGS-84 坐標(biāo)系中的位置,由模型設(shè)置所處的經(jīng)緯度決定;RX,RY和RZ分別為坐標(biāo)軸X,Y,Z對應(yīng)的自旋矩陣;θX,θY和θZ分別為旋轉(zhuǎn)矢量與坐標(biāo)軸X,Y,Z之間的夾角。
在完成坐標(biāo)系轉(zhuǎn)換之后,依次在mesh(網(wǎng)格)中定義重現(xiàn)模型所需的屬性及其訪問順序,如頂點坐標(biāo)、法線向量、索引、材質(zhì)等;在accessor(訪問器)中定義數(shù)據(jù)類型、數(shù)量以及所在的緩存塊;在bufferView(緩存塊)中定義數(shù)據(jù)在緩存中的字節(jié)偏移量、字節(jié)長度等;在buffer(緩存)中定義二進制(bin)文件路徑以及文件的字節(jié)長度;在material(材質(zhì))中定義材質(zhì)的顏色和透明度;在texture(紋理)中定義sampler(采樣器)和source(圖片資源),并在image(圖像)中定義材質(zhì)貼圖的路徑信息。
JSON 文本組織完成后,按照網(wǎng)格(mesh)中定義的屬性及訪問順序?qū)?yīng)的模型數(shù)據(jù)導(dǎo)出到定義的二進制(bin)文件中,將材質(zhì)貼圖導(dǎo)出到定義的貼圖路徑,從而完成了幾何、外觀數(shù)據(jù)到glTF的轉(zhuǎn)換。
2.2.2 語義映射
為了構(gòu)建完整的三維瓦片b3dm,需要將得到的glTF 文件二進制化,寫入b3dm 文件的Binary glTF 數(shù)據(jù)塊中,并將導(dǎo)出的存儲模型的數(shù)量和語義信息以JSON 文本的形式分別寫入文件的featureTable與batchTable數(shù)據(jù)塊中。同時,為實現(xiàn)語義信息與模型實體的映射,需要在glTF 的mesh模塊中添加“_BATCHID”屬性,指定其在accessor中的訪問順序;在屬性設(shè)定上,保證其數(shù)量和數(shù)據(jù)類型分別與頂點坐標(biāo)的數(shù)量和數(shù)據(jù)索引的數(shù)據(jù)類型相同,從而可通過交互操作查看模型對應(yīng)的語義信息。
高精度的海量三維模型在網(wǎng)絡(luò)端的傳輸和渲染效率受網(wǎng)絡(luò)寬帶以及服務(wù)器的存儲、顯示等性能限制。LOD 技術(shù)是場景中流暢加載海量數(shù)據(jù)的有效解決方案,尤其是動態(tài)LOD 技術(shù),其可以在實時繪制的同時動態(tài)調(diào)取所需的瓦片數(shù)據(jù),且在各個層級細節(jié)間的變化尺度合適,實現(xiàn)了模型的平滑過渡,但缺點是計算量大且復(fù)雜,在對海量數(shù)據(jù)進行調(diào)度時渲染效率較低[18]。因此,本文設(shè)計了自適應(yīng)的八叉樹空間索引結(jié)構(gòu),結(jié)合輕量化處理后得到的不同LOD 的三維瓦片,實現(xiàn)層次結(jié)構(gòu)細節(jié)級別的劃分,并在此基礎(chǔ)上添加視錐體剔除算法,減少動態(tài)渲染過程中的瓦片數(shù)量,從而降低數(shù)據(jù)冗余度、減少內(nèi)存浪費,提高運行效率。
2.3.1 自適應(yīng)八叉樹索引結(jié)構(gòu)
在動態(tài)地理信息應(yīng)用場合,人們常采用LOD和四叉樹結(jié)構(gòu)進行大規(guī)模的地圖模型調(diào)度,但BIM 模型不同于三維地理模型,其模型構(gòu)件之間的位置關(guān)系更加復(fù)雜,僅僅使用二維的四叉樹算法無法很好解決三維立體空間的模型問題[19]。傳統(tǒng)的四叉樹與八叉樹空間索引結(jié)構(gòu)如圖11所示。
圖11 四叉樹與八叉樹索引結(jié)構(gòu)示意圖Fig.11 Schematic diagrams of quadtree and octree structure
本文采用八叉樹結(jié)構(gòu)作為空間索引結(jié)構(gòu)的基礎(chǔ),為了避免模型被子空間邊界所分割,設(shè)計邊界可變的自適應(yīng)八叉樹結(jié)構(gòu),算法如下。
1)初始化根節(jié)點。獲取場景中包含所有模型在內(nèi)的最小包圍體(取為六面體包圍盒,其3 個邊與Revit中坐標(biāo)系的3個坐標(biāo)軸分別平行),并導(dǎo)出LOD1模型與之一起構(gòu)成根節(jié)點的三維瓦片。
2)劃分子空間并調(diào)整邊界。首先,將上一節(jié)點的包圍體劃分為8 個體積相同的子包圍體,然后,分別查看其中的模型是否被邊界切割。若存在切割,則將該子包圍體的邊界向外延伸至完全涵蓋其中的模型;若不存在切割,則將該子包圍體向內(nèi)收縮至剛好涵蓋其中的模型,這樣既保證了包圍體內(nèi)模型的完整性,又減少了空白空間占據(jù)的內(nèi)存容量,同時允許包圍盒之間出現(xiàn)交叉和重疊,使用起來更加靈活方便。最后,調(diào)整邊界后,將各子包圍體內(nèi)的模型根據(jù)上一節(jié)點模型的LOD等級加一后導(dǎo)出,生成該節(jié)點的三維瓦片。
3)判斷當(dāng)前節(jié)點層次。設(shè)置判定條件:若包圍體內(nèi)的模型構(gòu)件數(shù)量小于預(yù)定義的最小包納容量或者模型LOD等級為5,則為葉節(jié)點,結(jié)束整個流程;否則,繼續(xù)劃分包圍體。
4)待所有的葉節(jié)點及其三維瓦片導(dǎo)出,即完成了整個自適應(yīng)八叉樹索引結(jié)構(gòu)的構(gòu)建。
2.3.2 視錐體剔除算法
通過自適應(yīng)的八叉樹索引結(jié)構(gòu),可以實現(xiàn)不同層次結(jié)構(gòu)下不同LOD 模型的快速加載。在此基礎(chǔ)上,添加視錐體剔除算法來控制相機視點及視角的變化,并根據(jù)節(jié)點三維瓦片的位置與幾何誤差來確定是否將其加入渲染的序列,從而進一步提高場景渲染的效率[20]。其算法設(shè)計原理如下。
視錐體剔除算法是指剔除不在視錐作用范圍內(nèi)的模型,即不加載邊界體與視錐之間沒有交集的瓦片數(shù)據(jù),如圖12所示。
圖12 中,O1為瓦片包圍體盒的中心,(xT,yT)為點O1的坐標(biāo),RT為包圍體的近似半徑(六面體為體對角線的一半),θ為視錐體的角度,H為視錐體邊界與O1點的最短距離,可由式(19)推出。
圖12 視錐體剔除示意圖Fig.12 Diagram of view frustum culling
將H與RT進行比較,若H