访问手机版页面
你的位置:老古开发网 > 其他 > 正文  
基于OPenGL的卫星覆盖可视化仿真
内容导读:

1 引言

opengl((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所示。

2.2 opengl渲染描述表(rc)与windows设备描述表(dc)

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不难得到:
为了在二维场景中绘制卫星的覆盖情况,需要计算覆盖边缘,显然在地球上这是一个圆。如图3所示。
oe为地心,0为卫星的星下点,过0点的经线与卫星覆盖圆交于p1,p2两点,a为覆盖圆上一点,则a的经纬度就是所求。在球面三角形poa中(如图4所示)。
其中,λ1,λ2为0点和a点的经度;δ1为0点的地心纬度;δ2为a点的地心纬度。
由上式可以解出δλ和h2,在解三角函数时要注意角度的象限,h2的范围是o~180°,所以有第一个式子可以直接解出,而δλ的范围是一180~180°,所以要分别解出正弦和余弦值已确定象限。有o~180°变换a,就可以求出一系列覆盖圆的边界点。

卫星星下点数据采用卫星轨道两行根数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°经线

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

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

5.3 启用双缓存显示技术

为了实现卫星运行的动画效果,使用opengl的双缓存技术[1],该技术使用2个前后台2个缓存绘制画面,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当后台缓存绘制完毕,后台缓存内容便显示在屏幕上,而前台此时又在绘制下一帧画面内容。如此循环反复,屏幕上显示总是已经画好的图形,看起来所有的画面都是连续的。场景绘制函数renderscence()中调用swapbuffers()函数来实现双缓存显示。

6 结 语

本文在windows平台下利visual c++和opengl实现了卫星星下点轨迹的二维可视化显示,并介绍了其中的关键技术。只要继续扩展其功能,就可以为卫星观测和轨道预报提供服务。


标签:
来源:《现代电子技术》 作者: 时间:2007/1/26 0:00:00
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