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