日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于osgEarth的空间态势三维场景视点控制与卫星轨道绘制

發布時間:2023/12/16 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于osgEarth的空间态势三维场景视点控制与卫星轨道绘制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于osgEarth的空間態勢三維場景視點控制與衛星軌道繪制

文章目錄

    • 基于osgEarth的空間態勢三維場景視點控制與衛星軌道繪制
  • 一、問題的提出
  • 二、視點控制方法
  • 三、衛星軌道繪制
  • 四、效果


一、問題的提出

osgEarth提供了全球地形的實時顯示,同時實現了SkyNode類,可以向場景中加入太陽、月亮和星空背景的顯示,因此基于osgEarth很容易構造空間態勢系統。

對于空間態勢而言,可以有兩種隨時間變化設置視點的方式。

一是將視點置于地固系中,這與一般的三維系統并無區別,即視點并不隨時間而改變,而只是根據操作改變視點。此時隨時間變化,地球固定不動,而太陽和星空背景隨時間變化。SkyNode類有一個接口setDateTime,其作用是根據時間計算一個相應的旋轉矩陣,應用到太陽和星空上。但是需要指出的是,該類的時間是格林威治時間,當我們開發基于北京時間的系統時,需要對該時間進行換算。

二是將視點置于慣性系中,這是一般態勢系統無需考慮的。相當于視點在太陽系中某個位置固定,而非在地球的坐標系中固定。此時, 太陽和星空位置基本不動,但地球在自轉。
除地球自轉與否之外,更重要的是空間態勢中衛星軌道的顯示問題。為增強真實感或表現衛星運動趨勢,空間態勢系統中往往會顯示衛星的軌道。通常我們所說的衛星軌道面,實際上是存在于慣性系中的,如果在某個固定時刻觀察,軌道上的采樣點并不處于同一平面之上。即如果在地固系下觀察,衛星軌道上任一個點是與某個時間點相關的。在目前的STK版本中,三維場景的視點是在慣性系下的,可以看到衛星的軌道為平面封閉圓。在STK的二維場景中,通過投影方式設置,可以以類似三維的方式呈現,此時視點在地固系下,但其速度是非常慢的。

而很多空間態勢系統在視點處理問題上,往往采用地固系視點,而要實現地球自轉效果,則只是運用傳統的圖形學技術,讓視點以一定速度繞地球旋轉或旋轉場景,在衛星軌道的顯示方面,也往往不夠準確。


二、視點控制方法

系統中地球以及各種實體的位置都是定義在地固系下的,場景的繪制也是基于地固系進行的。

如果視點置于地固系,并不需要特別控制視點,如果視點置于慣性系,則控制方法如下:
(1)實現一個Timer,在其中進行視點隨時間的控制;
(2)根據上一個仿真時間,計算視點對應的慣性系坐標;
(3)計算當前仿真時間時,該慣性系坐標對應的地固系坐標;
(4)將該地固系坐標設置為當前視點。

QDateTime st = _lastDateTime; st = st.addSecs(-3600 * 8); osg::Matrix mat = createJ2000ToECEFMatrix(DateTimeQt2Earth(st)); mat.invert(mat); osgViewer::Viewer* viewer = _osgWidget3D->getOsgViewer(); osgEarth::Viewpoint vp = (osgEarth::Util::EarthManipulator*)viewer->getCameraManipulator())->getViewpoint(); osg::Vec3d p0; vp.focalPoint()->toWorld(p0); p0 = mat * p0; st = simTime; st = st.addSecs(-3600 * 8); mat = createJ2000ToECEFMatrix(DateTimeQt2Earth(st)); p0 = mat * p0; osgEarth::GeoPoint ppp; ppp.fromWorld(MapNode::get(_mapNode)->getMapSRS(), p0); vp.focalPoint() = ppp; ((osgEarth::Util::EarthManipulator*)viewer->getCameraManipulator())->setViewpoint(vp);

在上述邏輯中,createJ2000ToECEFMatrix計算慣性系到地固系的旋轉矩陣,雖然精確計算衛星軌道時需要考慮歲差、章動和極移,但此時僅僅為了態勢顯示中的控制,單純考慮地球自轉的角度即可。


三、衛星軌道繪制

在地固系下的衛星軌道顯示非常簡單,預推一定時間范圍的衛星軌道采樣點,然后采用GL_LINE_STRIP生成primitive即可。

慣性系下的衛星軌道采用如下技術:
(1)衛星軌道采用慣性系下的采樣點(對應星歷時間的軌道數據);
(2)使用一個完整的軌道周期數據,當仿真時間超出當前軌道數據對應的時間范圍時,根據當前時間重新預推;
(3)繪制時根據當前時間,計算衛星星歷時間到當前時間的變換矩陣,基于該矩陣繪制。

class movingObjectShow3D :public osg::Group{ public:……osg::ref_ptr<osg::MatrixTransform> _trajectoryTransform;osg::ref_ptr<osg::Geode> _trajectory;osg::ref_ptr<osg::Geometry> _trajectoryGeometry;}

繪制類定義如上所示,其中trajectoryTransform定義了變換矩陣,繪制的幾何體是該矩陣的子節點。

QDateTime st = Application::_simCurrentTime; st = st.addSecs(-3600 * 8); SatelliteLib::Astro::AstroDateTime at; QDateTime2DateTime(st, at); CMatrix3D mats[4]; Application::_astroInterface->QueryCRFtoTRFMats(at, mats); CMatrix3D mat = mats[0] * mats[1]; osg::Matrix omat; omat.set((double*)mat.m_mat); _trajectoryTransform->setMatrix(omat);

在場景中的每一幀,矩陣更新代碼如上所示。


四、效果


上圖為地固系下的場景,可以看出,此時衛星軌道并不位于同一平面上。

上圖為慣性系下的場景,此時衛星軌道閉合且處于同一平面上。同時,在視點控制方式改變時,衛星當前位置與地球的位置關系是固定的、準確的。

總結

以上是生活随笔為你收集整理的基于osgEarth的空间态势三维场景视点控制与卫星轨道绘制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。