黃 鴻,趙志鵬,張 磊
(廣州都市圈網絡科技有限公司,廣東 廣州 510000)
隨著對地觀測技術的快速發展,地理信息數據每天以TB量級增加[1]。三維城市模型數據作為三維GIS的重要內容,在數字城市和智慧城市建設過程中發揮著重要作用。建筑物三維模型作為一種重要的地物,在三維城市展現和應用中具有關鍵的作用,但其海量的數據給存儲和網絡傳輸都帶來了極大的挑戰。現如今HTML 5和WebGL技術在瀏覽器端得到了更好的支持,WebGIS對海量數據渲染能力越來越強,逐漸替代傳統桌面端成為主流的GIS應用形式。因此對建筑物三維數據進行壓縮,以適應網絡的傳輸具有迫切的需求。
在眾多三維模型生成文件中,OBJ格式是常用的三維文件格式,針對OBJ文件的壓縮方法目前分為有損壓縮和無損壓縮兩種[2]。有損壓縮采用模型化簡的方法對模型的網格和貼圖進行化簡[3];而無損壓縮在數據經過壓縮后,信息不受損失[2],通用的二進制無損壓縮在瀏覽器端缺少廣泛的兼容性,但是針對OBJ文件的文本形式的無損壓縮的研究較少。本文在分析建筑物數據存儲特征的基礎上,針對面向建筑物的三維OBJ文件的無損壓縮方法進行研究。
OBJ文件是一種采用文本形式存儲的三維模型格式,其結構簡單,采用單純的字典狀結構排列[4]。OBJ文件本身只存儲幾何網格信息而不含模型的顏色材質等信息,但可以擴展引用材質庫MTL(mtllib)。OBJ和MTL文件在數據存儲方面存在如下4個方面的問題,對每個問題可以進行針對性的優化,從而達到數據壓縮的目的:
(1) 說明信息占據較大空間。此部分非模型信息,可刪除。
(2) 材質信息未能索引化。OBJ文件通過引用MTL表達材質信息,MTL中每個材質單獨記錄,鍵和值存在重復記錄,可通過鍵和值的索引化解決重復記錄的問題。
(3) 建筑物頂點數據存在較多重復。值得指出的是本文研究的建筑物為普通規則建筑物,而非形狀復雜的特種建筑,規則建筑物具有如下3個基本特征:①建筑物立面垂直于地面;②建筑物表面平滑;③建筑物轉角為直角。具有這3個特征的建筑物模型的頂點坐標由于共面在單個維度上會存在大量的重復,需要針對性地對這些重復坐標數據進行簡化存儲。
(4) 面信息中的索引過長。OBJ中面存儲的是頂點索引,隨著頂點數量的增加,索引存儲的位數也逐漸增加,從而占用較多的存儲空間。
本文提出的無損壓縮方法需要對OBJ進行重新組織,為便于描述,本文將壓縮合并的文件區塊稱為壓縮區塊,將壓縮合并前的原始文件區塊稱為原始區塊。壓縮區塊的數據格式由3部分組成。
(1) 索引化的材質塊。材質塊分為頭部、材質參數字典和數據塊3部分。材質頭包含材質標識(MTL)、材質字典的個數和材質的個數,如圖1中“1”所示。材質參數字典包含當前模型文件引用到的所有材質參數及相應可用的參數值,如圖1中“2”所示。數據塊中包含模型引用的所有材質信息,每條材質數據的參數個數與材質參數字典中參數的個數一致,每個參數對應的值為材質參數字典中可用參數值的引用索引,如果當前值不存在則采用“#”填充。

圖1 索引化材質塊
(2) 折疊收縮后的點塊。點塊中包含幾何網格的頂點、法線及貼圖坐標,點塊以“VD”標識點塊的開始,如圖2中“4”所示。其中頂點部分的起始頭部為“V”+頂點數據的行數,緊接著是收縮后的頂點數據,每行中的“;”表示一級收縮片段,具體的格式為z;y x0 x1 x2 ...,如圖2中“5”所示。其余的法線和貼圖坐標采用相同的原理進行數據組織,經過這樣的收縮對于比較規整的模型數據能夠得到很高的數據壓縮率。
(3) 基準+偏移存儲的面塊。面塊的起始位置包含一個面塊的說明頭部,由標識符“VF”和面的個數組成,如圖3中“8”所示。第二部分是以“G”開頭的組說明,組中還包含了組名及組的個數,如圖3中“9”所示。第三部分是指定材質,以“UM”標識,第二位為材質在索引材質塊中數據部分的索引值,根據該索引可以直接找到相應的材質值,第三位是當前面塊下所有面索引的基準值,該值當前面塊索引分量的最小值,如圖3中“10”所示。最后一部分是面塊的數據部分,該部分每行表示一個面,每個分量記錄的是相對于基準值的偏移值,如圖3中“11”所示,在數據讀取的過程中只要將偏移值和基準值進行相加便可得到真實的頂點數據的索引值。

圖2 折疊收縮后的點塊


圖4 材質索引化的過程

圖5 面塊中材質索引化的過程
本文的試驗分為兩個步驟:①對原始數據進行壓縮,一共選取某單位的兩組三維模型數據進行試驗。一組為連體的建筑物,這棟建筑物屬于正常的規則建筑物;另外一組為不規則地面數據,采用不同的數據類別來驗證本方法在實際使用中的效果。②前端引擎可視化。本文選擇目前在前端三維可視化方面應用比較廣泛的Three.js引擎作為數據渲染的基礎框架,硬件環境為Intel(R) Core(TM) i5-5200U CPU @ 2.20 GHz 2.19 GHz。為了能夠解析壓縮后的數據格式,本文為此開發了一套Three.js的壓縮數據加載插件CompressLoader,以保證數據能夠被正確加載。
分別將選定的建筑物和地面數據命名為Building和Base。根據壓縮結果可以看出規則建筑物的壓縮比優于不規則建筑物,其中頂點行數的壓縮起到了關鍵的作用,規則的建筑物頂點可以被很好地折疊與收縮,減少重復記錄的空間,但是對于不規則地物的頂點折疊收縮的效果就沒有那么的明顯。

表1 Building和Base壓縮統計信息
使用Three.js進行數據加載和可視化,如圖6所示,本文只統計文件在瀏覽器端內容加載的時間,即Content Download的時間,對于網絡加載時間本文采用多次測量取平均值的方法進行測量,記錄了20次結果的平均值,保證結果準確可靠。通過表2統計的結果可以看出壓縮后的文件體積減小,網絡傳輸效率有明顯的提高。

圖6 Building和Base數據在Three.js中的可視化效果

數據名原始數據加載時間壓縮數據加載時間Building765.468425.261Base712.344489.224
在分析建筑物數據特征的基礎上,針對原始OBJ文件結構冗余、體積過大、網絡傳輸效率低的不足,提出OBJ文件無損壓縮數據模型及OBJ文件到壓縮格式的轉換方法,并結合三維引擎Three.js進行可視化驗證。試驗表明: 該壓縮方法針對規則建筑物能夠起到有效的壓縮效果,提高數據傳輸效率,但是對于不規則的地物數據壓縮效果還不理想,這也是后續需要深入研究的課題。