孫鍇
(太原航空儀表有限公司 山西省太原市 030006)
隨著航空領(lǐng)域的快速發(fā)展,航空座艙顯示設(shè)備已經(jīng)逐漸由以前的二維顯示模式向三維顯示模式發(fā)展。在三維顯示模式下,飛行員可以直觀的感受到飛機(jī)當(dāng)前所處的狀態(tài),而三維地形顯示可以更好的為飛行員提升飛行體驗(yàn)。由于三維地形顯示需要的DEM 高程數(shù)據(jù)和衛(wèi)星圖片數(shù)據(jù)數(shù)據(jù)量很大,因此采用合理的算法組織數(shù)據(jù)顯示是三維地形顯示的重中之重。
由于繪圖操作中的三維坐標(biāo)系統(tǒng)是直角坐標(biāo)系統(tǒng),因此我們對(duì)地球表面進(jìn)行幾何建模,以地球中心為原點(diǎn),地球表面近似認(rèn)為是一個(gè)半徑為6378137.0 米的正球面(沒有考慮實(shí)際的地球是近似橢球體,地表大圓長度40075016.0 米),地心到本初子午線與赤道交點(diǎn)的矢量為X 軸正向,地心到北極點(diǎn)的矢量為正Z 軸方向,X,Y,Z 構(gòu)成右手系坐標(biāo)系統(tǒng)(這樣Y 的正向是地心到赤道與東經(jīng)90 度交點(diǎn)的矢量)。
這里提供的三維地圖都基于這個(gè)幾何模型,它的坐標(biāo)系統(tǒng)與常用的經(jīng)緯度,高程坐標(biāo)系統(tǒng)的轉(zhuǎn)換關(guān)系如下:
經(jīng)緯度,高程分別用J,W,H 表示(J,W 用弧度單位,東經(jīng)北緯為正,H 用米單位,海平面為0,海平面以上為正),幾何模型的三維直角坐標(biāo)系統(tǒng)坐標(biāo)用X,Y,Z 表示(用米為單位),則換算關(guān)系是:
X=(H + EARTHRADIUS) * cos(W) * cos(J)
Y=(H + EARTHRADIUS) * cos(W) * sin(J)
Z=(H + EARTHRADIUS) * sin(W)
J=atan2(Y,X) (arctg(Y/X)) (反正切,取值-180--180)
W=arcsin(Z/sqrt(X2+Y2+Z2)) (反正弦,取值-90--90)
H=sqrt(X2+Y2+Z2) - EARTHRADIUS (sqrt 是開平方)
其中EARTHRADIUS 為地球半徑,定義為6378137 米,如圖1所示。
如圖2所示,三維地圖中的數(shù)據(jù)相關(guān)的位置可以用經(jīng)緯度表示(高程作為一個(gè)數(shù)據(jù)屬性,表征了地形),為了支持不同的地球表面投影方式,我們?cè)谌S地圖引擎內(nèi)部不直接采用地理坐標(biāo)系統(tǒng),因?yàn)榈乩碜鴺?biāo)系統(tǒng)在某些投影方式中不是線性的,不便于在直角坐標(biāo)系統(tǒng)中使用。我們采用一種邏輯坐標(biāo)系統(tǒng),該系統(tǒng)中的數(shù)據(jù)按二維組織,二維坐標(biāo)范圍都是[0,1]。在地表的分布如下:
三維地圖引擎中事實(shí)上不關(guān)心數(shù)據(jù)的地理坐標(biāo),只需要關(guān)心邏輯坐標(biāo)即可。用戶使用三維地圖引擎時(shí)可以指定投影方式(給出投影方式下地理坐標(biāo)與邏輯坐標(biāo)之間的相互轉(zhuǎn)換算法),數(shù)據(jù)則按照邏輯坐標(biāo)提供。比如在谷歌地球的墨卡托投影坐標(biāo)系統(tǒng)中,北京天安門廣場旗桿附近(E116.3910,N39.9055)的邏輯坐標(biāo)是:(0.823308,0.379606)。
三維地圖引擎要求地形數(shù)據(jù)和地表影像數(shù)據(jù)按照邏輯坐標(biāo)提供,這兩部分由系統(tǒng)處理。其他的用戶層數(shù)據(jù)可以自行處理,也建議按照邏輯坐標(biāo)組織,具體參見后面的數(shù)據(jù)組織方式。
圖1:三維直角坐標(biāo)系統(tǒng)與地理坐標(biāo)系統(tǒng)示意圖
圖2:三維地圖引擎的數(shù)據(jù)邏輯坐標(biāo)
圖3:四叉樹組織的地圖數(shù)據(jù)
圖4:按四叉樹組織的地圖數(shù)據(jù)
圖5:繪圖任務(wù)與數(shù)據(jù)加載任務(wù)的執(zhí)行流程
三維地圖涉及到的地圖數(shù)據(jù)量比較大,不可能全部放在內(nèi)存里,顯示時(shí)在不同的視角看到的范圍和內(nèi)容都不同,離得遠(yuǎn)的視角,看到的范圍廣,但是細(xì)節(jié)少,分辨率低,反之,離得近看,看到的范圍小,但是細(xì)節(jié)豐富,分辨率高。同一個(gè)地理目標(biāo)的繪制方法也不一樣,比如一棟高樓,在10 公里距離以上,可能就標(biāo)記為一個(gè)點(diǎn)目標(biāo),在1 公里距離內(nèi),可能成為一個(gè)三維目標(biāo)。細(xì)節(jié)也不一樣,在50 公里高度俯視地表,可以看到200 公里方圓的內(nèi)容,最小的行政目標(biāo)可能是縣級(jí),在5 公里高度,可能就需要到村鎮(zhèn)級(jí)別了。還有一個(gè)特征是,在不同的地方數(shù)據(jù)的分辨率可能不一樣,在重點(diǎn)城市,可能詳細(xì)到足以分辨街道,在一些深山老林,能夠分清山的走向和植被分布就夠了。這些需求都要求地圖數(shù)據(jù)應(yīng)該按照多分辨率存儲(chǔ)。
三維地圖引擎中的數(shù)據(jù)用四叉樹組織,可以滿足上述的要求。具體做法如下:
在上述的邏輯坐標(biāo)系統(tǒng)中,把全球數(shù)據(jù)作為一個(gè)樹根,平分成四份,每一份作為它的四個(gè)子節(jié)點(diǎn),以后每個(gè)子節(jié)點(diǎn)又包括四個(gè)子節(jié)點(diǎn),以此類推,就構(gòu)成了一棵四叉樹。其中的每一個(gè)節(jié)點(diǎn)構(gòu)成地圖數(shù)據(jù)中的一個(gè)圖幅。我們?yōu)槊總€(gè)圖幅給出一個(gè)唯一的編號(hào),每個(gè)圖幅的編號(hào)由三個(gè)數(shù)字組成:層號(hào),橫向坐標(biāo),縱向坐標(biāo),其中橫向坐標(biāo)和縱向坐標(biāo)是同一層中的圖幅編號(hào),按照邏輯坐標(biāo)的順序編碼,所有編號(hào)都從0 開始,在第k 層,橫向和縱向的編號(hào)是從0 到2k-1。從圖幅編號(hào)可以得到它所在圖幅的邏輯坐標(biāo)范圍,從某個(gè)地理目標(biāo)的邏輯坐標(biāo)也可以得到它在指定層中的圖幅號(hào)。比如上述講的天安門廣場旗桿,邏輯坐標(biāo)是0.823308,0.379606,在第九層中所在圖幅的編號(hào)就是(9,0.823308*512,0.379606*512),即(9,421,194)。
一般情況下,我們的數(shù)據(jù)對(duì)一幅圖的數(shù)據(jù)量是一樣的,層數(shù)越小,一幅圖的范圍就越廣,分辨率就越低。
在三維觀察視角看到的場景,離得遠(yuǎn)的,層數(shù)就小,離得近的,層數(shù)就大,這樣保證防擁效果。每一個(gè)視角看到的場景在地圖數(shù)據(jù)樹中對(duì)應(yīng)一個(gè)樹的切面。如圖4所示。
節(jié)點(diǎn)(l,m,n)的四個(gè)子節(jié)點(diǎn)編號(hào)分別為:
(l+1,2m,2n),(l+1,2m+1,2n),(l+1,2m,2n+1),(l+1,2m+1,2n+1)
節(jié)點(diǎn)(l,m,n)的父節(jié)點(diǎn)編號(hào)為(l-1,m/2,n/2)(l>0)
在實(shí)際的應(yīng)用中,這棵四叉樹不一定是完全四叉樹,這樣可以在不同的地域?qū)?yīng)的最大層號(hào)不同,從而實(shí)現(xiàn)不同的最大分辨率。比如在國內(nèi)的應(yīng)用中,全球的數(shù)據(jù),可以采用到第9 層,中國地區(qū)可以到第13 層,重點(diǎn)城市或重點(diǎn)目標(biāo),可以到第18 層,像素分辨率可以到米級(jí)以下。
由于三維地圖的數(shù)據(jù)量大,同時(shí)需要訪問的圖幅數(shù)據(jù)又是有限的,在連續(xù)視點(diǎn)變換的應(yīng)用中(比如模擬飛行),該緩存哪些數(shù)據(jù),就靠數(shù)據(jù)調(diào)度算法來實(shí)現(xiàn)。
在設(shè)定一個(gè)視角參數(shù)后,我們從四叉樹的樹根開始往下反復(fù)檢查,先查節(jié)點(diǎn)是否在視口中出現(xiàn),如果不出現(xiàn),該圖幅就不需要調(diào)入,如果出現(xiàn),判斷其分辨率是否夠(如果該圖幅在視口中占的屏幕百分比超過一個(gè)閾值,就認(rèn)為分辨率不足。在分辨率不足時(shí),如果該節(jié)點(diǎn)有子節(jié)點(diǎn),就接著檢查它的四個(gè)子節(jié)點(diǎn)。這樣,我們就收集到一系列不同層次的圖幅,要么是分辨率達(dá)到要求,要么是沒有子節(jié)點(diǎn),這些圖幅就是需要繪制的圖幅。
在實(shí)際使用中,我們?cè)趦?nèi)存中存放一定數(shù)量的圖幅數(shù)據(jù),需要繪制的圖幅就調(diào)入內(nèi)存,不需要繪制的圖幅就刪除,這樣可以在連續(xù)的視點(diǎn)變換應(yīng)用中維持一個(gè)有限的節(jié)點(diǎn)數(shù)目,最大的節(jié)點(diǎn)數(shù)可以根據(jù)系統(tǒng)中內(nèi)存的大小來決定。
在實(shí)際實(shí)現(xiàn)時(shí),數(shù)據(jù)的加載一般比較慢(有可能要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,比如壓縮圖像解碼,格式變換等,或者通過比較慢的網(wǎng)絡(luò)加載數(shù)據(jù)),為了保證數(shù)據(jù)加載過程不會(huì)造成繪制過程的暫停,我們一般采用不同于繪圖任務(wù)的任務(wù)(線程)來進(jìn)行數(shù)據(jù)加載,保證繪圖任務(wù)的平滑運(yùn)行。這樣,分辨率高的地圖數(shù)據(jù)沒有加載完成時(shí),就先繪制分辨率比較低的數(shù)據(jù)。
為保證圖形顯示的性能,避免顯示時(shí)卡頓,地圖的繪制和地圖數(shù)據(jù)的加載分別在兩個(gè)任務(wù)中執(zhí)行。數(shù)據(jù)加載任務(wù)負(fù)責(zé)從電子盤讀取地圖數(shù)據(jù),而繪圖任務(wù)不需要等待從電子盤讀取地圖數(shù)據(jù),這兩個(gè)任務(wù)的執(zhí)行流程如圖5所示。
其中,繪圖任務(wù)在判定一個(gè)圖幅需要顯示之后,會(huì)將該圖幅的信息加入到待加載圖幅隊(duì)列中;數(shù)據(jù)加載任務(wù)從這個(gè)隊(duì)列中讀取要加載數(shù)據(jù)的圖幅,讀取成功之后,對(duì)該圖幅做出已加載完成的標(biāo)記;繪圖任務(wù)在顯示圖幅時(shí)如果讀到了數(shù)據(jù)已加載成功的標(biāo)記,就把該圖幅繪制出來,否則就不繪制該圖幅了。
隨著航空領(lǐng)域的快速發(fā)展,對(duì)機(jī)載座艙顯示設(shè)備都提出了較高的要求,具有真實(shí)視覺效果的三維顯示技術(shù)可以為飛行員提供更好的飛行體驗(yàn)。