首页 > 范文大全 > 正文

基于OpenGL的卫星发射入轨系统的研究及仿真实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇基于OpenGL的卫星发射入轨系统的研究及仿真实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:介绍了基于opengl卫星发射入轨仿真系统的开发与实现,包括程序设计框架,具体模块封装,天体模型设计,卫星飞行过程的视觉设计与实现,动画效果体现等,实现了卫星发射至入轨过程的动态仿真。

关键词:卫星发射仿真;OpenGL;3D建模;可视化仿真;动画效果

中图分类号:TP391.9文献标识码:A 文章编号:1009-3044(2011)16-3933-03

Research and Implementation on Simulation System of Satellite into Orbit Based on OpenGL

ZHANG Tong

(Department of Computer Science, Tongji University, Shanghai 201804, China)

Abstract: Describe the development and implementation on the OpenGL-based satellite launching orbit simulation system, including program design framework, the specific module package, object model design, satellite design and implementation process of the visual, animation effects, and so on. Realize the dynamic simulation of satellite launched into orbit.

Key words: simulation of satellite launch; OpenGL; 3D modeling; visual simulation; animation effects

目前,随着我国空间信息科学技术研究的深入,在卫星发射中引入三维可视化图形技术已是必然的趋势。因此,结合当前的要求,开发有真实感的卫星发射至入轨过程仿真软件,具有一定的实用意义。

SGI公司推出的OpenGL三维图形库因其易于使用而且功能强大而成为高性能图形和交互式视景处理的标准[1]。但OpenGL没有提供高级命令函数来定义复杂的三维模型,而只提供点、线、多边形的方式来构建三维模型;虽然提供了创建复杂几何物体的机制,却未提供描述复杂的几何物体以及建立复杂几何物体模型的手段,所以描述卫星三维模型是一项艰巨的工作。采用借助三维建模软件(3DSMAX)建造卫星模型既有利于三维仿真,也有利于模型运动的计算和控制,可减少大量工作量。但3DS数据格式只能保存和转换几何信息,色彩,材质等信息可能会在转换时丢失,在程序的编写过程中要对色彩和材质等进行处理。

本文在OpenGL三维图形编程环境中,使用3D Max建立卫星模型并将其导入OpenGL,调用OpenGL图形库的函数,并通过对卫星轨道方程的计算,设计天体模型,实现卫星飞行过程的视觉设计和动画效果,达到卫星发射至入轨过程的仿真目的。在实现过程中,使用了OpenGL提供的动画机制,是整个画面看起来更流畅,更具有真实感。

1 卫星轨道方程的计算

1.1 卫星在轨运行的无摄运动

若将地球或任何一个探测目标天体(如大行星,小行星等)看成一个质量密度分布均匀的球体,则它对绕其运行的卫星的引力作用可等效于一个质点,相当于质量全部集中在该天体质心上,于是就构成一个简单的二体系统,一个中心天体和一个运动天体。以地球和人造卫星为例,将坐标系的原点放在地心上。讨论人造卫星相对地心的运动,则卫星运动方程可写成:

(1)

其中 r 是卫星相对于地心的位置向量,h 是卫星的高度即地心距,μ = GM 是地心引力常数,M 表示地球质量。

1.2 二体问题的积分与轨道常数

研究两个质点在万有引力作用下的运动规律的问题被称为二体问题。若将地球看成质量密度分布均匀的球体,则它对绕其运行的卫星的引力作用可等效为一个质点,相当于质量全部集中在地球的质心,即地心上,于是就构成一个以地球为中心天体、卫星为运动天体的简单二体系统。

二体系统的积分公式与轨道常数是本系统程序核心算法的基础[2]。以下列出主要积分公式:

人造卫星绕地球的运动为一平面运动,相应的动量矩积分可写成:

(2)

其中,h为面积速度常数,R表示面积速度方向,它是卫星运动平面的法向单位矢量。

人造地球卫星运行轨迹为椭圆,地心在椭圆的焦点上。以下为轨道积分之一,其中e和ω即两个新的轨道常数:

(3)

卫星运动即在以上数学基础上进行研究。

2 程序设计框架

本程序以Visual C++6.0作为编程开发平台,调用OpenGL三维图形库,使用3D Max建立卫星模型并保存为3DS数据格式,将3D模型导入OpenGL,再通过坐标的变换、渲染、纹理、光照、混合等功能,充分利用一些已有的模块,实现卫星发射至入轨过程的仿真。程序主体框架如图1所示。

3 天体模型的设计与实现

3.1 绘制天体的父类设计

本系统中最终的卫星发射至入轨过程的动态显示画面中应包含地球、太阳、月亮、星空以及卫星。除了卫星,其他几种景物的实现都可归结为球体模型的构建,星空的实现也需借助于球体:即将整个系统置于一个半径很大的虚拟球体中,在此球体表面映射上星空的纹理,这样在系统中任何角度都能看到星空的景象,并且具有一定的立体感。基于这种实现上的需要,设计一个名为CModelObj的类作为其父类,通过C++提供的继承机制,派生出所需要的子类。

