基于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的空间态势三维场景视点控制与卫星轨道绘制_第1张图片
上图为地固系下的场景,可以看出,此时卫星轨道并不位于同一平面上。
基于osgEarth的空间态势三维场景视点控制与卫星轨道绘制_第2张图片
上图为惯性系下的场景,此时卫星轨道闭合且处于同一平面上。同时,在视点控制方式改变时,卫星当前位置与地球的位置关系是固定的、准确的。

你可能感兴趣的:(算法,3d,qt)