基于OpenGL校园漫游系统的设计与开发摘要:本文讨论了基于VC+ +开发平台和O p e n GL的虚拟校园漫游系统的设计与实现,进行了北京航空航天大学新主楼教学区场景的建模,采用绘制位图的方法实现字体显示,通过天空盒技术实现天空绘制,并采用R OA M算法实现地形渲染等,最终实现了虚拟校园漫游系统。
关键词:虚拟校园O p en GL R OAM算法虚拟现实技术已经成为计算机领域的热点,广泛应用到各个领域。
它在学校发展等许多方面发挥了重要的作用,对数字化校园建设有着重要的现实意义[1]。
Op e nGL(Op e n Gr aph ic s L ibr a r y)是一种与硬件、窗口系统和操作系统相独立的一系列A P I,由大量功能强大的图形函数组成。
开发人员可以利用这些函数对整个三维图形进行光色渲染,从而方便地绘制出客观世界逼真的三维景象[2]。
本论文研究的虚拟校园漫游系统,是以北京航空航天大学校本部新主楼教学区域为虚拟空间,根据虚拟现实技术原理,以Vi s u a l C++ 为开发平台,Op e nGL 为核心,结合3D M A X 技术创建出的虚拟校园漫游系统。
1 系统的总体设计思路以及三维场景的生成方法在分析研究了虚拟现实技术的特点以及其在虚拟漫游系统中的运用的基础上,本文以计算机为中心、显示器为视口、键盘和鼠标为交互设备进行研究与开发,实现具有一定人机交互能力的虚拟校园漫游系统,用户可以在三维的虚拟校园中进行自由的漫游,可以实现真实感的交互操作。
本系统由 3 个部分组成:三维场景的建模及其后处理、模型驱动显示、校园漫游部分。
虚拟校园系统中的地理对象按空间分布特性分为两类:一类是以场景为基础,在空间上连续分布的地形景观对象,如地形;另一类是以离散实体为特性,以独立的个体而存在的地物对象,如建筑物、树木、路灯等。
对虚拟校园模型进行分类以后,虚拟校园的三维模型构建流程描述如图1[3]所示:本文采用3D M A X 实现校园新主楼区域的建模,并在此基础上进行纹理处理和渲染,目的是增强虚拟场景的真实感。
2 校园漫游系统的设计与实现2.1 系统框架的设计本系统采用了面向对象(O b j e c tO r i e n t e d,O O)的风格,其基本思想是使用对象、类、继承、封装、消息等基本概念来进行程序设计。
在本项目中,建立了三个主要的类:GL _W i n d ow 类、Ke y s 类和GL _A p pl i c a t i o n 类。
其中G L _Wi n d o w 类负责窗口属性的设置和更新,以及建立和删除窗口等操作。
K e y s 类负责读取和设置键盘各个按键的状态,用于后来的人机交互。
G L _ A p p l i c a t i o n 类负责建立我们的应用程序,包括初始化、更新、绘制图形和卸载等操作,以及消息循环处理和定义程序入口等。
2.2 3 D S 文件导入在本项目中,建立了两个主要的类:3D S类和Te x t u r e 类来负责3D S 文件的导入。
最后在程序初始化O p e n GL 的时候运行以下代码:c3D SMo d e l.L o a d (“m i a n 2.3D S”);// 加载3D 模型3D 模型导入的文件格式必须是3D S的。
它是由很多块组成。
而这些块中,大块往往镶嵌着子块。
块是由块信息和块数据组成,而块信息则是由块I D 和块长度组成。
程序运用递归的方法来读取块结构,当父块读取完指向子块时,用s w i t c h 语句来实现。
通过子块的I D 来判断。
流程图如下图2所示。
2.3 虚拟校园漫游的实现2.3.1 字体显示O p e n G L 英文字体的显示主要包括平面文字的显示和立体文字的显示,要想在屏幕上面显示文字,一般按照下面的步骤来进行:(1)在设备场景中创建具有一定属性的字体。
(2)建立一套基于DC 字体字图的显示列表。
(3)用这些显示列表调用g lCa l l L i s t s来一一绘制字符串中的字符。
而在O p e n GL 中显示汉字的基本思想和显示英文是相同的,即用wglUseFontBitmaps或wglUs eFontOut l i ne s 为每个字生成一个显示列表,然后对每个字调用glCal lList() 或对一个字串调用glCallList() 即可显示。
定义一个字体类,主要包括字体的初始化、输出字体和删除字体等操作。
在O p e n G L 中显示中西文混合文本有许多方法,本文介绍一种绘制位图的方法:首先创建一种我们需要的字体,然后在特定的设备场景中用G D I 方式将文字形成一个单色位图,最后调用O p e n G L 绘制位图函数g l Bit m ap () 将文字显示出来。
2.3.2 天空绘制天空盒其实就是一个覆盖场景四周的长方体,但它的各个面上贴有表示天空的问题图片,即四周的四面问题图片的边与顶面纹理图片的边相连,同时四面纹理图片前后相连,图片大小为 2 的N 次方(32,6 4,128,…),利用天空盒可以生成逼真的天空效果。
在O p e n G L 设置纹理滤波的方式中,其中的G L _ T E X T U R E _W R A P _ S 和GL _T EX TUR E _WR A P_T 通常可设置为GL _ R E PEAT 和GL _CLAMP 两种方式。
当待填充的多边形大于纹理的时候,G L _R E P EAT 表示多余的部分用重复的方式填充;GL _CLAMP 表示多余的部分用相连边缘的相邻像素填充。
在天空盒的实际绘制中,这会造成天空盒几幅纹理之间会出现裂缝,降低了天空盒的真实感。
为了解决该问题,本文采用GL _CLAMP_TO_ EDGE 来处理,如下所示:g l T e x P a r m e t e r i ( G L _TEXTURE _2D,GL _TEXTURE _WRAP_S,GL_CLAMP_TO_EDGE);g l T e x P a r m e t e r i ( G L _TEXTURE _2D,GL _TEXTURE _WRAP_T,GL_CLAMP_TO_EDGE);此参数在填充纹理边框时只用于该边的边缘纹理,这就消除了接缝处的细线,增强了天空盒的真实感。
2.3.3 地形渲染由于实际地形的千差万别,使得三维真实感地形模拟的数据量极大,为了减轻地形渲染时硬件的压力,在实现3D 渲染时,需要采用层次细节技术(L OD)[4]。
即距离视点较近的区域,采用较高的细节层次,进行较为逼真的3D 渲染;距离视点较远的区域,采用较低的细节层次,进行大致的3D 渲染。
L O D 技术在大规模地形渲染技术中得到了广泛的应用[5]。
常见的L O D 渲染地形方法有基于视点的渐进格网法(V D P M), 实时优化自适应网格(R O A M)、基于四叉树的简化算法以及这些算法的各种改进算法等。
实时优化自适应网格(R O A M)模型是基于二元三角树结构的,这里每一个地形碎片(P a t c h)都是一个单独的等腰三角形,从它的顶点到对面斜边的中点分割三角形为两个新的等腰三角形。
分割是递归进行的,可以被子三角形重复直到达到希望的细节等级, 使用二元三角树来保持三角坐标而不是存储一个巨大的三角形坐标数组来描绘地形结构,用基于树的结构来控制随着深度增加而呈指数增长的内存,这样可以保持它们的深度在一个很小的有限的范围。
R O A M 分割成小方块的速度很快,而且可以动态更新高程图。
进行三维地形渲染所需要的地形数据存储在高程图里。
高程图使用一个r a w 的数据格式来保存,这个格式的每个像素点包含了8 位的高度信息。
通常高程图必须从头至尾保存在内存中,也就是说,高程图就是保存地形每点高度的二维数组。
利用R O A M 算法渲染地形的大致步骤如下:(1)读入原始r a w 地形数据,并将地形高程数据载入内存。
(2)初始化地形,先将地形分成许多小碎片,并创建二元三角树结构,设置左右孩子、邻居以及父亲节点之间的关系等。
(3)对于可见地形块,按照计算的分割值分割网格的左右两棵树,该过程需要递归地进行。
(4)渲染网格,对每颗二元三角树的叶子节点进行递归绘制。
2.3.4 摄像机漫游(人机交互的实现)O p e nGL 编程实现的三维场景漫游中,程序员常常在原点附近或者在其他方便的位置上构建场景,然后从合适的位置观察场景,以获得较好的观察效果[6]。
观察者可以通过鼠标或键盘来控制视点的位置、视向和参考方向。
当视点的位置、视向和参考方向发生改变时,场景中的物体相对于观察者的方位也发生了改变,从而产生了“动感”。
视线方向可由参考点位置确定(参考点位置减去视点位置即可得到视线方向的向量)。
漫游过程的实质就是通过不断移动视点或改变视线方向而产生三维动画的过程。
比如,通过键盘上的方向键实现前、后、左、右移动,通过鼠标的拖拽实现旋转视图以从多个角度观察地物。
实际上,在实现场景漫游时可以通过设置视点以及观察方向来实现,具体的函数为O p e n G L 中辅助函数库中的g lu L o ok at (),通过设置相应的参数实现场景的漫游效果。
v o i d g l u L o o k a t ( G L d o u b l ee y e x , G L d o u b l e e y e y, G L d o u b l ee y e z ,G L d o u b l e c e n t e r x,G L d o u b l ec e n t e r y,GL d o u b l e c e n t e r z,GL d o u b l eup x,GL double upy,GL double up z);该函数中的9 个参数定义了一个视图矩阵,并使用该矩阵与当前矩阵相乘。
前三个参数(e ye x,e ye y,e ye z)定义了视点的位置,即观察者的位置(相当于我们人的眼睛);中间三个参数(c e nt e r x,c e nt e r y,c e nt e r z)定义了摄像机瞄准的参考点,它决定了摄像机的朝向;最后三个参数(u p x,u p y,u p z)定义了摄像机的向上向量,一般定义为(0,1,0)。
通过鼠标和键盘,用户可以实现在三维场景中的任意漫游,并且可以实现行进加速、纹理模式和线框模式的转换及前、后、左、右的转向,进而可以灵活、准确地对场景进行全方位的观察。
系统可以根据用户的操作快速、有效地定位检索出用户所在的位置,并简洁明了的在界面上显示出来,供用户阅览。
摄像机虚拟漫游效果如下图3 所示。
3 结语虚拟校园漫游系统是计算机技术、虚拟现实技术等诸多高新技术的综合运用,在高校的虚拟校园建设中发挥着重要的作用。