基于OpenGL校园漫游系统的设计与开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于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)都是一个单独的等腰三角形,从它的顶点到对面斜边的中点分割三角形为两