摘 要:介绍了在Windows系统平台及Visual C++ 6.0的MFC基础类库环境下,采用OpenGL技术与串口通信技术实现的飞行仿真系统的设计思想与程序实现方法。
关键词:虚拟现实 OpenGL 六维鼠标 串行口
虚拟现实是一种创建和体验虚拟世界的计算机系统。利用虚拟现实技术,计算机可以产生一个三维的虚拟环境,通过人的视觉、触觉等作用于人[1]。 用户以客观世界的实际动作或以人类熟悉的方式操作虚拟系统,从而实现立体交互,使人产生身临其境的感觉。虚拟现实系统一般由输入设备、输出设备、虚拟环境生成器和高性能的计算机系统四大部分构成。
目前,OpenGL在虚拟现实领域是功能较强,最具发展前途的实现工具。OpenGL是美国高级图形和高性能计算机系统公司(SGI)所开发的三维图形库,在当前已经成为事实上的高性能图形和交互式视景处理的标准[2]。OpenGL是一个独立的工作平台,用它编写的程序可以在不同的硬件平台(如工作站或个人微机)中使用,也可以在多种操作系统(如Windows系列、OS/2等)下运行。
经过近几年来的发展,虚拟现实技术及设备被很多领域应用,而飞行仿真是最重要的应用领域之一。本文所研究的飞行仿真系统采用新型六维控制器(六自由度鼠标)作为输入设备,监视器作为输出设备,以OpenGL作虚拟环境生成器,构成一套高性能计算机处理系统来实现高度仿真的飞行模拟器运动。
1 构建应用程序框架
应用Visual C++ 6.0建立一个基于MFC的应用程序框架,并将VC库文件opengl32.lib、glu32.lib和glaux.lib包含在应用程序中。
为使OpenGL函数库的调用有效,首先应设置渲染窗口。OpenGL的渲染处理完全不同于Windows的图形设备接口GDI。要使Windows的窗口格式为OpenGL所接受,需进行下列设置。
1.1 建立图形操作描述表
OpenGL作图窗口必须设置为WM_CLIPSIBLINGS和WM_CLIPCHILDREN风格。
在Windows98/2000系统下,窗口程序首先要处理设备描述表(Device Contexts,DC),它包括若干在窗口上如何显示图形的信息。而在OpenGL程序中,必须创建图形操作描述表(Rending Context,RC),这是DC中专用于OpenGL的一种。但是RC不同于其他的DC,它只需要一个句柄就可以任意调用OpenGL函数,而其他DC调用每个GDI函数时都需要一个句柄。
使用时先通过wglCreateContext()函数创建一个RC,然后调用wglMakeCurrent()函数启动它,就可在所定义的窗口内调用OpenGL函数绘制飞行器了。
m_pDC=new CClientDC(this);
hrc=wglCreateContext(m_pDC->GetSafeHdc( ));
wglMakeCurrent(m_pDC->GetSafeHdc( ),hrc);
1.2 设置像素格式
像素格式指定设备的绘图属性,包括绘图界面的颜色表示模式、颜色位数、累积缓存区、深度缓存区和模板缓存区的位数。每个OpenGL显示设备都支持某一特定的像素格式。像素格式用PIXELFORMATDESCRIPTOR结构来表示,通过设置这一结构的成员值使之支持OpenGL。建立了图形操作描述表并初始化PIXELFORMATDESCRIPTOR结构后,应以此结构为变量调用ChoosePixelFormat( )函数为设备描述表选择像素格式,最后调用SetPixelFormat( )将其设置为当前像素格式。
int pixelformat;
pixelformat=ChoosePixelFormat(m_pDC->GetSafeHdc( ),&pfd);
SetPixelFormat(m_pDC->GetSafeHdc( ),pixelformat,&pfd);
2 绘制场景
2.1 准备工作
开始绘制场景之前,需要用背景颜色刷新显存。飞行器在天空的背景中飞行,因此应将清除颜色缓冲区的颜色设为淡蓝色,然后刷新颜色缓冲区和深度缓冲区。
glClearColor(0.75,0.75,1.0,1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
准备工作还要考虑计算机屏幕是二维的,要用它显示逼真的三维物体就要用到图形变换技术。同时程序还要保证,当用户随意改变窗口大小时,飞行器不会变形失真。因此需要定义初始的坐标变换。视图类的OnSize事件对这些问题进行处理。
2.2 设置光照效果
创建三维立体的场景时,添加光线效果对于飞行器的真实感非常重要。OpenGL的光照模型将光照成分划分为四个独立的部分:发射光、环境光、散射光和镜面反射光。OpenGL独立计算这四种光照成分,然