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所示。
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为:
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()绑定纹理对象,并指定纹理坐标映射。纹理装载函数主要代码:
卫星覆盖的绘制是该文的关键部分。首先需要进行坐标转换,将卫星覆盖经纬度映射到计算机屏幕上的客户区。
除去上面两种情况,覆盖都会保持为封闭图形,这种情况比较好处理(如图7所示),只是要注意opengl不支持凹多边形绘制,而此时无法保证封闭图形式凸多边形,因此不能使用gl_polygon指令绘制。
6 结 语
本文在windows平台下利visual c++和opengl实现了卫星星下点轨迹的二维可视化显示,并介绍了其中的关键技术。只要继续扩展其功能,就可以为卫星观测和轨道预报提供服务。