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

          新聞中心

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

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

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

          1 引言

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

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

          對于開發(fā)者而言,opengl是包含幾十個指令或函數(shù)的集合,包括物體旋轉(zhuǎn)、平移縮放、材質(zhì)、光照、紋理、象素、位圖、文本以及提高圖形表現(xiàn)性能等。利用這些函數(shù)對三維的幾何對象進行描述,并利用坐標變換、對象著色、光照、消隱及映像到二維屏幕處理,最終實現(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模式的,應用程序發(fā)出opengl命令,由動態(tài)鏈接庫opengl32.dll接收和打包后,發(fā)送到服務器端的winsrv.dll,然后由他通過ddi層發(fā)往視頻顯示驅(qū)動程序。如果系統(tǒng)安裝了硬件加速器,則由硬件相關(guān)的ddi處理[1]。

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

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

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

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

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

          4 用opengl實現(xiàn)場景繪制的步驟

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

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

          (2)獲得windows設備描述表dc,然后將其與事先設置好的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)當退出opengl圖形窗口時,釋放opengl繪制描述表rc和windows設備描述表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ù)設置紋理的過濾類型[2]。調(diào)用gigentextures函數(shù)創(chuàng)建紋理對象,用背景繪制函數(shù)drawbackground()綁定紋理對象,并指定紋理坐標映射。紋理裝載函數(shù)主要代碼:


          地圖背景繪制函數(shù)drawbackground()的主要作用是將載入的紋理粘貼在指定的矩形上,并繪制等距墨卡托投影地圖的經(jīng)緯刻度線,地圖上經(jīng)緯度之間的間隔距離相同。主要代碼如下:

          5.2 衛(wèi)星覆蓋的繪制

          衛(wèi)星覆蓋的繪制是該文的關(guān)鍵部分。首先需要進行坐標轉(zhuǎn)換,將衛(wèi)星覆蓋經(jīng)緯度映射到計算機屏幕上的客戶區(qū)。


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

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

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

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

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

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

          為了實現(xiàn)衛(wèi)星運行的動畫效果,使用opengl的雙緩存技術(shù)[1],該技術(shù)使用2個前后臺2個緩存繪制畫面,在顯示前臺緩存內(nèi)容中的一幀畫面時,后臺緩存正在繪制下一幀畫面,當后臺緩存繪制完畢,后臺緩存內(nèi)容便顯示在屏幕上,而前臺此時又在繪制下一幀畫面內(nèi)容。如此循環(huán)反復,屏幕上顯示總是已經(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ù)擴展其功能,就可以為衛(wèi)星觀測和軌道預報提供服務。


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




          關(guān)鍵詞:

          評論


          相關(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); })();