根据OpenGL只提供基本几何图元(点,线,多边形)的绘制特性,球体设计的思路为:绘制多个四边形,然后将其拼接起来。

具体实现方式为:在水平方向上将球体划分为M圈(类似于地球的纬度分割),竖直方向上将球体划分为N圈(类似于地球的经度分割)。按照先从水平方向,再从竖直方向上循环绘制四边形,共需要绘制M*N个四边形。假设球体半径为r,球的中心在坐标原点,坐标系采用OpenGL中的右手坐标系[3]。

假设球面上一个顶点A,AO与y轴的夹角为φ, AO在xoz平面的投影与z轴的夹角为θ,那么A点的坐标为

(X = r*sinφ*sinθ,Y = r*cosφ,Z = r*sinφ*cosθ);

顶点A的法向量为( sinφ*sinθ, cosφ, sinφ*cosθ ),顶点的法向量用于实体光照模型中。对于第i行(0 ≤ i < N),第j列(0 ≤ j < M),φ和θ的取值为

φ = i*π/NCπ/2,θ = j*2*π/M

在顶点的计算中,不仅要计算顶点的坐标和法向量,还需要计算该顶点的纹理坐标。然后将顶点的计算结果保存在数组中,供以后调用。

3.2 天体模型的实现

地球、太阳以及月球都是按照上述方法绘制。为了增加模型的真实感,使用了纹理贴图,并且在地球增加了云层和大气层,通过一个循环自增变量控制云层的移动,模拟真实自然界大气层对光的折射。

云层在视觉上都是环绕在地球表面的半透明球体,因此也作为CModelObj的子类来处理。使用云层的纹理贴图可以使其看起来更具真实感。另外,云层的透明性通过混合处理来实现。大气层附着在云层,大气的显示颜色与观察者的观察方向、太阳的位置以及地表位置有关。地球在自转的同时,也围绕着太阳公转,这意味着在不同时刻,地球表面被光源(太阳)照亮的地方都不同,但始终只有朝向太阳的一面才能被照亮。

大气层绘制的具体实现方法为:首先计算出观察点的太阳地平纬度(即地平线与太阳的角度距离),如图2所示。

在程序中,先通过地球的位置,观察点的位置,和太阳的位置,来确定AB与地球的切点O。步骤如下:

首先,计算地球中心到太阳中心的向量EF;

其次,计算出观察位置到地球中心的向量为eyeVec;

再次,通过向量EF,和向量eyeVec,计算向量T。T与前两个向量处于同一平面,且为观察位置与地球的切线方向。从而得到切点O。切点O的具体算法可以参考程序中的函数CGEllipsoidAtmosphereRender::ellipsoidTangent;

最后,通过计算AB与EF的叉积,计算太阳地平纬度的余弦值。在后面的颜色计算中将使用地平纬度的余弦值。

计算出大气的轮廓后,只需要在地球的绘制圆环即可,同样使用四边形拼接法来绘制。如果一个圆周用M个四边形连接,一个圆环有N层,那么需要绘制N*M个四边形[4]。

最后对顶点的颜色进行处理,颜色的设置应该有大气层的厚度决定(大气层的厚度不同,对光线的折射率不同,从而显现出的颜色也就不同),并运用亮度因子进行亮度调节。最后的效果如图3所示。

4 卫星飞行过程的视觉设计及实现

在本程序的设计过程中,为了体现出卫星发射后在太空中飞行的过程,将视点设置成跟踪卫星,即视点始终跟随卫星飞行。基于以下OpenGL变换原理实现:取景变换,模型变换,投影变换,视区变换[5]。因此,以pSendUp->xcam,pSendUp->ycam,pSendUp->zcam等变量为参数调用函数gluLookAt,此函数是实现视点跟踪的关键[9]。

函数gluLookAt的函数体一共包括三组参数,分别用于指定视点的位置,定义一个相机指向的参考点和指示那一个方向向上。首先,要选择一个能得到预想场景的视点,而参考点一般位于场景的中间位置(如果已经将场景构建在了原点处,那么参考点通常就是原点)。如何确定向上的方向向量比较复杂[6]。以本程序的设计为例,在卫星飞行过程中,该方向向量应该始终垂直于机翼并向上。而当卫星到达预定轨道并显示在轨飞行时,则场景应该在原点,而且y轴的正方向向上。该函数在扫描全景时尤其有用。在x和y对称的视图体中,所指定的(eyex,eyey,eyez)点总是处在屏幕上图像的中心点处。这样就可以使用一系列的变换函数,逐渐移动该点,从而实现对场景的全景扫描。gluLookAt函数的原型为:

void gluLookAt( GLdoubleeyex , GLdoubleeyey , GLdoubleeyez , GLdoublecenterx , GLdoublecentery , GLdoublecenterz , GLdoubleupx , GLdoubleupy , GLdoubleupz )。该函数定义一个视图矩阵并将其右乘到当前矩阵上,其结果返回给当前矩阵。期望的视点由参数eyex,eyey,eyez指定,而参数centerx,centery,centerz指定期望视线上的任意一点,通常取观测场景中心的点,这两点就确定了视线的方向。参数upx,upy,upz指定向上的方向(即视图体自下而上的方向)。

