基于OPenGL的卫星覆盖可视化仿真
1 引言
本文引用地址:https://www.eepw.com.cn/article/21353.htmopengl((open graphic library)是开放性图形库,他是一个三维的计算机图形和模型库,是由sgi公司为其图形工作站开发的iris gl演变而来的[2]。opengl最显著的特点是与硬件系统的无关性,可方便地将应用程序移植到另一个操作系统中,他能直接面向硬件调用3d处理功能,故处理3d图形速度特别快。
对于开发者而言,opengl是包含几十个指令或函数的集合,包括物体旋转、平移缩放、材质、光照、纹理、象素、位图、文本以及提高图形表现性能等。利用这些函数对三维的几何对象进行描述,并利用坐标变换、对象着色、光照、消隐及映像到二维屏幕处理,最终实现三维图形的显示[2],他基本上涵盖了开发可视化图形程序的方方面面。
2 opengl图形的实现
2.1 opengl体系结构
opengl是一个与平台无关的三维图形接口,操作系统必须提供象素格式管理和渲染环境管理。opengl在windows上的实现是基于client/server模式的,应用程序发出opengl命令,由动态链接库opengl32.dll接收和打包后,发送到服务器端的winsrv.dll,然后由他通过ddi层发往视频显示驱动程序。如果系统安装了硬件加速器,则由硬件相关的ddi处理[1]。
opengl/nt的体系结构如图1所示。

opengl的绘图方式与windows一般的绘图方式是不同的,opengl使用的是渲染描述表rc(render context)绘图,并且采用特殊的象素格式,而windows采用的是gdi绘图,使用时必须指定所用的设备描述表dc(device context)[3]。使用opengl也必须指定一个渲染描述表rc,以存储opengl所需的渲染信息如象素格式等,创建rc时与一个dc建立联系(rc也只能通过已经建立了位图格式的dc来创建),opengl的函数就可以通过rc对应的dc画到相应的显示设备上[1]。在使用opengl命令向窗口中绘图之前,必须先建立一个rc,并使之成为当前rc。
3 卫星覆盖数据分析
卫星对地观测理论覆盖的计算,在精度允许的前提下(可视化场景中对空间位置精度的要求有所降低),假设地球为圆球,如果单颗卫星运行于高度为h的轨道上,则他的覆盖几何如图2所示。其中ε为卫星的最小观测角,作为已知输人量,s为星下点,0为卫星,oe为地心,r为地球半径,则覆盖角d为:

在三维场景中为了绘制波束,需要求取σ和h,由图2不难得到:




卫星星下点数据采用卫星轨道两行根数tle文件,使用norad sgp4/sdp4轨道模型,可以获得精确的轨道预测[4]。tle考虑了地球扁率、日月引力的长期和周期摄动影响,以及大气阻力模型产生的引力共振和轨道衰退。tle是"平均"根数,他用特定的方法去掉了周期扰动项;预测模型必须用同样的方法重构周期扰动项。因此,tle并不适用于所有的解析解模型,为了获得高的预测精度,应该采用1980年12月norad公布的数学模型,该文的模型选用norad的sgp4和sgp4模型。sgp4模型用于近地目标,是lane和cranfordl969年解析理论的简化。地球引力场模型采用von-zeipel正则变换方法给出的摄动解结果;大气模型采用密度加权函数。sgp8是sgp4的外延,用于深空目标。深空方程由hujsak于1979年开发,模型考虑了地球扁率和日月引力。文中。利用sgp4/sdp4模型计算卫星星历,再根据卫星的星历计算星下点轨迹的经纬度。星下点轨迹数据包括:卫星从轨道根数基准时间开始所经历的时间,星下点的瞬时经纬度。这些数据虽然比较精确,但是不够直观和形象,采用等距墨卡托投影方法,将星下点投影到地球平面图上进行绘制和显示,使其具有形象,直观的特点。
4 用opengl实现场景绘制的步骤
使用visual c++6.o在单文档界面中绘制opengl场景,步骤为:
(1)在单文档窗口的创建过程中,设置象素格式和窗口的属性和风格,并在初始化窗口初始化时调用settimer()函数。
(2)获得windows设备描述表dc,然后将其与事先设置好的opengl绘制描述表rc联系起来;
(3)编写opengl绘制函数renderscence(),调用drawbackground()函数绘制地图背景和rendline()函数绘制星下点轨迹;
(4)在ondraw中调用opengl绘制函数renderscence();
(5)在onsize()方法中定义视图投影变换函数,由于这里需要将地球表面展开,使用正交投影函数gluorth02d(一180,180,一90,90);
(6)当退出opengl图形窗口时,释放opengl绘制描述表rc和windows设备描述表dc。
5 卫星星下点轨迹显示的关键技术
5.1 地球平面图的显示
从bmp文件读入地球平面图纹理,步骤是:首先用loadbmp函数打开bmp纹理文件,返回一个aux rg_bgbimagerec结构的数组指针,然后利用这个数组指针参数调用gitexlmage2d函数生成纹理,另外调用opengl中的gltexparameteri函数设置纹理的过滤类型[2]。调用gigentextures函数创建纹理对象,用背景绘制函数drawbackground()绑定纹理对象,并指定纹理坐标映射。纹理装载函数主要代码:

地图背景绘制函数drawbackground()的主要作用是将载入的纹理粘贴在指定的矩形上,并绘制等距墨卡托投影地图的经纬刻度线,地图上经纬度之间的间隔距离相同。主要代码如下:

5.2 卫星覆盖的绘制
卫星覆盖的绘制是该文的关键部分。首先需要进行坐标转换,将卫星覆盖经纬度映射到计算机屏幕上的客户区。

圆球上的一个圆投影到二维地图上,其形状很复杂,这给覆盖在二维视图中的绘制带来很大的困难。但是仔细的分析卫星对地观测覆盖的特点,这些复杂的图形可以分成3大类:
(1)覆盖包含南(北)极
覆盖包含南(北)极的情形如图5所示,此时覆盖于一90°(90°)纬线以及180°和一180°经线构成封闭图形,可以在纬度一90°(90°)对应各点(即经度相同的点)填加相同纬度的点进行绘制。

此时覆盖被分成2部分,分别与180°经线和一180°经线构成封闭图形(如图6所示),这种情况下可以在这两条经线上添加对应的点进行绘制。

除去上面两种情况,覆盖都会保持为封闭图形,这种情况比较好处理(如图7所示),只是要注意opengl不支持凹多边形绘制,而此时无法保证封闭图形式凸多边形,因此不能使用gl_polygon指令绘制。

为了实现卫星运行的动画效果,使用opengl的双缓存技术[1],该技术使用2个前后台2个缓存绘制画面,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当后台缓存绘制完毕,后台缓存内容便显示在屏幕上,而前台此时又在绘制下一帧画面内容。如此循环反复,屏幕上显示总是已经画好的图形,看起来所有的画面都是连续的。场景绘制函数renderscence()中调用swapbuffers()函数来实现双缓存显示。
6 结 语
本文在windows平台下利visual c++和opengl实现了卫星星下点轨迹的二维可视化显示,并介绍了其中的关键技术。只要继续扩展其功能,就可以为卫星观测和轨道预报提供服务。
c++相关文章:c++教程
评论