丁晶,秦亮軍
(廣州市城市規劃勘測設計研究院,廣東廣州 510060)
移動三維地圖作為一種新的地圖應用模式,可被簡單定義為是在各種移動終端上,使用三維可視化技術,充分考慮人性化的空間信息的表達方式,為用戶提供有效的、直觀的移動信息服務的地圖[1]。目前,移動三維地圖已成為地理信息服務的重要方面。
但是現有的大多數移動地圖還只支持二維圖元,或采用平面接合或多面貼圖的技術生成模型,反映抽象的平面位置信息,真正實現3D技術的系統比較少見[2]。實現移動三維地圖的關鍵就是移動環境下三維場景的實時顯示,即必須以一定的刷新頻率實現場景畫面的連續性,通常為20幀/秒~30幀/秒,至少不能低于10幀/秒,這個在桌面系統里已經解決的問題是三維地圖轉移到移動環境中面臨的難題。
從現有的研究情況看,主要從三個環節尋求解決辦法:一是數據從外存儲器到內存階段,通過數據的有效組織、細節層次預處理、視景體剔除、內存的合理調度等縮短讀數據的時間;二是通過使用傳輸速率高的無線接入IP網絡的方式提高數據傳輸速度,減少用戶等待時間;三是數據在內存中的繪制階段,通過多邊形簡化、多分辨率模型等技術縮短繪制時間。實現城市三維地圖在移動設備上的實時顯示時必須要綜合考慮以上幾個方面。只有三個環節都得到有效改進并且相互協調,才能突破移動環境硬件資源的限制,滿足應用的需要[3]。由于第二環節主要靠硬件技術的突破,因此本文主要從第一、三環節入手,考慮數據組織和實時渲染算法來提高移動三維地圖的實時顯示速度。
構建三維場景所涉及的數據主要有:大量的地形數據、二維矢量圖形、三維模型數據、屬性數據、紋理數據等。這些數據量一般是二維地圖數據量的幾十倍甚至是上百倍[4]。對于桌面環境的城市三維地圖而言,目前已經有非常合理科學的海量數據組織、存儲和管理方案,例如金字塔模型和LOD技術[5]。本文接下來針對移動環境中的數據組織展開討論,其中LOD模型是實時可視化的關鍵,數據分層是地理信息顯示、查詢、分析的前提,數據分塊是在數據分層的基礎上將場景分割成多個子場景,這樣在場景中漫游時,當前顯示區域的總數據量不會很大,以保證實時瀏覽的連續流暢。
LOD模型是指根據不同的顯示對同一個物體采用不同精度的幾何描述,物體的細節層次越高,則數據量越大,描述得越精細;細節層次越低,則數據量越小,描述得越粗糙。LOD模型在幾何結構上大致可以分離散LOD、連續LOD和多分辨率LOD。在進行場景建模時,由于地物景觀豐富,采用連續LOD不太現實,我們選擇建立多級LOD模型。但是,如果LOD層次太多會導致頻繁地讀取不同細節層次模型數據,影響實時繪制的流暢性;LOD層次太少會導致不同等級切換有明顯的突變現象。目前,多級LOD建模并沒有統一標準,它和應用需求精度、可視化場景的大小以及地物的復雜程度及聚集程度等密切相關,因此多級模型的視覺連續性成為建模時需要考慮的一個重要因素。
三維模型的LOD實質上可以理解為城市三維地圖的分辨率,進而類似于傳統二維表示的地圖比例尺的概念。因此,對城市三維模型而言,確定LOD建模需要滿足的原則,對三維場景的感知和目標識別具有重要意義,簡單來說可以考慮如下的LOD建模原則:
(1)LOD模型的統一性:三維模型主要是由幾何體和紋理來描述的,而幾何與紋理具有不同的特點來滿足特定應用的不同方面要求。所以,任一尺度下的LOD模型,必須明確模型當中幾何與紋理的不同特點。
(2)特征的可識別性:城市三維地圖的應用中導航是非常重要的一個方面,在LOD建模時使用的幾何結構和紋理要能表現模型的特征,便于用戶進行區域判別[6]。
(3)LOD模型的連續性:LOD模型的定義本質上是一個連續的序列,在序列當中不同LOD模型之間應該具有一定的相關性,從而保證場景漫游時不產生明顯的間跳感。
在明確LOD建模原則之后,就需要選擇合適的建模方式。目前城市三維場景建模一般有立即模式和保留模式兩種,以立即模式和手工編碼建立所有的模型對象會導致開發速度很慢并且復雜;而保留模式允許設計者通過使用建模軟件來設計并建立三維場景,然后在應用程序中直接加載模型數據,這樣可以提高建模速度和場景渲染速度,本文采用后一種建模方式。
在進行數據存儲和組織、圖形與屬性數據采集等之前必須確定城市三維場景所涉及的所有數據的分層規則,所有工作以此為依據逐步展開。
在現實世界中,屬于同一要素類型的地物歸為一個圖層。一般來說,三維場景中的地物大致可分為地塊、建筑物、樹木、路燈、交通標志、其他點狀要素等幾層,每個地物層中包括若干個模型類,一個模型類下面有多個實體。這樣,三維場景的模型文件具有大量重復性的特征,如樹木、路燈、交通標志等在場景中的大量重復,在讀取和傳輸的時候只需一次,在顯示的時候只繪制一次,后面的模型直接利用已讀取好的模型類。每個模型類包含一個模型文件,每個模型的中心均已歸零。通過實體的中心坐標、旋轉方向、縮放比例在場景中進行定位,各個實體各有差異。植被、路燈、港口機械、建筑等重復出現無特定地點的模型稱為普通模型,對于獨一無二的標志性建筑等,該實體類下面僅僅只有一個實體模型。由于三維場景中模型量很大,在程序中讀取和編輯這些模型將非常繁瑣,其命名規則就尤其重要,這里統一采用“層編碼+編號”的規則。
小規模場景在漫游過程中可以作為一塊來處理,當場景數據規模增大時,這種做法顯然就不太合適了,需要對場景數據作分塊處理。對大范圍區域進行分塊不僅是因為設備內存空間有限,容納不了大規模的數據,而且有利于進行基于分塊的視景體裁剪、模型數據的分塊實時讀取、紋理的處理和并行繪制。
分塊的大小對于最后三維場景的繪制速度影響很大。分塊越大,掃描就越粗糙,包括的頂點也就越多;反之,分塊越小,掃描越精細,得到的裁剪后的頂點數也就越接近于在視景體內的實際頂點數[7]。但是,對塊裁剪計算量大,數據塊太瑣碎,不利于數據組織和管理。由于要繪制頂點的數目和數據塊裁剪計算、加載時間直接影響實時漫游效果,所以選擇適當的分塊大小就要取一個折中的解決方案,使得既能利用掃描裁剪的高效率,又能獲得一個相對最少的頂點數。各數據塊是場景繪制的最小單元,考慮視點相關的各塊分辨率和透視投影規律,數據塊如果過大,相鄰不同分辨率模型數據顯示會有跳躍感,影響顯示效果。
為某一個圖層中的全部模型進行數據塊劃分及建立索引的過程為:
(1)將該層的全部模型數據加入到一個數據塊中,計算該數據塊的矩形范圍框;
(2)設置數據塊劃分的粒度大小,可以用數據塊中的對象個數或對象占用存儲空間的大小為閾值;
(3)判斷數據塊中的對象是否在閾值之內,如果滿足,以該數據塊的范圍框作為對象的空間索引;如果不是,以對象的中心位置將該數據塊按四叉樹繼續劃分成4塊。
(4)對于四叉樹的每一塊,以塊內所有對象的包圍框重新計算數據塊的范圍框,并重復步驟(3),直到所有分塊中的對象均滿足步驟(2)中的閾值條件。
基于上面的數據組織,三維場景的實時可視化實際上是根據視點參數和應用需求來確定哪個層次的哪級模型的一個或多個子場景作為當前的可視場景進行繪制。為了加速三維物體模型的繪制速度以期達到實時顯示的要求,可以通過有效地剔除不必要顯示的對象,降低圖形渲染流水線的負荷,從而提高三維場景可視化的速度,常用的加速方法有視景體裁減。
視景體剔除也被稱為視景體裁剪。考慮到人類視角大小的限制,當觀察一個場景時,在人眼視角范圍外的物體是看不見的;換句話說,如果能在場景繪制之前,即使將看不到的場景部分剔除而不加以顯示也不會對正確的顯示結果造成任何影響。因此視景體剔除技術是通過判斷物體或場景的邊界是否與視景體存在交集來實現把位于視景體之外的物體或場景排除在繪制過程之外的。在程序實現的過程中,視景體剔除流程往往和場景的數據組織方式相關。
城市三維可視化實際上就是物體從三維空間變換到二維平面的過程,一般要經過視點變換、模型變換、投影變換和視口變換4個步驟。在計算機圖形學中,不同的投影方式定義了不同的視景體。視景體有兩個作用,首先,視景體決定了一個物體是如何映射到屏幕上的;其次,視景體定義了哪些物體被裁剪到最終的圖像之外。在三維顯示中,有透視投影和正射投影兩種投影模式。不管是透視投影還是正射投影,其視景體都有6個裁剪面,分別是左、右、近、遠、上、下裁剪面。視景體裁剪就是利用這6個裁剪平面來判斷物體和視景體之間的關系,在視景體外的物體或物體的一部分將會被剔除掉而不顯示。
在城市三維地圖的實時顯示過程中,由于視點參數(如視點位置、視區中心位置、觀察方向等)都在不斷變化,場景裁切也在不斷進行,當視點參數變化一次,場景裁切也要進行一次,因此場景裁切的效率會直接影響這個繪制過程的速度。這樣的裁剪方式效率非常低,因為在顯示時要對每一個點或物體都進行測試,來確定哪些點或物體在視景體內,這顯然是不切實際的。
在實際裁剪過程中,前面分層分塊的三維數據組織方式可以有效地提高場景裁剪速度,實現場景的快速實時顯示。因為數據分層有利于提取用戶感興趣的數據,過濾掉無用的圖層;而通過數據分塊機制,在裁剪預處理階段就可以直接剔除位于裁剪區以外的數據塊,同時將位于裁剪區內的數據塊作為部分裁剪結果返回,然后只需對那些與裁剪區相交的數據進行模型的裁剪處理。
根據上述過程,我們分別針對圖層——數據塊——模型逐級過濾、裁剪,由粗到細得到各種裁剪結果圖層、數據塊、模型等中間數據。將這些數據按照模型——數據塊——圖層的順序進行重構,就可以得到位于裁剪區內的三維場景。基于數據分層分塊組織的大范圍城市三維場景的裁剪總體流程如圖1所示。

