基于OPenGL的衛(wèi)星覆蓋可視化仿真
1 引言
本文引用地址:http://m.butianyuan.cn/article/21353.htmopengl((open graphic library)是開放性圖形庫,他是一個三維的計算機(jī)圖形和模型庫,是由sgi公司為其圖形工作站開發(fā)的iris gl演變而來的[2]。opengl最顯著的特點是與硬件系統(tǒng)的無關(guān)性,可方便地將應(yīng)用程序移植到另一個操作系統(tǒng)中,他能直接面向硬件調(diào)用3d處理功能,故處理3d圖形速度特別快。
對于開發(fā)者而言,opengl是包含幾十個指令或函數(shù)的集合,包括物體旋轉(zhuǎn)、平移縮放、材質(zhì)、光照、紋理、象素、位圖、文本以及提高圖形表現(xiàn)性能等。利用這些函數(shù)對三維的幾何對象進(jìn)行描述,并利用坐標(biāo)變換、對象著色、光照、消隱及映像到二維屏幕處理,最終實現(xiàn)三維圖形的顯示[2],他基本上涵蓋了開發(fā)可視化圖形程序的方方面面。
2 opengl圖形的實現(xiàn)
2.1 opengl體系結(jié)構(gòu)
opengl是一個與平臺無關(guān)的三維圖形接口,操作系統(tǒng)必須提供象素格式管理和渲染環(huán)境管理。opengl在windows上的實現(xiàn)是基于client/server模式的,應(yīng)用程序發(fā)出opengl命令,由動態(tài)鏈接庫opengl32.dll接收和打包后,發(fā)送到服務(wù)器端的winsrv.dll,然后由他通過ddi層發(fā)往視頻顯示驅(qū)動程序。如果系統(tǒng)安裝了硬件加速器,則由硬件相關(guān)的ddi處理[1]。
opengl/nt的體系結(jié)構(gòu)如圖1所示。
opengl的繪圖方式與windows一般的繪圖方式是不同的,opengl使用的是渲染描述表rc(render context)繪圖,并且采用特殊的象素格式,而windows采用的是gdi繪圖,使用時必須指定所用的設(shè)備描述表dc(device context)[3]。使用opengl也必須指定一個渲染描述表rc,以存儲opengl所需的渲染信息如象素格式等,創(chuàng)建rc時與一個dc建立聯(lián)系(rc也只能通過已經(jīng)建立了位圖格式的dc來創(chuàng)建),opengl的函數(shù)就可以通過rc對應(yīng)的dc畫到相應(yīng)的顯示設(shè)備上[1]。在使用opengl命令向窗口中繪圖之前,必須先建立一個rc,并使之成為當(dāng)前rc。
3 衛(wèi)星覆蓋數(shù)據(jù)分析
衛(wèi)星對地觀測理論覆蓋的計算,在精度允許的前提下(可視化場景中對空間位置精度的要求有所降低),假設(shè)地球為圓球,如果單顆衛(wèi)星運行于高度為h的軌道上,則他的覆蓋幾何如圖2所示。其中ε為衛(wèi)星的最小觀測角,作為已知輸人量,s為星下點,0為衛(wèi)星,oe為地心,r為地球半徑,則覆蓋角d為:
在三維場景中為了繪制波束,需要求取σ和h,由圖2不難得到:
為了在二維場景中繪制衛(wèi)星的覆蓋情況,需要計算覆蓋邊緣,顯然在地球上這是一個圓。如圖3所示。
oe為地心,0為衛(wèi)星的星下點,過0點的經(jīng)線與衛(wèi)星覆蓋圓交于p1,p2兩點,a為覆蓋圓上一點,則a的經(jīng)緯度就是所求。在球面三角形poa中(如圖4所示)。
其中,λ1,λ2為0點和a點的經(jīng)度;δ1為0點的地心緯度;δ2為a點的地心緯度。
由上式可以解出δλ和h2,在解三角函數(shù)時要注意角度的象限,h2的范圍是o~180°,所以有第一個式子可以直接解出,而δλ的范圍是一180~180°,所以要分別解出正弦和余弦值已確定象限。有o~180°變換a,就可以求出一系列覆蓋圓的邊界點。
衛(wèi)星星下點數(shù)據(jù)采用衛(wèi)星軌道兩行根數(shù)tle文件,使用norad sgp4/sdp4軌道模型,可以獲得精確的軌道預(yù)測[4]。tle考慮了地球扁率、日月引力的長期和周期攝動影響,以及大氣阻力模型產(chǎn)生的引力共振和軌道衰退。tle是"平均"根數(shù),他用特定的方法去掉了周期擾動項;預(yù)測模型必須用同樣的方法重構(gòu)周期擾動項。因此,tle并不適用于所有的解析解模型,為了獲得高的預(yù)測精度,應(yīng)該采用1980年12月norad公布的數(shù)學(xué)模型,該文的模型選用norad的sgp4和sgp4模型。sgp4模型用于近地目標(biāo),是lane和cranfordl969年解析理論的簡化。地球引力場模型采用von-zeipel正則變換方法給出的攝動解結(jié)果;大氣模型采用密度加權(quán)函數(shù)。sgp8是sgp4的外延,用于深空目標(biāo)。深空方程由hujsak于1979年開發(fā),模型考慮了地球扁率和日月引力。文中。利用sgp4/sdp4模型計算衛(wèi)星星歷,再根據(jù)衛(wèi)星的星歷計算星下點軌跡的經(jīng)緯度。星下點軌跡數(shù)據(jù)包括:衛(wèi)星從軌道根數(shù)基準(zhǔn)時間開始所經(jīng)歷的時間,星下點的瞬時經(jīng)緯度。這些數(shù)據(jù)雖然比較精確,但是不夠直觀和形象,采用等距墨卡托投影方法,將星下點投影到地球平面圖上進(jìn)行繪制和顯示,使其具有形象,直觀的特點。
4 用opengl實現(xiàn)場景繪制的步驟
使用visual c++6.o在單文檔界面中繪制opengl場景,步驟為:
(1)在單文檔窗口的創(chuàng)建過程中,設(shè)置象素格式和窗口的屬性和風(fēng)格,并在初始化窗口初始化時調(diào)用settimer()函數(shù)。
(2)獲得windows設(shè)備描述表dc,然后將其與事先設(shè)置好的opengl繪制描述表rc聯(lián)系起來;
(3)編寫opengl繪制函數(shù)renderscence(),調(diào)用drawbackground()函數(shù)繪制地圖背景和rendline()函數(shù)繪制星下點軌跡;
(4)在ondraw中調(diào)用opengl繪制函數(shù)renderscence();
(5)在onsize()方法中定義視圖投影變換函數(shù),由于這里需要將地球表面展開,使用正交投影函數(shù)gluorth02d(一180,180,一90,90);
(6)當(dāng)退出opengl圖形窗口時,釋放opengl繪制描述表rc和windows設(shè)備描述表dc。
5 衛(wèi)星星下點軌跡顯示的關(guān)鍵技術(shù)
5.1 地球平面圖的顯示
從bmp文件讀入地球平面圖紋理,步驟是:首先用loadbmp函數(shù)打開bmp紋理文件,返回一個aux rg_bgbimagerec結(jié)構(gòu)的數(shù)組指針,然后利用這個數(shù)組指針參數(shù)調(diào)用gitexlmage2d函數(shù)生成紋理,另外調(diào)用opengl中的gltexparameteri函數(shù)設(shè)置紋理的過濾類型[2]。調(diào)用gigentextures函數(shù)創(chuàng)建紋理對象,用背景繪制函數(shù)drawbackground()綁定紋理對象,并指定紋理坐標(biāo)映射。紋理裝載函數(shù)主要代碼:
地圖背景繪制函數(shù)drawbackground()的主要作用是將載入的紋理粘貼在指定的矩形上,并繪制等距墨卡托投影地圖的經(jīng)緯刻度線,地圖上經(jīng)緯度之間的間隔距離相同。主要代碼如下:
5.2 衛(wèi)星覆蓋的繪制
衛(wèi)星覆蓋的繪制是該文的關(guān)鍵部分。首先需要進(jìn)行坐標(biāo)轉(zhuǎn)換,將衛(wèi)星覆蓋經(jīng)緯度映射到計算機(jī)屏幕上的客戶區(qū)。
圓球上的一個圓投影到二維地圖上,其形狀很復(fù)雜,這給覆蓋在二維視圖中的繪制帶來很大的困難。但是仔細(xì)的分析衛(wèi)星對地觀測覆蓋的特點,這些復(fù)雜的圖形可以分成3大類:
(1)覆蓋包含南(北)極
覆蓋包含南(北)極的情形如圖5所示,此時覆蓋于一90°(90°)緯線以及180°和一180°經(jīng)線構(gòu)成封閉圖形,可以在緯度一90°(90°)對應(yīng)各點(即經(jīng)度相同的點)填加相同緯度的點進(jìn)行繪制。
(2)覆蓋跨越180°經(jīng)線
此時覆蓋被分成2部分,分別與180°經(jīng)線和一180°經(jīng)線構(gòu)成封閉圖形(如圖6所示),這種情況下可以在這兩條經(jīng)線上添加對應(yīng)的點進(jìn)行繪制。
(3)覆蓋的投影保持封閉
除去上面兩種情況,覆蓋都會保持為封閉圖形,這種情況比較好處理(如圖7所示),只是要注意opengl不支持凹多邊形繪制,而此時無法保證封閉圖形式凸多邊形,因此不能使用gl_polygon指令繪制。
為了實現(xiàn)衛(wèi)星運行的動畫效果,使用opengl的雙緩存技術(shù)[1],該技術(shù)使用2個前后臺2個緩存繪制畫面,在顯示前臺緩存內(nèi)容中的一幀畫面時,后臺緩存正在繪制下一幀畫面,當(dāng)后臺緩存繪制完畢,后臺緩存內(nèi)容便顯示在屏幕上,而前臺此時又在繪制下一幀畫面內(nèi)容。如此循環(huán)反復(fù),屏幕上顯示總是已經(jīng)畫好的圖形,看起來所有的畫面都是連續(xù)的。場景繪制函數(shù)renderscence()中調(diào)用swapbuffers()函數(shù)來實現(xiàn)雙緩存顯示。
6 結(jié) 語
本文在windows平臺下利visual c++和opengl實現(xiàn)了衛(wèi)星星下點軌跡的二維可視化顯示,并介紹了其中的關(guān)鍵技術(shù)。只要繼續(xù)擴(kuò)展其功能,就可以為衛(wèi)星觀測和軌道預(yù)報提供服務(wù)。
c++相關(guān)文章:c++教程
評論