<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于OPenGL的衛(wèi)星覆蓋可視化仿真

          基于OPenGL的衛(wèi)星覆蓋可視化仿真

          ——
          作者: 時(shí)間:2007-01-26 來源:《現(xiàn)代電子技術(shù)》 收藏

          1 引言

          本文引用地址:http://www.ex-cimer.com/article/21353.htm

          opengl((open graphic library)是開放性圖形庫,他是一個(gè)三維的計(jì)算機(jī)圖形和模型庫,是由sgi公司為其圖形工作站開發(fā)的iris gl演變而來的[2]。opengl最顯著的特點(diǎn)是與硬件系統(tǒng)的無關(guān)性,可方便地將應(yīng)用程序移植到另一個(gè)操作系統(tǒng)中,他能直接面向硬件調(diào)用3d處理功能,故處理3d圖形速度特別快。

          對(duì)于開發(fā)者而言,opengl是包含幾十個(gè)指令或函數(shù)的集合,包括物體旋轉(zhuǎn)、平移縮放、材質(zhì)、光照、紋理、象素、位圖、文本以及提高圖形表現(xiàn)性能等。利用這些函數(shù)對(duì)三維的幾何對(duì)象進(jìn)行描述,并利用坐標(biāo)變換、對(duì)象著色、光照、消隱及映像到二維屏幕處理,最終實(shí)現(xiàn)三維圖形的顯示[2],他基本上涵蓋了開發(fā)可視化圖形程序的方方面面。

          2 opengl圖形的實(shí)現(xiàn)

          2.1 opengl體系結(jié)構(gòu)

          opengl是一個(gè)與平臺(tái)無關(guān)的三維圖形接口,操作系統(tǒng)必須提供象素格式管理和渲染環(huán)境管理。opengl在windows上的實(shí)現(xiàn)是基于client/server模式的,應(yīng)用程序發(fā)出opengl命令,由動(dòng)態(tài)鏈接庫opengl32.dll接收和打包后,發(fā)送到服務(wù)器端的winsrv.dll,然后由他通過ddi層發(fā)往視頻顯示驅(qū)動(dòng)程序。如果系統(tǒng)安裝了硬件加速器,則由硬件相關(guān)的ddi處理[1]。

          opengl/nt的體系結(jié)構(gòu)如圖1所示。

          2.2 opengl渲染描述表(rc)與windows設(shè)備描述表(dc)

          opengl的繪圖方式與windows一般的繪圖方式是不同的,opengl使用的是渲染描述表rc(render context)繪圖,并且采用特殊的象素格式,而windows采用的是gdi繪圖,使用時(shí)必須指定所用的設(shè)備描述表dc(device context)[3]。使用opengl也必須指定一個(gè)渲染描述表rc,以存儲(chǔ)opengl所需的渲染信息如象素格式等,創(chuàng)建rc時(shí)與一個(gè)dc建立聯(lián)系(rc也只能通過已經(jīng)建立了位圖格式的dc來創(chuàng)建),opengl的函數(shù)就可以通過rc對(duì)應(yīng)的dc畫到相應(yīng)的顯示設(shè)備上[1]。在使用opengl命令向窗口中繪圖之前,必須先建立一個(gè)rc,并使之成為當(dāng)前rc。

          3 衛(wèi)星覆蓋數(shù)據(jù)分析

          衛(wèi)星對(duì)地觀測(cè)理論覆蓋的計(jì)算,在精度允許的前提下(可視化場(chǎng)景中對(duì)空間位置精度的要求有所降低),假設(shè)地球?yàn)閳A球,如果單顆衛(wèi)星運(yùn)行于高度為h的軌道上,則他的覆蓋幾何如圖2所示。其中ε為衛(wèi)星的最小觀測(cè)角,作為已知輸人量,s為星下點(diǎn),0為衛(wèi)星,oe為地心,r為地球半徑,則覆蓋角d為:


          在三維場(chǎng)景中為了繪制波束,需要求取σ和h,由圖2不難得到:
          為了在二維場(chǎng)景中繪制衛(wèi)星的覆蓋情況,需要計(jì)算覆蓋邊緣,顯然在地球上這是一個(gè)圓。如圖3所示。
          oe為地心,0為衛(wèi)星的星下點(diǎn),過0點(diǎn)的經(jīng)線與衛(wèi)星覆蓋圓交于p1,p2兩點(diǎn),a為覆蓋圓上一點(diǎn),則a的經(jīng)緯度就是所求。在球面三角形poa中(如圖4所示)。
          其中,λ1,λ2為0點(diǎn)和a點(diǎn)的經(jīng)度;δ1為0點(diǎn)的地心緯度;δ2為a點(diǎn)的地心緯度。
          由上式可以解出δλ和h2,在解三角函數(shù)時(shí)要注意角度的象限,h2的范圍是o~180°,所以有第一個(gè)式子可以直接解出,而δλ的范圍是一180~180°,所以要分別解出正弦和余弦值已確定象限。有o~180°變換a,就可以求出一系列覆蓋圓的邊界點(diǎn)。

          衛(wèi)星星下點(diǎn)數(shù)據(jù)采用衛(wèi)星軌道兩行根數(shù)tle文件,使用norad sgp4/sdp4軌道模型,可以獲得精確的軌道預(yù)測(cè)[4]。tle考慮了地球扁率、日月引力的長(zhǎng)期和周期攝動(dòng)影響,以及大氣阻力模型產(chǎn)生的引力共振和軌道衰退。tle是"平均"根數(shù),他用特定的方法去掉了周期擾動(dòng)項(xiàng);預(yù)測(cè)模型必須用同樣的方法重構(gòu)周期擾動(dòng)項(xiàng)。因此,tle并不適用于所有的解析解模型,為了獲得高的預(yù)測(cè)精度,應(yīng)該采用1980年12月norad公布的數(shù)學(xué)模型,該文的模型選用norad的sgp4和sgp4模型。sgp4模型用于近地目標(biāo),是lane和cranfordl969年解析理論的簡(jiǎn)化。地球引力場(chǎng)模型采用von-zeipel正則變換方法給出的攝動(dòng)解結(jié)果;大氣模型采用密度加權(quán)函數(shù)。sgp8是sgp4的外延,用于深空目標(biāo)。深空方程由hujsak于1979年開發(fā),模型考慮了地球扁率和日月引力。文中。利用sgp4/sdp4模型計(jì)算衛(wèi)星星歷,再根據(jù)衛(wèi)星的星歷計(jì)算星下點(diǎn)軌跡的經(jīng)緯度。星下點(diǎn)軌跡數(shù)據(jù)包括:衛(wèi)星從軌道根數(shù)基準(zhǔn)時(shí)間開始所經(jīng)歷的時(shí)間,星下點(diǎn)的瞬時(shí)經(jīng)緯度。這些數(shù)據(jù)雖然比較精確,但是不夠直觀和形象,采用等距墨卡托投影方法,將星下點(diǎn)投影到地球平面圖上進(jìn)行繪制和顯示,使其具有形象,直觀的特點(diǎn)。

          4 用opengl實(shí)現(xiàn)場(chǎng)景繪制的步驟

          使用visual c++6.o在單文檔界面中繪制opengl場(chǎng)景,步驟為:

          (1)在單文檔窗口的創(chuàng)建過程中,設(shè)置象素格式和窗口的屬性和風(fēng)格,并在初始化窗口初始化時(shí)調(diào)用settimer()函數(shù)。

          (2)獲得windows設(shè)備描述表dc,然后將其與事先設(shè)置好的opengl繪制描述表rc聯(lián)系起來;

          (3)編寫opengl繪制函數(shù)renderscence(),調(diào)用drawbackground()函數(shù)繪制地圖背景和rendline()函數(shù)繪制星下點(diǎn)軌跡;

          (4)在ondraw中調(diào)用opengl繪制函數(shù)renderscence();

          (5)在onsize()方法中定義視圖投影變換函數(shù),由于這里需要將地球表面展開,使用正交投影函數(shù)gluorth02d(一180,180,一90,90);

          (6)當(dāng)退出opengl圖形窗口時(shí),釋放opengl繪制描述表rc和windows設(shè)備描述表dc。

          5 衛(wèi)星星下點(diǎn)軌跡顯示的關(guān)鍵技術(shù)

          5.1 地球平面圖的顯示

          從bmp文件讀入地球平面圖紋理,步驟是:首先用loadbmp函數(shù)打開bmp紋理文件,返回一個(gè)aux rg_bgbimagerec結(jié)構(gòu)的數(shù)組指針,然后利用這個(gè)數(shù)組指針參數(shù)調(diào)用gitexlmage2d函數(shù)生成紋理,另外調(diào)用opengl中的gltexparameteri函數(shù)設(shè)置紋理的過濾類型[2]。調(diào)用gigentextures函數(shù)創(chuàng)建紋理對(duì)象,用背景繪制函數(shù)drawbackground()綁定紋理對(duì)象,并指定紋理坐標(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ì)算機(jī)屏幕上的客戶區(qū)。


          圓球上的一個(gè)圓投影到二維地圖上,其形狀很復(fù)雜,這給覆蓋在二維視圖中的繪制帶來很大的困難。但是仔細(xì)的分析衛(wèi)星對(duì)地觀測(cè)覆蓋的特點(diǎn),這些復(fù)雜的圖形可以分成3大類:

          (1)覆蓋包含南(北)極

          覆蓋包含南(北)極的情形如圖5所示,此時(shí)覆蓋于一90°(90°)緯線以及180°和一180°經(jīng)線構(gòu)成封閉圖形,可以在緯度一90°(90°)對(duì)應(yīng)各點(diǎn)(即經(jīng)度相同的點(diǎn))填加相同緯度的點(diǎn)進(jìn)行繪制。
          (2)覆蓋跨越180°經(jīng)線

          此時(shí)覆蓋被分成2部分,分別與180°經(jīng)線和一180°經(jīng)線構(gòu)成封閉圖形(如圖6所示),這種情況下可以在這兩條經(jīng)線上添加對(duì)應(yīng)的點(diǎn)進(jìn)行繪制。
          (3)覆蓋的投影保持封閉

          除去上面兩種情況,覆蓋都會(huì)保持為封閉圖形,這種情況比較好處理(如圖7所示),只是要注意opengl不支持凹多邊形繪制,而此時(shí)無法保證封閉圖形式凸多邊形,因此不能使用gl_polygon指令繪制。

          5.3 啟用雙緩存顯示技術(shù)

          為了實(shí)現(xiàn)衛(wèi)星運(yùn)行的動(dòng)畫效果,使用opengl的雙緩存技術(shù)[1],該技術(shù)使用2個(gè)前后臺(tái)2個(gè)緩存繪制畫面,在顯示前臺(tái)緩存內(nèi)容中的一幀畫面時(shí),后臺(tái)緩存正在繪制下一幀畫面,當(dāng)后臺(tái)緩存繪制完畢,后臺(tái)緩存內(nèi)容便顯示在屏幕上,而前臺(tái)此時(shí)又在繪制下一幀畫面內(nèi)容。如此循環(huán)反復(fù),屏幕上顯示總是已經(jīng)畫好的圖形,看起來所有的畫面都是連續(xù)的。場(chǎng)景繪制函數(shù)renderscence()中調(diào)用swapbuffers()函數(shù)來實(shí)現(xiàn)雙緩存顯示。

          6 結(jié) 語

          本文在windows平臺(tái)下利visual c++和opengl實(shí)現(xiàn)了衛(wèi)星星下點(diǎn)軌跡的二維可視化顯示,并介紹了其中的關(guān)鍵技術(shù)。只要繼續(xù)擴(kuò)展其功能,就可以為衛(wèi)星觀測(cè)和軌道預(yù)報(bào)提供服務(wù)。


          c++相關(guān)文章:c++教程




          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();