圖1 裁剪流程
從圖1的流程圖中可以看出,要提高視景體裁剪速度,關鍵是要提高判斷數據塊與裁剪區的關系以及裁剪區內各個數據塊的模型與裁剪區的關系的計算效率。前者由于數據塊為矩形,其與裁剪區的關系可以簡化為兩個矩形位置關系的算法,而后者可以通過使用模型的坐標位置代替模型,將由多個三角面構成的復雜模型的物體裁剪簡化為點的裁剪。
這里,對該方法的繪制性能情況進行了測試,為了消除網絡傳輸等其他因素的影響,先將模型數據存儲在移動設備里,為了試驗的方便,只是簡單地將數據劃分為4×4的16塊,每個數據塊中有5個建筑物模型實體,采用上述裁剪方法,顯示時的幀速率為14.6幀/秒,效果較好。
實驗中所使用的開發平臺為Visual Studio 2005,開發包是 Windows Mobile 5.0 Pocket Phone SDK,并使用Photoshop制作和處理紋理貼圖,然后在3D Studio Max中建模。
在VC++中用OpenGL ES讀取和現實3DS文件的主要步驟如下:
(1)建立與3ds文件格式相應的數據結構;
(2)將讀入的3ds文件數據放到上述建立的數據結構中;
(3)將上述數據結構轉換為便于OpenGL ES繪制的數據結構;
(4)用OpenGL ES提供的繪制函數完成最終圖形的顯示。
相關的數據結構定義如下:



接著繼續讀入三角面、頂點、讀入材質及顏色等。文件讀取完成后就是繪制模型了,用OpenGLES繪制圖形與OpenGL類似,在此不詳細敘述。
由于實驗性質,在對某街區進行建模后,將模型文件集成到移動設備仿真器中進行顯示,其中模型數據總量為23.6 M,實現了交互式漫游和以固定視角及視高自動向前漫游兩種模式,漫游過程中LOD模型之間切換較自然,無明顯跳躍感,基本能保證實時交互瀏覽的連續流暢。
在目前的地理信息系統和移動位置服務的實際應用中,信息的表現形式仍然是以二維平面地圖為主,這里所研究的三維地圖在移動設備上的實時顯示是現在地圖應用領域中比較有新意的研究方向。本文結合四叉樹組織的數據結構,采用了通過減少視景體裁減平面和改進判斷方法進行優化后的視景體裁減算法,加快了顯示速度。
但是本文對數據組織和視景體裁減的討論都是在一種理想狀態下進行的實驗,模型簡單可控,忽略了很多現實的影響因素。因此,進一步的研究應該充分考慮現實因素,使系統具有實用性。
[1]劉琨.基于智能客戶端的三維移動GIS的設計與實現[D].武漢:華中科技大學,2006
[2]Luca Chittaro.Visualizing Information on Mobile Devices,IEEE Computer Society Computer,Vol 39 ,P:40 ~45,March 2006
[3]REICHENBACHER T.Adaptive concepts for a mobile cartography[A].Journal of Geographical Sciences,2001,11(suppl.):43 ~ 53
[4]孫敏,馬藹乃,陳軍.三維城市模型的研究現狀評述[J].遙感學報,2000,6(2):155 ~161
[5]岳利群,夏青,柳佳佳等.全球海量地形數據組織管理方法的研究[J].測繪科學,2009,34(3):121~123
[6]黃鐸.三維城市模型的數據內容[D].武漢:武漢大學,2004
[7]Miran Monsmondor,Hrvoje Komericki,Igor S.Pandzic.3D Visualization on Mobile Devices,Telecommunication Systems,Vol 32,P:181 ~191,July 2006