gluLookAt函数在本程序中的调用实例为:

gluLookAt(pSendUp->xcam,pSendUp->ycam,pSendUp->zcam,pSendUp->xmis,pSendUp->ymis,(pSendUp->zmis)/10,0.0f,1.0f,0.0f);

其中,参数pSendUp->xcam,pSendUp->ycam,pSendUp->zcam,能够实现自减运算,从而实现卫星位置和视点位置的不断变换,以达到跟踪的效果。试点追随正在飞行的卫星,并按y轴方向上升。

5 实现卫星飞行的动画效果

5.1 基于OpenGL的动画实现

本系统中的卫星飞行动画基于计算机动画中标准动画法和物理动画法完成,基于OpenGL的双缓冲机制来实现。在显示前台缓冲内容中的一帧画面的同时,后台缓冲正在绘制下一帧画面,当绘制完毕,再将后台缓冲的内容显示出来,这时前台缓冲则又开始绘制下一帧画面,如此循环往复,屏幕上总是呈现显示好的内容,因此画面看上去是连续的,这是一种类似于流水线的操作方式[7]。

为了模拟卫星的飞行效果,在每两帧画面之间坐标平移和旋转操作,即后一帧画面可由前一帧画面经过平移和旋转操作得到。平移和旋转分别由一个参数决定,参数的修改在绘制两帧画面之间进行[8]。在本程序中,实现卫星飞行过程的关键函数为:

glTranslatef(xm,ym,zm);

glRotatef(am,1.0f,0.0f,0.0f);

glRotatef(180.0f,0.0f,1.0f,0.0f);

这些语句在每两帧画面切换时被调用,以实现卫星位置的不断变换。

5.2 模拟发射过程的尾焰效果

在实际的卫星发射过程中,卫星是由运载火箭送入太空的,卫星本身不带有升空过程的动力设备。运载火箭将卫星送入预定轨道后,即与卫星脱离。同步人造地球卫星绕着地球飞行时,是以地球对其的万有引力作为向心力绕轨运行[10]。

在本程序的设计过程中,由于技术上的一些限制条件,并没有将卫星与运载火箭捆绑,而是假定卫星自己具有动力源,为了达到预期的仿真效果,利用OpenGL提供的一些相关技术,对火箭上升过程中的喷射尾焰进行了模拟。

实现尾焰的模拟效果主要使用视图变换和纹理贴图等技术。定义一些规则的几何体,然后对这些几何体进行预定轨道的位置变换,通过使用纹理贴图技术,使其看起来更具有真实感。本程序中通过以下步骤进行火焰效果仿真:

首先,用规则的三维几何体定义尾焰轮廓;

其次,对该几何体尾部进行透明度扰动以产生火焰的喷射效果;

最后,用分段函数定义几何体各区间的颜色以求色彩逼真。

6 结论

在本卫星发射至入轨过程仿真系统的设计过程中,以OpenGL图形接口为开发环境,在Visual C++中调用系统封装的OpenGL函数,运用OpenGL的各项功能,例如模型变换,投影变换等,实现了卫星发射过程的动态仿真及卫星飞行过程的动画显示。在本程序的编写过程中,采用了标准动画法来绘制卫星的过程,在视觉上带来了一定的真实感,但在仿真方面还不够完善,此外,卫星在轨运行的模型使用的是无摄运动模型,它比真是太空中天体的运动简单很多。怎样从计算公式的角度和动画仿真的角度提高模型的真实性,还有待进一步的研究。

参考文献:

[1] 黄权,徐学军.基于OpenGL的卫星跟踪仿真[J].计算机技术与发展,2007,17(2):131-134.

[2] 刘林.人造地球卫星轨道力学[M].北京:高等教育出版社,1992:1-100.

[3] Jim Pitts,Martin Van Velsen,Robin Fercoq,et al.3D Studio File Format[Z].1997.

[4] 夏一飞,黄天衣.球面天文学[M].南京:南京大学出版社,1995:20-200.

[5] Dave Shreiner,Mason Woo,Jackie Neider,等.OpenGL编程指南[M].北京:机械工业出版社,2006:1-297.

[6] Mark Segal,Kurt Akeley.The OpenGL Graphics System: A Specification(Version 2.1)[Z].2006:1-394.

[7] 唐泽圣,周嘉玉,李新友.计算机图形学基础[M].北京:清华大学出版社,1999:1-180.

[8] Cass Everitt.OpenGL ARB Vertex Program[Z].2003:1-58.

[9] 刁成嘉,刁奕.C++面向对象编程基础[M].北京:机械工业出版社,2007:95-117.

[10] 刘林,胡松洁.航天动力学引论[M].南京:南京大学出版社,2006:21-33.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文