黃 鴻,趙志鵬,張 磊
(廣州都市圈網(wǎng)絡(luò)科技有限公司,廣東 廣州 510000)
隨著對地觀測技術(shù)的快速發(fā)展,地理信息數(shù)據(jù)每天以TB量級增加[1]。三維城市模型數(shù)據(jù)作為三維GIS的重要內(nèi)容,在數(shù)字城市和智慧城市建設(shè)過程中發(fā)揮著重要作用。建筑物三維模型作為一種重要的地物,在三維城市展現(xiàn)和應(yīng)用中具有關(guān)鍵的作用,但其海量的數(shù)據(jù)給存儲和網(wǎng)絡(luò)傳輸都帶來了極大的挑戰(zhàn)?,F(xiàn)如今HTML 5和WebGL技術(shù)在瀏覽器端得到了更好的支持,WebGIS對海量數(shù)據(jù)渲染能力越來越強(qiáng),逐漸替代傳統(tǒng)桌面端成為主流的GIS應(yīng)用形式。因此對建筑物三維數(shù)據(jù)進(jìn)行壓縮,以適應(yīng)網(wǎng)絡(luò)的傳輸具有迫切的需求。
在眾多三維模型生成文件中,OBJ格式是常用的三維文件格式,針對OBJ文件的壓縮方法目前分為有損壓縮和無損壓縮兩種[2]。有損壓縮采用模型化簡的方法對模型的網(wǎng)格和貼圖進(jìn)行化簡[3];而無損壓縮在數(shù)據(jù)經(jīng)過壓縮后,信息不受損失[2],通用的二進(jìn)制無損壓縮在瀏覽器端缺少廣泛的兼容性,但是針對OBJ文件的文本形式的無損壓縮的研究較少。本文在分析建筑物數(shù)據(jù)存儲特征的基礎(chǔ)上,針對面向建筑物的三維OBJ文件的無損壓縮方法進(jìn)行研究。
OBJ文件是一種采用文本形式存儲的三維模型格式,其結(jié)構(gòu)簡單,采用單純的字典狀結(jié)構(gòu)排列[4]。OBJ文件本身只存儲幾何網(wǎng)格信息而不含模型的顏色材質(zhì)等信息,但可以擴(kuò)展引用材質(zhì)庫MTL(mtllib)。OBJ和MTL文件在數(shù)據(jù)存儲方面存在如下4個方面的問題,對每個問題可以進(jìn)行針對性的優(yōu)化,從而達(dá)到數(shù)據(jù)壓縮的目的:
(1) 說明信息占據(jù)較大空間。此部分非模型信息,可刪除。
(2) 材質(zhì)信息未能索引化。OBJ文件通過引用MTL表達(dá)材質(zhì)信息,MTL中每個材質(zhì)單獨記錄,鍵和值存在重復(fù)記錄,可通過鍵和值的索引化解決重復(fù)記錄的問題。
(3) 建筑物頂點數(shù)據(jù)存在較多重復(fù)。值得指出的是本文研究的建筑物為普通規(guī)則建筑物,而非形狀復(fù)雜的特種建筑,規(guī)則建筑物具有如下3個基本特征:①建筑物立面垂直于地面;②建筑物表面平滑;③建筑物轉(zhuǎn)角為直角。具有這3個特征的建筑物模型的頂點坐標(biāo)由于共面在單個維度上會存在大量的重復(fù),需要針對性地對這些重復(fù)坐標(biāo)數(shù)據(jù)進(jìn)行簡化存儲。
(4) 面信息中的索引過長。OBJ中面存儲的是頂點索引,隨著頂點數(shù)量的增加,索引存儲的位數(shù)也逐漸增加,從而占用較多的存儲空間。
本文提出的無損壓縮方法需要對OBJ進(jìn)行重新組織,為便于描述,本文將壓縮合并的文件區(qū)塊稱為壓縮區(qū)塊,將壓縮合并前的原始文件區(qū)塊稱為原始區(qū)塊。壓縮區(qū)塊的數(shù)據(jù)格式由3部分組成。
(1) 索引化的材質(zhì)塊。材質(zhì)塊分為頭部、材質(zhì)參數(shù)字典和數(shù)據(jù)塊3部分。材質(zhì)頭包含材質(zhì)標(biāo)識(MTL)、材質(zhì)字典的個數(shù)和材質(zhì)的個數(shù),如圖1中“1”所示。材質(zhì)參數(shù)字典包含當(dāng)前模型文件引用到的所有材質(zhì)參數(shù)及相應(yīng)可用的參數(shù)值,如圖1中“2”所示。數(shù)據(jù)塊中包含模型引用的所有材質(zhì)信息,每條材質(zhì)數(shù)據(jù)的參數(shù)個數(shù)與材質(zhì)參數(shù)字典中參數(shù)的個數(shù)一致,每個參數(shù)對應(yīng)的值為材質(zhì)參數(shù)字典中可用參數(shù)值的引用索引,如果當(dāng)前值不存在則采用“#”填充。
圖1 索引化材質(zhì)塊
(2) 折疊收縮后的點塊。點塊中包含幾何網(wǎng)格的頂點、法線及貼圖坐標(biāo),點塊以“VD”標(biāo)識點塊的開始,如圖2中“4”所示。其中頂點部分的起始頭部為“V”+頂點數(shù)據(jù)的行數(shù),緊接著是收縮后的頂點數(shù)據(jù),每行中的“;”表示一級收縮片段,具體的格式為z;y x0 x1 x2 ...,如圖2中“5”所示。其余的法線和貼圖坐標(biāo)采用相同的原理進(jìn)行數(shù)據(jù)組織,經(jīng)過這樣的收縮對于比較規(guī)整的模型數(shù)據(jù)能夠得到很高的數(shù)據(jù)壓縮率。
(3) 基準(zhǔn)+偏移存儲的面塊。面塊的起始位置包含一個面塊的說明頭部,由標(biāo)識符“VF”和面的個數(shù)組成,如圖3中“8”所示。第二部分是以“G”開頭的組說明,組中還包含了組名及組的個數(shù),如圖3中“9”所示。第三部分是指定材質(zhì),以“UM”標(biāo)識,第二位為材質(zhì)在索引材質(zhì)塊中數(shù)據(jù)部分的索引值,根據(jù)該索引可以直接找到相應(yīng)的材質(zhì)值,第三位是當(dāng)前面塊下所有面索引的基準(zhǔn)值,該值當(dāng)前面塊索引分量的最小值,如圖3中“10”所示。最后一部分是面塊的數(shù)據(jù)部分,該部分每行表示一個面,每個分量記錄的是相對于基準(zhǔn)值的偏移值,如圖3中“11”所示,在數(shù)據(jù)讀取的過程中只要將偏移值和基準(zhǔn)值進(jìn)行相加便可得到真實的頂點數(shù)據(jù)的索引值。
圖2 折疊收縮后的點塊
圖4 材質(zhì)索引化的過程
圖5 面塊中材質(zhì)索引化的過程
本文的試驗分為兩個步驟:①對原始數(shù)據(jù)進(jìn)行壓縮,一共選取某單位的兩組三維模型數(shù)據(jù)進(jìn)行試驗。一組為連體的建筑物,這棟建筑物屬于正常的規(guī)則建筑物;另外一組為不規(guī)則地面數(shù)據(jù),采用不同的數(shù)據(jù)類別來驗證本方法在實際使用中的效果。②前端引擎可視化。本文選擇目前在前端三維可視化方面應(yīng)用比較廣泛的Three.js引擎作為數(shù)據(jù)渲染的基礎(chǔ)框架,硬件環(huán)境為Intel(R) Core(TM) i5-5200U CPU @ 2.20 GHz 2.19 GHz。為了能夠解析壓縮后的數(shù)據(jù)格式,本文為此開發(fā)了一套Three.js的壓縮數(shù)據(jù)加載插件CompressLoader,以保證數(shù)據(jù)能夠被正確加載。
分別將選定的建筑物和地面數(shù)據(jù)命名為Building和Base。根據(jù)壓縮結(jié)果可以看出規(guī)則建筑物的壓縮比優(yōu)于不規(guī)則建筑物,其中頂點行數(shù)的壓縮起到了關(guān)鍵的作用,規(guī)則的建筑物頂點可以被很好地折疊與收縮,減少重復(fù)記錄的空間,但是對于不規(guī)則地物的頂點折疊收縮的效果就沒有那么的明顯。
表1 Building和Base壓縮統(tǒng)計信息
使用Three.js進(jìn)行數(shù)據(jù)加載和可視化,如圖6所示,本文只統(tǒng)計文件在瀏覽器端內(nèi)容加載的時間,即Content Download的時間,對于網(wǎng)絡(luò)加載時間本文采用多次測量取平均值的方法進(jìn)行測量,記錄了20次結(jié)果的平均值,保證結(jié)果準(zhǔn)確可靠。通過表2統(tǒng)計的結(jié)果可以看出壓縮后的文件體積減小,網(wǎng)絡(luò)傳輸效率有明顯的提高。
圖6 Building和Base數(shù)據(jù)在Three.js中的可視化效果
數(shù)據(jù)名原始數(shù)據(jù)加載時間壓縮數(shù)據(jù)加載時間Building765.468425.261Base712.344489.224
在分析建筑物數(shù)據(jù)特征的基礎(chǔ)上,針對原始OBJ文件結(jié)構(gòu)冗余、體積過大、網(wǎng)絡(luò)傳輸效率低的不足,提出OBJ文件無損壓縮數(shù)據(jù)模型及OBJ文件到壓縮格式的轉(zhuǎn)換方法,并結(jié)合三維引擎Three.js進(jìn)行可視化驗證。試驗表明: 該壓縮方法針對規(guī)則建筑物能夠起到有效的壓縮效果,提高數(shù)據(jù)傳輸效率,但是對于不規(guī)則的地物數(shù)據(jù)壓縮效果還不理想,這也是后續(xù)需要深入研究的課題。