孟超越,李宏偉,許棟浩,張鐵映
(1.信息工程大學(xué) 地理空間信息學(xué)院,河南 鄭州450001)
基于Android的地下管線三維可視化關(guān)鍵技術(shù)研究
孟超越1,李宏偉1,許棟浩1,張鐵映1
(1.信息工程大學(xué) 地理空間信息學(xué)院,河南 鄭州450001)
針對基于二維地圖的地下管線移動GIS應(yīng)用難以準確描述地下管線復(fù)雜空間關(guān)系的缺陷,研究了基于Android實現(xiàn)地下管線三維建模及可視化的關(guān)鍵技術(shù);設(shè)計了基于矢量空間數(shù)據(jù)的地下管線直管構(gòu)造算法和彎管銜接算法;實現(xiàn)了Android地下管線三維可視化原型系統(tǒng),以驗證算法的可行性。
Android;三維可視化;地下管線
地下管線是城市基礎(chǔ)設(shè)施的重要組成部分,管線按用途可分為電力、電信、給水、排水、燃氣、熱力、路燈、通訊等,負責城市能源運輸、廢物處理、排水減災(zāi)和信息傳輸?shù)裙ぷ?,是城市賴以生存和發(fā)展的重要基礎(chǔ)設(shè)施,被稱為城市的“生命線”[1]。隨著信息技術(shù)的飛速發(fā)展,移動互聯(lián)網(wǎng)技術(shù)不斷進步,人類社會已逐步由PC互聯(lián)網(wǎng)時代進入移動互聯(lián)網(wǎng)時代,人們從移動平臺獲取地理空間信息的需求日益顯現(xiàn)。移動互聯(lián)網(wǎng)的發(fā)展為GIS應(yīng)用提供了新的空間和思路,在GIS中移動智能終端平臺可充當多種角色,地位日趨重要。目前,移動智能終端平臺上的GIS應(yīng)用已有很大發(fā)展,但在空間信息表達方式上仍以二維地圖為主。針對基于二維地圖的地下管線移動GIS應(yīng)用難以準確描述地下管線復(fù)雜空間關(guān)系的缺陷,根據(jù)用戶在移動場景下使用城市地下管線三維GIS的實際需要,為了更加逼真直觀地對地下管線空間信息進行可視化描述,本文對基于Android的地下管線三維可視化關(guān)鍵技術(shù)進行了探索研究。
Android是一個基于Linux 內(nèi)核開發(fā)的開源操作系統(tǒng),主要應(yīng)用于移動設(shè)備,如手機、PDA平板電腦等[2]。Android能夠成為當前最為流行的移動設(shè)備操作系統(tǒng),與其成熟穩(wěn)定的特性是分不開的,而這些必定是由一個優(yōu)秀的系統(tǒng)架構(gòu)支撐的。Android采用分層架構(gòu)設(shè)計,從上至下可分為應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運行庫層和Linux內(nèi)核層4層[3]。
1)應(yīng)用程序?qū)?。Android本身包含了許多系統(tǒng)應(yīng)用,如電話、短信、鬧鐘等;用戶還可安裝由開發(fā)者開發(fā)并發(fā)布的其他應(yīng)用。
2)應(yīng)用程序框架層。該層是Android應(yīng)用程序的基本框架,提供了許多可供開發(fā)者調(diào)用的API,對系統(tǒng)底層細節(jié)進行了封裝隔離,讓開發(fā)者可以更加快捷簡便地開發(fā)Android應(yīng)用程序,而不必關(guān)心底層實現(xiàn)[4]。
3)系統(tǒng)運行庫層。該層可劃分為系統(tǒng)庫和Android運行時兩部分。其中,系統(tǒng)庫是應(yīng)用程序框架層的重要支撐,也是連接Linux內(nèi)核層的關(guān)鍵紐帶;而Android運行時是Android應(yīng)用程序運行的必備環(huán)境,包括核心庫和Dalvik虛擬機兩部分。
4)Linux內(nèi)核層。Android系統(tǒng)是基于Linux內(nèi)核的,該層主要為Android系統(tǒng)的正常運行提供底層支持,包括硬件驅(qū)動、系統(tǒng)進程調(diào)度等。
在Android中圖像繪制分為2D和3D兩種,2D圖像繪制由Skia庫實現(xiàn),3D圖像繪制由OpenGL ES完成。本文主要研究地下管線的三維可視化,所以重點對OpenGL ES三維圖形繪制技術(shù)進行研究。
OpenGL定義了一套跨平臺、跨編程語言的圖形編程接口,其主要目的是實現(xiàn)一套三維圖形圖像處理的統(tǒng)一規(guī)范。OpenGL ES是為了適應(yīng)移動設(shè)備內(nèi)存和圖形計算性能有限的特征從OpenGL中裁剪而來的,主要去掉了部分對四邊形、多邊形等復(fù)雜圖元處理的功能,其更適用于移動設(shè)備的三維圖形圖像應(yīng)用開發(fā)。
OpenGL ES 1.x是OpenGL ES的第一個發(fā)布版本,對開發(fā)人員開放了一些API接口,但無法干預(yù)控制渲染過程;OpenGL ES 2.0是OpenGL ES 1.x的升級版,增加了可編程渲染管線的功能,可利用著色器腳本語言控制渲染管線,使一些復(fù)雜的效果實現(xiàn)起來更加簡便[5]。本文中地下管線三維可視化是基于OpenGL ES 2.0版本實現(xiàn)。OpenGL ES渲染管線可以理解為OpenGL ES在圖形渲染過程中按照固定順序經(jīng)歷的一系列操作,如圖1所示。
圖1 OpenGL ES渲染管線
OpenGL ES 2.0渲染管線是可編程渲染管線,可編程環(huán)節(jié)被稱為著色器。著色器是一段可在GPU上執(zhí)行的程序,需使用著色語言來編寫。由圖1可以看出,OpenGL ES 2.0渲染管線中包含兩種基本著色器:頂點著色器和片元著色器。這兩個節(jié)點是OpenGL ES 2.0及以上版本渲染管線中必需由開發(fā)者編程實現(xiàn)的兩個可編程單元。開發(fā)者通過使用頂點著色器實現(xiàn)對頂點的操作、法向量的計算、紋理坐標的變換計算等功能;通過片元著色器進行顏色求和,實現(xiàn)光照模型、凹凸貼圖、陰影、半透明等效果。著色器使得三維可視化應(yīng)用開發(fā)的靈活性大大增強。
Android中的圖形繪制并不是直接在屏幕上顯示的,而是預(yù)先在幀緩沖區(qū)繪制,幀緩沖繪制完成后再將繪制結(jié)果交換到屏幕上,因此,每次繪制新的一幀都要更新幀緩沖區(qū)。若程序中開啟了混合,幀緩沖則根據(jù)混合因子將上一階段送來的片元與緩沖中的片元進行混合;否則,直接覆蓋上次緩沖區(qū)中的片元。
3.1 地下管線直管三維建模算法
在計算機圖形學(xué)中圓通常以正多邊形進行模擬,正多邊形邊數(shù)越多則越接近圓形,所以在管線三維模型的具體表達中使用正多邊體柱描述圓柱體,圓柱上下底面圓采用正多邊形模擬,圓柱的柱面則被分割為多個長方形。
直管建模的本質(zhì)就是依據(jù)管線的起止點坐標(正多邊柱體上下底的中心點坐標)計算正多邊柱體上下底面正多邊形的各頂點坐標。Android中OpenGL ES是通過GL_TRIANGLES_STRIP和GL_TRIANGLES_ FUN兩種三角形繪制方式進行組合繪制多邊形的,所以在三維模型實際構(gòu)建和渲染時模型表面通常以三角形面片進行組織。在直管建模時,將表示圓柱底面的多邊形相鄰兩點與頂面圓上對應(yīng)點連接起來即可將圓柱側(cè)平面分割為三角形帶(見圖2)。劃分的三角形面片越多,對管線的描述就越精細,模擬效果越逼真,但建模時的計算量會增大,三維場景的顯示效率將有所降低。經(jīng)實驗測試,當?shù)酌鎴A被劃分為8~12個部分時,在Android實驗平臺上的顯示效果較好,渲染速度也較快,能達到顯示效果和渲染速度的相對平衡。
圖2 直管模型構(gòu)造
根據(jù)管線矢量空間數(shù)據(jù)計算管段模型各頂點位置進行直管三維建模的具體步驟為:
1)讀取管線空間數(shù)據(jù)。依次遍歷各類管線數(shù)據(jù)圖層,讀取管線管段數(shù)據(jù),獲取每段管線的起止點坐標、管線類型、管徑等屬性數(shù)據(jù)。在三維空間坐標系下,任意點P可表示為P(xi, yi, zi),設(shè)讀取的管段起點為A(x1, y1, z1),終點為B(x2, y2, z2),管徑為R。
2)計算管段長度與管段中心點坐標。設(shè)管段長度為L,則:
設(shè)管段中心點為M(xm, ym, zm),則:
3)在相對坐標系下計算模型各頂點坐標。在三維場景空間坐標系下,直接通過起止點坐標和管徑管長計算管段各頂點空間坐標較復(fù)雜,所以本文對該過程進行分解:先計算以管段中心點為原點,管段中軸線為Z軸,XOY平面橫切管段的相對坐標系下各頂點坐標;再使用正N邊形將切面圓劃分。
在管段相對坐標系下底面頂點Ai的坐標為:
頂面頂點Bi的坐標為:
4)計算管段傾斜向量與各坐標軸夾角。管段向量AB與世界坐標系X、Y、Z軸的夾角分別計為α、β、c并作為管段向量的方向角,其中0≤α≤π,0≤β≤π,0≤c≤π,則:
5)計算各頂點實際空間位置。管段模型在地理空間坐標系下的實際位置可看作是管線模型以坐標原點為中心旋轉(zhuǎn)到管段向量AB方向,再平移到空間坐標系中M點位置[6]。管段向量在空間中的旋轉(zhuǎn),從Z軸方向旋轉(zhuǎn)到AB方向,需繞X軸旋轉(zhuǎn)角度為θx,再需繞Y軸旋轉(zhuǎn)角度為θy,然后繞Z軸旋轉(zhuǎn)角度為θz,將式(4)、(5)、(7)、(8)、(9)分別代入式(6)即可求出各頂點實際坐標。
式中,Rx、 Ry、Rz為旋轉(zhuǎn)矩陣。
三維直管模型各頂點坐標計算完成后,按照組成三角形帶的順序?qū)⑵浼尤牍芏螌ο蟮捻旤c數(shù)組中,并設(shè)置繪制方式和繪制順序,綁定著色器,這樣OpenGL ES 2.0就會按照指定方式將管段模型繪制到屏幕。除了直線管段三維建模外還需處理管線的管段銜接模型。
3.2 地下管段銜接三維建模方法
管段銜接建模本質(zhì)就是在兩根管段交匯處繪制一 段緊密相連的光滑彎管[7]。本文將彎管分解為多個異徑圓柱體,將每個圓柱體表面分為若干三角形,構(gòu)建三角形帶,通過計算各三角形頂點坐標構(gòu)建彎管模型。一般而言,等徑管段建模銜接較簡單,異徑管段銜接建模較復(fù)雜,但其原理基本相同,需在銜接處使用圓環(huán)分割彎管進行擬合,以銜接直管中心線為弧線,構(gòu)建許多首尾相接、半徑漸變(同徑銜接半徑相同)的微分圓柱體,再將圓柱體進行組合,構(gòu)建管徑漸變的彎管,實現(xiàn)光滑效果。
圖3 彎管中心圓弧計算
彎管建模的主要流程為:
1)計算彎管圓弧圓心坐標、半徑、圓心角等參數(shù)。如圖3所示,要對兩段直管(T1L1、T2L2)的銜接處進行彎管建模,首先必須確定管線銜接處兩直管的夾角(θ)、彎管中心圓弧的圓心坐標(O)和圓弧半徑(R),以便確定以圓弧上點為圓心的彎管細分圓柱上下底圓環(huán)的空間位置及大小。具體的計算過程為:①計算交匯直管T1L1和T2L2的延長線交點T3的坐標:確定T到T的距離S: S=31②計算T3到 T1的空間方向單位向量計算T3到 T2的空間方向單位向量③ 計算彎管中心圓弧所在平面的法向量④計算垂直于T1T3并指向圓弧圓心的向量計算垂直于T2T3并指向圓弧圓心的向量⑤根據(jù)圓弧與直管的切點(L1、L2)到直管中心線交點T3的距離S,計算兩個切點(L1、L2)的空間坐標⑥計算兩段直管的夾角⑦計算彎管中心圓弧的半徑R:R=S×tan(θ/2);⑧確定彎管圓弧的圓心坐標O:O=L1+R×M1=L2+R×M2。實際上,算法中S取T3到T1的距離或T3到T2的距離均可,但通常取二者中較小的一個從而使管段銜接取得更好的圓滑效果。
2)計算組成細分圓柱體上下底圓環(huán)的頂點坐標。確定圓弧的圓心、半徑與直管夾角等參數(shù)后,就要解決各細分圓柱之間的銜接問題。本文的解決思路是將弧形彎管近似分解為多個近似圓柱體,根據(jù)上述直管建模方法可知,通過圓柱上下底圓心坐標可計算圓柱兩個底面圓環(huán)的各頂點坐標,從而構(gòu)造三角帶描述細分異徑圓柱。
圖4 彎管細分結(jié)構(gòu)
①首個圓柱底面各頂點坐標的計算方法。如圖3所示,計算得到L1、L2、O點坐標后,可在三角形L1L2O中使用三角形余弦定理求得彎管圓弧的圓心角β再根據(jù)β將彎管平均劃分為 n 段異徑圓柱,每段圓柱的上下底面為?=β/n;最后計算彎管的首個圓柱底面圓環(huán)的頂點坐標。以首個圓柱底面圓環(huán)圓心為圓弧的起點T1(圖4),起始管段半徑為半徑,圓環(huán)各頂點Pi坐標計算方法、直管圓環(huán)各頂點坐標計算方法與直管模型頂點計算類似,不再詳述。②后續(xù)圓環(huán)頂點坐標的計算方法。計算得到銜接彎管細分圓柱的第一個圓環(huán)各頂點坐標后,便可依次計算后續(xù)圓環(huán)的頂點坐標,與同徑管段銜接不同的是異徑管段銜接的后續(xù)圓柱半徑需逐漸增大或減小,具體計算方法為:首先讀取粗管半徑R0和細管半徑r0,根據(jù)彎管劃分圓柱數(shù)量n計算每個圓環(huán)半徑的增量再根據(jù)已算出頂點數(shù)據(jù)的圓環(huán)個數(shù)t,計算當前圓環(huán)半徑rm+1=r0+t×Δr;然后根據(jù)上述算法依次計算所有圓環(huán)各頂點的坐標,直至計算得到所有分割彎管的圓環(huán)頂點坐標。
3)將計算得到的頂點按順序加入模型頂點數(shù)組。計算得到所有圓環(huán)頂點數(shù)據(jù)后,依據(jù)OpenGL ES中GL_TRIANGLES_STRIP繪制方式的順序?qū)㈨旤c數(shù)據(jù)加入彎管幾何節(jié)點的頂點數(shù)組中,并設(shè)置繪制索引[8]。彎管的精細程度與細分圓柱個數(shù)和圓柱表面細分三角帶中三角形個數(shù)有關(guān),細分圓柱和三角形個數(shù)越多,彎管建模越精細,但動態(tài)建模計算量將大大增加,渲染效率也會降低。
地下三維場景顯示和漫游是一個城市地下管線三維可視化系統(tǒng)的基本功能,Android用戶選擇加載空間數(shù)據(jù)圖層后,程序?qū)⒆x取加載的地下管線矢量空間數(shù)據(jù),根據(jù)動態(tài)建模算法構(gòu)建地下管線三維場景并進行顯示。用戶可通過觸摸屏幕或漫游控制功能按鈕對三維場景進行放大、縮小、漫游等操作。地下管線三維場景如圖5所示。
圖5 地下管線三維場景示意圖
由于在移動終端平臺上傳統(tǒng)的二維地下管線GIS應(yīng)用表達地下管線空間關(guān)系存在真實感不強、無法表達復(fù)雜空間關(guān)系等諸多不足,本文研究了基于Android的地下管線三維可視化的關(guān)鍵技術(shù)。地下管線的三維可視化表達相比于傳統(tǒng)的二維地圖表達,具有效果逼真、表現(xiàn)力強、空間關(guān)系明確等優(yōu)勢和特點。二維到三維的改變,不僅意味著空間對象表達方式的改變,也意味著空間認知的深化,如何基于Android實現(xiàn)三維地下管線空間分析功能,是下一步工作的重點。
[1]史敏.城市管網(wǎng)三維模型的設(shè)計與實現(xiàn)[D].北京:北京郵電大學(xué),2009:3
[2]Kyle Merrifield Mew. Android 3.0 Application Development Cookbook[M].Birmingham: Packt Press,2011:25
[3]余志龍,王世江,鄭名杰.Google Android SDK開發(fā)范例大全[M].北京:人民郵電出版社,2010:34
[4]張利國,龔海平,王植萌.Android移動開發(fā)與入門進階[M].北京:人民郵電出版社,2009:27
[5]任玉剛.Android開發(fā)藝術(shù)探索[M].北京:電子工業(yè)出版社,2015:167
[6]Shreiner D, Shellers G.OpenGL Programming Guide[M].Beijing: China Machine Press,2015:278
[7]張文元,付仲良. 基于ArcGIS Engine的綜合管線三維可視化研究[J].測繪通報,2008(8):28-31
[8]陳艷,付仲良.三維排水管網(wǎng)組成要素的模型設(shè)計[J].地理空間信息,2005,3(2):11-12
P208
B
1672-4623(2017)07-0093-04
10.3969/j.issn.1672-4623.2017.07.028
孟超越,碩士研究生,主要從事移動GIS理論與應(yīng)用、三維地理信息建模等方面的研究工作。
2016-04-22。
項目來源:國家自然科學(xué)基金面上項目資助項目(41271392、41571394);國家自然科學(xué)基金青年基金資助項目(41401463)。