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