王志科,黃長偉
(上海欣能信息科技發(fā)展有限公司,上海 200030)
三維可視化系統(tǒng)的研究一直以來是虛擬現(xiàn)實、地理信息系統(tǒng)(GIS)等領(lǐng)域的研究重點。三維場景中大規(guī)模數(shù)據(jù)的展示已經(jīng)成為三維應(yīng)用開發(fā)中必須要解決的問題。對于三維場景中的大規(guī)模數(shù)據(jù),不可能一次性將所有的場景數(shù)據(jù)都加載到內(nèi)存中。雖然可以通過設(shè)置攝像機遠裁剪面的距離來對場景的加載進行一些優(yōu)化,但是在大場景的飛行模擬中,場景視角會比較大,加載到三維場景中的數(shù)據(jù)量很大,渲染效率會下降。
在基于WebGL 的三維可視化系統(tǒng)中,可用3D Tiles、I3S 等數(shù)據(jù)規(guī)范來實現(xiàn)三維場景中大規(guī)模模型數(shù)據(jù)的渲染。3D Tiles 和I3S 規(guī)范均是將三維模型通過樹結(jié)構(gòu)空間索引類型對原始模型在空間上分割、轉(zhuǎn)換等細碎化處理,使得場景中局部的加載壓力降低,提高渲染性能。這種處理方式雖然能夠提升大規(guī)模場景展示的效率,但是仍存在一些問題,例如:生成后的模型再次編輯處理比較困難;在三維場景中展示時對象單體化實現(xiàn)也比較困難;對WebGL 的支持較好,目前在Unity 3D 中沒有可用的方案。
在Unity 3D 中,處理大規(guī)模建筑場景的解決方案主要有Auto LOD,Amplify Impostors 等。
(1)Auto LOD 使用LOD 算法。但是Auto LOD 要求在建模時就要創(chuàng)建出不同精細程度的模型,在三維場景中再配置模型的展示。目前大規(guī)模的建筑場景都是通過GIS 數(shù)據(jù)生成得到的,生成的只有一級精簡模型,這種方法對小場景的精細模型效果較好,但對大規(guī)模城市場景并不適用。
(2)Amplify Impostors 是把場景中的物體通過不同的角度去渲染,生成圖片之后保存下來使用,在場景渲染時,根據(jù)位置直接渲染生成圖片,提高渲染性能。然而這種方法會導(dǎo)致程序占用的內(nèi)存增大,而且對程序中模型拆分比較細的場景渲染效果比較好,但對大規(guī)模建筑場景的渲染提升效果不大。因此,需要研究一種大規(guī)模城市建筑數(shù)據(jù)的處理方法來提升數(shù)據(jù)的加載和渲染效率。
城市建筑輪廓,指的是一個城市的建筑平面輪廓圖。城市建筑輪廓數(shù)據(jù)包含城市范圍內(nèi)的所有建筑輪廓,輪廓可以是一個簡單的矩形,或者是多邊形的封閉區(qū)域,表示這個區(qū)域內(nèi)有棟建筑。通過城市建模輪廓進行三維建筑模型的生成,需要城市建筑輪廓數(shù)據(jù)中包含樓層的高度信息。
建筑輪廓數(shù)據(jù)存儲方式主要為Shapefile 格式。Shapefile 是美國環(huán)境系統(tǒng)研究所(ESRI)開發(fā)的一種空間數(shù)據(jù)的開放格式,已經(jīng)成為地理信息軟件界的一個開放標準。Shapefile 是一種用于存儲地理要素幾何位置和屬性信息的非拓撲簡單格式。Shapefile 中的地理要素可表示為點、線或面(區(qū)域)。Shapefile 的工作空間可以包含dBase表,用于存儲可連接到Shapefile 要素的附加屬性。
本次選取的基礎(chǔ)數(shù)據(jù)為Shapefile 格式的上海建筑輪廓數(shù)據(jù),數(shù)據(jù)中包含建筑樓層數(shù)量信息。在城市建筑數(shù)據(jù)處理部分,首先從城市的Shapefile 數(shù)據(jù)中提取出城市建筑輪廓的幾何數(shù)據(jù)和屬性數(shù)據(jù),然后對數(shù)據(jù)進行預(yù)處理,根據(jù)建筑形狀及樓層數(shù)量等信息,處理生成建筑的白模模型,再根據(jù)白模進行貼圖,生成模型的側(cè)面紋理和頂面紋理,最后對生成的城市建筑模型進行切片處理,導(dǎo)出特定格式的模型文件。
在城市建筑輪廓數(shù)據(jù)中會出現(xiàn)坐標系不匹配、樓層面被錯誤分割等情況,因此在生成城市建筑輪廓數(shù)據(jù)之前,需要對數(shù)據(jù)進行預(yù)處理,數(shù)據(jù)預(yù)處理主要包含:建筑輪廓數(shù)據(jù)坐標系處理、城市建筑面融合與分離、建筑輪廓數(shù)據(jù)邊界處理。
1.2.1 建筑輪廓數(shù)據(jù)坐標系處理
坐標系參考系統(tǒng)(CRS)定義了GIS 中的二維投影地圖與地球上真實地址的映射關(guān)系。一般可將CRS 分為投影坐標參考系統(tǒng)(笛卡爾或直角坐標參考系)和地理坐標參考系統(tǒng)。
地理坐標參考系統(tǒng),也被稱為WGS84, 它使用經(jīng)度、緯度和高度值來描述地球表面上的位置信息。
投影坐標參考系統(tǒng),使用基于X,Y,Z值的坐標系統(tǒng)來描述地球上某個點所處的位置,這個坐標系是從地球的近似橢球體投影得到的,它對應(yīng)于某個地理坐標系。投影有很多方式,不同的投影構(gòu)成了不同的投影坐標系,常見的投影坐標系包括:高斯-克呂格投影坐標系統(tǒng)、Albers 投影坐標系統(tǒng)、Web 墨卡托投影坐標系統(tǒng)。
目前常用坐標系對應(yīng)的歐洲石油調(diào)查組織(EPSG)編碼為EPSG:4326(WGS84)、EPSG:3857(墨卡托投影)、EPSG:4490(CGCS2000)。本次獲取到的上海城市建筑輪廓Shapefile 文件使用的坐標系為EPSG:4236(WGS84),在數(shù)據(jù)處理時所需的坐標系為EPSG:3857(墨卡托投影),因此在生成建筑白模前需要對數(shù)據(jù)的坐標系進行處理。
城市建筑輪廓數(shù)據(jù)坐標系處理比較簡單,可使用ArcGIS 或QGIS 軟件進行處理。本文使用QGIS 軟件處理,處理前需要將Shapefile 文件導(dǎo)入QGIS 圖層中,然后使用圖層導(dǎo)出功能,將圖層要素另存,在另存窗口中填寫保存路徑,并選擇CRS 為EPSG:3857 后點擊確定,即可完成建筑數(shù)據(jù)坐標系統(tǒng)的轉(zhuǎn)換。
1.2.2 城市建筑面融合與分離
城市建筑輪廓基礎(chǔ)數(shù)據(jù)中會出現(xiàn)建筑面被錯誤切分的情況,若不對數(shù)據(jù)進行處理,則會出現(xiàn)生成模型后一棟樓被拆分為多個的情況。這樣不僅不符合實際情況,而且會增加生成建筑模型的三角形頂點數(shù)和面數(shù),增大了三維場景渲染的壓力,因此在生成建筑模型之前需要先將出現(xiàn)問題的數(shù)據(jù)進行處理。處理方法為將具有相同樓層數(shù)并相交的建筑面融合,并將不相交的建筑面分離開。因此,需要對建筑輪廓數(shù)據(jù)進行融合與分離的操作。
ArcGIS 或QGIS 軟件提供了矢量數(shù)據(jù)融合處理的工具,數(shù)據(jù)融合算法采用的是矢量圖層,并將其要素組合成新的要素??梢灾付ㄒ粋€或多個屬性融合于同一類的要素,也可以將所有的要素融合為單個要素。融合過程中所輸出的幾何圖形都將轉(zhuǎn)換為多個幾何圖形,如果輸入的是多邊形圖層,將擦除被融合的鄰接多邊形的公共邊界。融合過程中,啟用“將不可相交的要素分開”,可在融合后將不相交的建筑面進行分離[1]。
1.2.3 建筑輪廓數(shù)據(jù)邊界處理
將建筑輪廓數(shù)據(jù)融合、分離處理完成后,需要進行數(shù)據(jù)渲染將數(shù)據(jù)拆分處理。本次數(shù)據(jù)處理中可以根據(jù)行政邊界將建筑輪廓數(shù)據(jù)進行分割處理。數(shù)據(jù)邊界處理方法為相交處理,相交算法是提取輸入圖層和疊加圖層中矢量要素的重疊部分,輸出相交圖層中的要素及屬性信息[1]。
將城市建筑輪廓數(shù)據(jù)導(dǎo)入QGIS 軟件中,并將上海各個區(qū)縣行政邊界也同時導(dǎo)入其中。選取地理處理工具中的相交功能,在相交功能里選擇建筑輪廓數(shù)據(jù)圖層為輸入圖層,選擇行政邊界圖層作為疊加圖層,選取需要保留的屬性字段后,點擊運行,執(zhí)行完成后即可將建筑輪廓和區(qū)域邊界融合。
使用分割矢量圖層的功能,選取上一步處理過的模型,通過區(qū)域邊界中的區(qū)縣字段進行分割,分割完成后,輸出各個區(qū)段的Shapefile 文件,隨后可以進行城市建筑模型的構(gòu)建。
通過三維建模工具,可以生成城市建筑模型,再使用Blender GIS 插件完成城市建筑白模的快速生成。Blender 是一款免費開源的三維圖形圖像處理軟件,提供了從建模、動畫、材質(zhì)、渲染到音頻處理、視頻裁剪等一系列的數(shù)據(jù)處理解決方案。Blender GIS 是Blender 中的一款插件,提供了GIS數(shù)據(jù)文件的導(dǎo)入,支持大多數(shù)公共GIS 數(shù)據(jù)格式,如:Shapefile 矢量數(shù)據(jù)、光柵圖像、GeoTiff DEM、OpenStreetMap xml 等。
使用Blende GIS 導(dǎo)入工具中的Shapefile 導(dǎo)入功能,選擇處理后的Shapefile 文件,導(dǎo)入數(shù)據(jù)類型選擇幾何數(shù)據(jù),擴展字段選擇基面(向下取整),其他保持默認,點擊確定,等待處理完成即可。導(dǎo)入的一個Shapefile 文件,會生成一個對象節(jié)點的城市建筑模型,若要將城市建筑單體分開,需要在導(dǎo)入時勾選分割對象。
城市建筑模型導(dǎo)入后,默認的樓層高度是1 m,故需要對建筑的高度進行調(diào)整,通過模型對象變換中的縮放,調(diào)整Z軸縮放為單層樓房的高度即可。
城市建筑白模生成后,還需要對樓的模型進行側(cè)面貼材質(zhì)和頂面貼材質(zhì)處理,由于生成模型時整個城市為單獨的一個對象,因此在模型處理時需要將模型進行拆分處理,將建筑模型的樓頂面和樓體側(cè)面分離,然后再在分離后的模型上進行貼紋理等操作。
1.4.1 城市建筑模型面分離
由于生成的城市建筑白模屬于同一個對象,在三維建模軟件中不能單獨選取進行操作,需要將建筑模型的頂面與側(cè)面進行分離。通過分析,只需要將建筑模型的頂面單獨提取拆分出來,即可以實現(xiàn)頂面與側(cè)面的分離工作,在Blender 工具中,可在編輯模式下選取一個面或多個面,但如果操作方法不當,會導(dǎo)致選取的頂面不全或者選取的側(cè)面不對。研究發(fā)現(xiàn),所有的頂面都擁有相同的法向量,通過在場景中選取一個建筑的頂面,然后使用相似選取功能中的法向相似,即可達到選取所有頂面的目的,并且不會出現(xiàn)錯誤或者遺漏的情況[2],選取結(jié)果如圖1 所示。
圖1 城市建筑模型面分離選取結(jié)果
完成頂面的選取后,可通過面的拆分或分離功能,實現(xiàn)對建筑模型頂面和側(cè)面的拆分或分離工作。
1.4.2 城市建筑模型材質(zhì)貼圖
建筑模型頂面與側(cè)面分離完成后,需要對模型進行材質(zhì)貼圖。模型貼圖需要對頂面和側(cè)面分別進行UV 貼圖操作。
樓體側(cè)面貼圖處理流程如下。
(1)新建一個名稱為側(cè)面的材質(zhì);
(2)進入編輯模式,通過特征選取工具,按照側(cè)面特征選取場景中所有建筑的側(cè)面;
(3)通過柱面投影,進行所有建筑側(cè)面的UV映射;
(4)通過樓層高度和貼圖的大小,計算UV 位置及縮放比例;
(5)給選中的建筑側(cè)面指定側(cè)面材質(zhì)。
樓體頂面貼圖處理流程如下:
(1)新建一個名稱為頂面的材質(zhì);
(2)進入編輯模式,通過相似選取工具,按照法向量相同特征選取場景中所有建筑的頂面;
(3)通過視角投影,進行所有建筑頂面的UV映射;
(4)調(diào)整UV 位置及縮放比例;
(5)給選中的建筑頂面指定頂面材質(zhì)。
Unity 3D 是由Unity Technologies 公司開發(fā)的一個讓玩家輕松創(chuàng)建諸如三維視頻游戲、建筑可視化、實時三維動畫等類型互動內(nèi)容的多平臺綜合型游戲開發(fā)工具。
Unity 3D 可以運行在Windows 和MacOS下,可將程序打包發(fā)布至Windows,Mac,iPhone,Android,Web GL 等平臺,是一個全面整合的專業(yè)的游戲引擎。
VRS 平臺是基于Unity 3D 打造的一個虛擬現(xiàn)實電網(wǎng)生產(chǎn)管理平臺,平臺在Unity 3D 的基礎(chǔ)上引入了數(shù)字地球、衛(wèi)星影像、地理高程等三維GIS 平臺的基礎(chǔ)支撐應(yīng)用,還增加了針對變電站、架空線路、地下電纜等業(yè)務(wù)應(yīng)用的實用化功能。
城市建筑數(shù)據(jù)在三維場景中展示,能夠使三維場景內(nèi)容更豐富,更能夠真實還原出周圍環(huán)境的真實情況。然而在三維場景中渲染海量城市模型,會導(dǎo)致需要渲染的三角面數(shù)增加,增加系統(tǒng)渲染的壓力,因此需要有對應(yīng)的算法優(yōu)化渲染過程,解決海量數(shù)據(jù)加載可能導(dǎo)致的卡頓問題。
渲染是由一個三維場景出發(fā),生成一張二維圖像的過程,計算機需要從一系列的頂點數(shù)據(jù)、紋理數(shù)據(jù)等開始,把這些信息最終轉(zhuǎn)換成一張人眼可以看到的圖像,這個工作通常是由CPU 和GPU 共同完成的??梢园延嬎銠C的渲染過程分為3 個階段:應(yīng)用階段、幾何階段、光柵化階段[3]。
應(yīng)用階段由應(yīng)用程序主導(dǎo),由CPU 負責實現(xiàn),此階段需要準備好場景數(shù)據(jù),如攝像機位置、場景中包含哪些模型、使用的光源特效等,為了提升渲染性能,還需要進行一個粗粒度的剔除工作,將場景中不可見的物體剔除出去,從而減少渲染的數(shù)據(jù)量。此階段完成后,輸出的結(jié)果為包含點、線、三角面等數(shù)據(jù)的渲染圖元[3]。
幾何階段由GPU 負責,處理所有和需要繪制的幾何相關(guān)的內(nèi)容,會對渲染圖元進行逐點、逐多邊形的操作,將頂點坐標變換到屏幕空間中,輸出屏幕空間的二維頂點坐標、每個頂點對應(yīng)的深度值、著色等相關(guān)信息,并傳遞到下一階段。
光柵化階段是根據(jù)屏幕上的像素渲染出最終的圖像。此階段需要對上一階段得到的逐點數(shù)據(jù)進行插值,然后再進行逐像素處理,最終決定每個渲染圖元中的哪些像素應(yīng)該被繪制在屏幕上[3]。
在三維場景的渲染流程中,CPU 與GPU 間的通信會使用一個命令緩沖區(qū),Draw Call 就是其中命令的一種,提交大量很小的Draw Call,會造成CPU 的性能瓶頸。因此,在三維場景渲染時,需要減少Draw Call 的開銷,避免使用大量很小的網(wǎng)格,同時避免使用過多的材質(zhì),進而提升渲染效率[4]。
要在三維場景中實現(xiàn)高效、穩(wěn)定地渲染大量的城市建筑、地形地貌等地理信息系統(tǒng)數(shù)據(jù),需研究一套有效的三維場景數(shù)據(jù)管理方法。
在三維場景中渲染大批量數(shù)據(jù)時,如果只是用List 將渲染對象存儲,然后送入GPU 進行渲染,這種方式雖然簡單,但渲染效率很低。目前比較好的方法是使用具有層次結(jié)構(gòu)的空間數(shù)據(jù)結(jié)構(gòu)存儲待渲染的物體,如包圍體層次結(jié)構(gòu)(BVH)、二叉空間分割(BSP)樹、四叉樹、八叉樹和模糊K-D 樹等,在進行空間查找時將時間復(fù)雜度從O(n)降低到O(lgn)[5]。
BVH 是包含一組物體的空間體,它要比所包含的幾何物體形狀簡單得多,所以在使用包圍體進行碰撞檢測等操作時比使用物體本身更快。常見的包圍體有軸對齊包圍盒(AABB),有向包圍盒(OBB),以及離散定向多面體(k-DOP)。
對于三維場景的實時渲染來說,BVH 是最常使用的數(shù)據(jù)結(jié)構(gòu),例如BVH 經(jīng)常用于視椎體裁剪。場景以層次樹形結(jié)構(gòu)進行組織,包含一個根節(jié)點、內(nèi)部節(jié)點和葉子節(jié)點。最高節(jié)點是根,沒有父節(jié)點;葉子節(jié)點保存著需要繪制的實際幾何體(BVH 只能存儲幾何體,實際渲染的物體除了幾何屬性還有其他屬性,一般使用場景圖表示)。樹中的每個節(jié)點,包括葉子節(jié)點,都有一個包圍體,可以將其子樹的所有幾何體包圍起來。
在場景中的物體移動時,需要對BVH 進行更新。如果物體移動以后仍然在原先的包圍體內(nèi),則不需要更新;若不在原先的包圍體內(nèi),則需要刪除這個物體所在節(jié)點,并重新計算其父節(jié)點的包圍體,然后從根節(jié)點開始,以遞歸形式將這個節(jié)點插入這棵樹中。另一種方法則是以遞歸形式增大父節(jié)點的包圍體,直到這個包圍體可以包含這個子節(jié)點為止。無論使用哪種方法,隨著編輯操作的增多,這棵樹會變得越來越不平衡,效率也會越來越低。
在計算機圖形學(xué)中,BSP 樹有兩種不同的形式:軸對齊(axis-aligned)和多邊形對齊(polygonaligned)。要創(chuàng)建BSP 樹,首先用一個平面將空間一分為二,然后將幾何體按類別劃分到這兩個空間中,隨后以遞歸形式反復(fù)進行這個過程。這種樹有一個非常有趣的特性,如果按照一定的方式對樹進行遍歷,那么會從某個視點將這棵樹包含的幾何體進行排序(對于軸對齊的方式來說,它是粗略的排序;對于多邊形對齊方式來說,它是準確的排序)。
八叉樹類似軸對齊BSP 樹。沿著軸對齊包圍盒的3 條軸對其進行分割,分割點必須位于包圍盒的中心點,以這種方式生成8 個新的包圍盒。八叉樹通過將整個場景包含在一個最小的軸對齊包圍盒中進行構(gòu)造,遞歸分割,直到達到最大遞歸層次或包圍盒中包含的圖元小于某個閾值。八叉樹的使用方式與軸對齊BSP 樹一樣,可以處理同類型的查詢,也可以用于遮擋裁剪算法中。八叉樹具有規(guī)則的結(jié)構(gòu),有些查詢會比BSP 樹更高效。
在八叉樹結(jié)構(gòu)中,通常將物體保存在葉子節(jié)點中,其中有些物體必須保存在多個葉子節(jié)點中。這種做法的一個最大弊端就是數(shù)據(jù)量增大,而如果使用指針,則會導(dǎo)致八叉樹的編輯變得更加困難?!八缮⒌陌瞬鏄洹彼惴▽@個問題進行了改進。
海量的城市模型場景,屬于大規(guī)模的室外場景,場景中的物體比較分散,而且沒有出現(xiàn)太多遮擋的情況,由于不用存儲分割平面位置,使用八叉樹這種規(guī)則的空間結(jié)構(gòu)能夠提高效率,因此在進行城市場景管理時經(jīng)常使用八叉樹結(jié)構(gòu)進行數(shù)據(jù)管理。
對于海量城市模型的渲染,根據(jù)對三維渲染過程的分析,設(shè)計城市模型數(shù)據(jù)存儲結(jié)構(gòu),對數(shù)據(jù)進行拆分處理,同時根據(jù)數(shù)據(jù)分頁技術(shù),提高對模型渲染狀態(tài)的管理效率,實現(xiàn)動態(tài)加載、卸載模型,進而實現(xiàn)大規(guī)模城市建筑模型的渲染。
遮擋剔除算法,是預(yù)先計算出一組潛在的可見候選多邊形,然后在運行時編制索引,以便快速獲得可見幾何體的估計值。具體實現(xiàn)步驟如下。
(1)將地圖場景切割成Tile,再將Tile 切割成Portal(視口)和Cell(大物件、中物件、小物件)。
(2)檢測場景物件所屬Cell,一個物件可以屬于多個Cell。
(3)利用蒙特卡洛方法Portal 隨機一些起點,Cell 隨機一些終點(根據(jù)大、中、小隨機不同數(shù)量的點)。
(4)雙層遍歷每個Portal 和Cell,射線檢測是否阻擋,如果阻擋,判斷阻擋物是否在當前檢測Cell內(nèi),如果是,Cell可見;如果不是,Cell不可見。
(5)保存檢測數(shù)據(jù),運行時加載解析,根據(jù)位置檢測當前Portal,然后遍歷場景所有Cell 內(nèi)Item,判斷顯示和隱藏。
這種方式進行裁剪,更適合大地圖場景操作,能夠支持動態(tài)加載,占用內(nèi)存也可忽略不計,同時消耗的CPU 也比較少。
在城市三維場景中,可以采用數(shù)據(jù)分頁的方式進行三維場景的動態(tài)調(diào)度。數(shù)據(jù)分頁是指隨著窗口視角范圍的不斷變化,場景中只加載和渲染當前視角窗口范圍內(nèi)的數(shù)據(jù),并將離開視角范圍內(nèi)的數(shù)據(jù)進行清理或者設(shè)置其他的數(shù)據(jù)卸載策略,使得這部分數(shù)據(jù)不再渲染。這樣能夠保證內(nèi)存中只有有限的數(shù)據(jù)量,場景中的每一幀也只有有限的數(shù)據(jù)被送到圖形渲染管道,從而提升渲染性能。
數(shù)據(jù)分頁算法設(shè)計如下。
(1)服務(wù)端設(shè)定一個分頁參數(shù),將場景數(shù)據(jù)按照經(jīng)緯度位置進行數(shù)據(jù)分頁加載配置,并將場景數(shù)據(jù)按照分頁配置,加載到Redis 內(nèi)存庫中保存。
(2)客戶端通過攝像機當前所處的經(jīng)緯度位置進行分頁數(shù)據(jù)計算,根據(jù)視野的最遠裁剪面和當前位置,計算出在攝像機可視范圍內(nèi)的分頁。
(3)客戶端向服務(wù)端請求相關(guān)的分頁數(shù)據(jù),并將分頁場景數(shù)據(jù)保存至客戶端內(nèi)存中。
(4)客戶端根據(jù)內(nèi)存中的分頁場景數(shù)據(jù)進行判斷,卸載掉不在視野范圍內(nèi)的數(shù)據(jù),并裝載新增加在視野范圍內(nèi)的數(shù)據(jù)。
(5)客戶端將變化后的內(nèi)存分頁數(shù)據(jù)進行處理并在三維場景中渲染。
本文主要研究了如何通過城市的GIS 數(shù)據(jù),生成大規(guī)模的城市建筑模型,并提出了一種海量城市模型三維場景的管理方法,實現(xiàn)了大規(guī)模城市建筑模型數(shù)據(jù)的可視化渲染,并提高了場景渲染效率,具有一定的實用價值。
在以后的研究中將繼續(xù)對數(shù)據(jù)處理方法進行精簡,編寫數(shù)據(jù)處理插件,完善城市模型快速構(gòu)建的方法。