论文部分内容阅读
摘要:介绍了虚拟校园漫游系统的设计与开发技术,包括:OpenGL绘图窗口的创建;实体建模;纹理设置和贴图;界面和树的实现;虚拟仿真——利用VC++6.0开发平台,编制程序实现虚拟校园的漫游。该系统可以用于校园三维漫游、校园管理、校园规划等领域。
关键词:虚拟现实;OpenGL;实体建模;虚拟校园
0 引言
虚拟校园作为虚拟技术的一个应用,需运用计算机图形学以及图像处理技术结合三维可视化语言在屏幕上显示校园环境,并实现漫游、人机交互等功能。本文以太原理工大学阳泉学院校区为虚拟空间,主要实现对地形和建筑的建模,以及全方位的观测,并实现在虚拟空间中的漫游功能,使观察者无需到达实地就有身临其境的感觉。
1 虚拟校园漫游系统的设计
虚拟校园漫游系统功能实用,主要包括:图形操作基本功能和手动漫游功能。
(1)图形操作基本功能
主要实现地图和景点图片的浏览功能,提供全景、放大、缩小等基本的地图操作功能。
(2)手动漫游功能
该系统是为方便学校管理规划而设计开发的,它提供了多种交互手段,用户和系统的交互主要通过鼠标和键盘进行。通过w、a、s、d键上下左右移动,利用鼠标控制前进的方向,用户可以有效地定位检索出校园最新信息。
2 虚拟校园实体建模实现
虚拟校园实体建模是系统最主要的部分,内容包括:资料的收集、底图的生成、立体模型的制作、三维贴图到校园立体图的绘制等。我们通过数码相机采集贴图,在photoshop cs2中对贴图进行处理,得到素材,在VC中建立函数,套用OpenGL函数库构建模型。
2.1虚拟校园实体模型的构成
本文对学校做了建模,主要分为四个层次:第一层(y=0.0;y为地形的高度),包括二食堂、一号教学楼、实验楼、二号教学楼;第二层(y=0.6),在这一层中只有一号宿舍楼;第三层(y=1.2),二号宿舍楼和大食堂;第四层(y=1.8),在这一层中包括三号宿舍楼、四号宿舍楼和操场。
2.2建模方法
利用OpenGL能够绘制点、线和多边形,应用这些基本的形体,可以构造出几乎所有的三维模型。考虑到渲染速度,本文主要采用了三角形进行建模。在OpenGL中,可以编写代码创建三角形,但是创建时要指定三角形的三个顶点,这样的话要写很多代码且使整个建模过程产生大量的冗余代码。为了解决这一问题,本文采用了读取文本文档的方法来减少代码的冗余。在建模过程中又定义了绘制台阶函数DrawStair()、侧面体函数DrawWall()、横面体函数DrawFloor()来完成各种模型的建立。
2.3虚拟校园最终模型构建
虚拟校园最终模型的构建都是利用函数DrawGLScene()完成的。该函数在主函数WinMain()中被循环调用,直到程序退出为止。绘制效果如图1所示。
3 虚拟校园漫游系统的开发过程
3.1设置像素格式
OpenGL的像素格式告诉系统在利用OpenGL绘制图形时所采用的颜色模式、颜色的位数。
3.2创建图形操作描述表
创建图形操作描述表并启用它后,才能调用OpenGL函数在窗口内进行各种图形操作。创建图形操作描述表利用MFC中视类(CView)的消息OnCreat()实现。
3.3 OpenGL窗口创建
首先是打开VC++6.0,然后创建一个新工程。创建一个新的Win32程序后,链接OpenGL库文件即可。
3.4纹理与贴图
纹理贴图就是利用数码相机将拍摄的实物照片作为所建立三维模型的纹理“贴”至相应的二维物体模型,使模拟的地物更具有真实感。
3.4.1纹理设置
比如绘制一面砖墙,就可以用一幅真实的砖墙图像或照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。下面介绍纹理创建的方法。
首先,创建一个文件句柄。句柄用来鉴别资源,它使程序能够访问此资源。开始先将句柄设为NULL,然后通过以下三个函数实现纹理设置。
AUX_RGBImageRec*LoadBMP(char *Filename)//载入位图图像 auxDIBImageLoad(Filename)//读取图像数据并将其返回 int LoadGLTextures()//栽入位图(调用上面的代码)并转换成纹理
3.4.2贴图制作
在创建虚拟校园的过程中,对建筑物的数据采集非常关键。由于在虚拟校园系统中各个建筑物的外观不一样,贴图也不—样,这对设计是—个难点。用数码相机取图片时,因为采集的是正面图,所以要保持和图在一个水平线上。
对采集来的数码相片我们用photoshop加以处理,比如对台阶贴图进行处理后,台阶的颜色下浅上深,产生了层次感,如图2所示。对各个楼的柱子贴图都要进行处理,使之看起来有立体感,如图3所示。另外本文采用的贴图都是正方形的,有的贴图还需要重复粘贴。比如学院的草地边的条砖路,它的贴图做到了左右上下都对称,重合在一起显得比较协调。贴图处理后效果如图4所示。
3.5树的实现
树是通过定义一个类Tree来实现的。由于树的形状不像建筑那样规则,因此它的构造也是相当复杂的。本文中树的建模过程如下。
3.5.1树叶纹理的制作
树叶纹理的制作是实现树的难点。树叶的纹理是由两张贴图生成的,一张是纹理的透明贴图branchAlphal.bmp,另一张是纹理的背景贴图branchl.bmp。通过两张贴图的合成生成树叶的纹理,可用bool Tree::MakeAlphaTextureBind(char*TextureFileName,char*AlphaFileName,unsigned int*TexturelD)函数实现。
3.5.2树的模型构建
树的模型构建分两个部分,树杆的构建和树枝的构建。可用以下函数实现。
void Tree::Draw3DTree(float SzTree)//绘制树杆
void Tree::DrawGreenTree()//绘制树枝
void Tree::DrawTop(float width,float height)//绘制树顶
3.6虚拟校园漫游系统界面的实现
本系统界面是作为一个类来实现的,主要是通过使用OpenGL绘图函数来构建。界面的搭建可分为三层。第一层:界面主背景,主要由一个四边形加上背景纹理贴图构成。第二层:选项菜单和说明层,在本层中主要是根据鼠标的位置和单击事件来选择不同的纹理贴图给人以变换的感觉,该层也是界面中最主要的一层。第三层:鼠标层,鼠标同样是由四边形加上背景纹理贴图构成,但纹理贴图方式是由透明加背景色实现。界面绘制效果如图5所示。
4 虚拟仿真
4.1虚拟校园漫游系统的实现
虚拟校园漫游是交互性技术的重要体现。解决方法如下:①根据用户的指令旋转并变换镜头位置。②围绕原点,以与镜头相反的旋转方向来旋转世界(让人产生镜头旋转的错觉)。③以与镜头平移方式相反的方式来平移世界(让人产生镜头移动的错觉)。
4.1.1镜头的旋转
镜头的旋转是靠获取鼠标事件事实现的。在这里用到了三个全局变量和一个常量,heading是用来记录左右旋转的角度,yrot用来传递给渲染函数这个值。lookupdown用来记录上下旋转的角度。
4.1.2镜头的平移
镜头的平移是靠获取键盘事件来实现的。镜头的平移分为左移、右移、前进、后退,分别对应键盘的A、D、W、S键。
4.2碰撞检测
碰撞检测就检测观察者在行进中是否遇到了阻碍。主要实现办法是根据不同的地形或建筑设定不同的高度值(也就是Y值),然后在行进中检测Y值的变化,如果在行进的某一瞬间Y值的变化超过某一范围则限制x或z值的变化。
5 结束语
本文以虚拟校园的实现为研究对象,利用虚拟现实技术绘制了虚拟校园的三维模型,编程实现了虚拟校园的漫游。但有些方面还存在不足,譬如只完成了室外建模,并没有对室内进行建模;碰撞检测算法不太精确造成了资源的浪费等。
关键词:虚拟现实;OpenGL;实体建模;虚拟校园
0 引言
虚拟校园作为虚拟技术的一个应用,需运用计算机图形学以及图像处理技术结合三维可视化语言在屏幕上显示校园环境,并实现漫游、人机交互等功能。本文以太原理工大学阳泉学院校区为虚拟空间,主要实现对地形和建筑的建模,以及全方位的观测,并实现在虚拟空间中的漫游功能,使观察者无需到达实地就有身临其境的感觉。
1 虚拟校园漫游系统的设计
虚拟校园漫游系统功能实用,主要包括:图形操作基本功能和手动漫游功能。
(1)图形操作基本功能
主要实现地图和景点图片的浏览功能,提供全景、放大、缩小等基本的地图操作功能。
(2)手动漫游功能
该系统是为方便学校管理规划而设计开发的,它提供了多种交互手段,用户和系统的交互主要通过鼠标和键盘进行。通过w、a、s、d键上下左右移动,利用鼠标控制前进的方向,用户可以有效地定位检索出校园最新信息。
2 虚拟校园实体建模实现
虚拟校园实体建模是系统最主要的部分,内容包括:资料的收集、底图的生成、立体模型的制作、三维贴图到校园立体图的绘制等。我们通过数码相机采集贴图,在photoshop cs2中对贴图进行处理,得到素材,在VC中建立函数,套用OpenGL函数库构建模型。
2.1虚拟校园实体模型的构成
本文对学校做了建模,主要分为四个层次:第一层(y=0.0;y为地形的高度),包括二食堂、一号教学楼、实验楼、二号教学楼;第二层(y=0.6),在这一层中只有一号宿舍楼;第三层(y=1.2),二号宿舍楼和大食堂;第四层(y=1.8),在这一层中包括三号宿舍楼、四号宿舍楼和操场。
2.2建模方法
利用OpenGL能够绘制点、线和多边形,应用这些基本的形体,可以构造出几乎所有的三维模型。考虑到渲染速度,本文主要采用了三角形进行建模。在OpenGL中,可以编写代码创建三角形,但是创建时要指定三角形的三个顶点,这样的话要写很多代码且使整个建模过程产生大量的冗余代码。为了解决这一问题,本文采用了读取文本文档的方法来减少代码的冗余。在建模过程中又定义了绘制台阶函数DrawStair()、侧面体函数DrawWall()、横面体函数DrawFloor()来完成各种模型的建立。
2.3虚拟校园最终模型构建
虚拟校园最终模型的构建都是利用函数DrawGLScene()完成的。该函数在主函数WinMain()中被循环调用,直到程序退出为止。绘制效果如图1所示。
3 虚拟校园漫游系统的开发过程
3.1设置像素格式
OpenGL的像素格式告诉系统在利用OpenGL绘制图形时所采用的颜色模式、颜色的位数。
3.2创建图形操作描述表
创建图形操作描述表并启用它后,才能调用OpenGL函数在窗口内进行各种图形操作。创建图形操作描述表利用MFC中视类(CView)的消息OnCreat()实现。
3.3 OpenGL窗口创建
首先是打开VC++6.0,然后创建一个新工程。创建一个新的Win32程序后,链接OpenGL库文件即可。
3.4纹理与贴图
纹理贴图就是利用数码相机将拍摄的实物照片作为所建立三维模型的纹理“贴”至相应的二维物体模型,使模拟的地物更具有真实感。
3.4.1纹理设置
比如绘制一面砖墙,就可以用一幅真实的砖墙图像或照片作为纹理贴到一个矩形上,这样,一面逼真的砖墙就画好了。下面介绍纹理创建的方法。
首先,创建一个文件句柄。句柄用来鉴别资源,它使程序能够访问此资源。开始先将句柄设为NULL,然后通过以下三个函数实现纹理设置。
AUX_RGBImageRec*LoadBMP(char *Filename)//载入位图图像 auxDIBImageLoad(Filename)//读取图像数据并将其返回 int LoadGLTextures()//栽入位图(调用上面的代码)并转换成纹理
3.4.2贴图制作
在创建虚拟校园的过程中,对建筑物的数据采集非常关键。由于在虚拟校园系统中各个建筑物的外观不一样,贴图也不—样,这对设计是—个难点。用数码相机取图片时,因为采集的是正面图,所以要保持和图在一个水平线上。
对采集来的数码相片我们用photoshop加以处理,比如对台阶贴图进行处理后,台阶的颜色下浅上深,产生了层次感,如图2所示。对各个楼的柱子贴图都要进行处理,使之看起来有立体感,如图3所示。另外本文采用的贴图都是正方形的,有的贴图还需要重复粘贴。比如学院的草地边的条砖路,它的贴图做到了左右上下都对称,重合在一起显得比较协调。贴图处理后效果如图4所示。
3.5树的实现
树是通过定义一个类Tree来实现的。由于树的形状不像建筑那样规则,因此它的构造也是相当复杂的。本文中树的建模过程如下。
3.5.1树叶纹理的制作
树叶纹理的制作是实现树的难点。树叶的纹理是由两张贴图生成的,一张是纹理的透明贴图branchAlphal.bmp,另一张是纹理的背景贴图branchl.bmp。通过两张贴图的合成生成树叶的纹理,可用bool Tree::MakeAlphaTextureBind(char*TextureFileName,char*AlphaFileName,unsigned int*TexturelD)函数实现。
3.5.2树的模型构建
树的模型构建分两个部分,树杆的构建和树枝的构建。可用以下函数实现。
void Tree::Draw3DTree(float SzTree)//绘制树杆
void Tree::DrawGreenTree()//绘制树枝
void Tree::DrawTop(float width,float height)//绘制树顶
3.6虚拟校园漫游系统界面的实现
本系统界面是作为一个类来实现的,主要是通过使用OpenGL绘图函数来构建。界面的搭建可分为三层。第一层:界面主背景,主要由一个四边形加上背景纹理贴图构成。第二层:选项菜单和说明层,在本层中主要是根据鼠标的位置和单击事件来选择不同的纹理贴图给人以变换的感觉,该层也是界面中最主要的一层。第三层:鼠标层,鼠标同样是由四边形加上背景纹理贴图构成,但纹理贴图方式是由透明加背景色实现。界面绘制效果如图5所示。
4 虚拟仿真
4.1虚拟校园漫游系统的实现
虚拟校园漫游是交互性技术的重要体现。解决方法如下:①根据用户的指令旋转并变换镜头位置。②围绕原点,以与镜头相反的旋转方向来旋转世界(让人产生镜头旋转的错觉)。③以与镜头平移方式相反的方式来平移世界(让人产生镜头移动的错觉)。
4.1.1镜头的旋转
镜头的旋转是靠获取鼠标事件事实现的。在这里用到了三个全局变量和一个常量,heading是用来记录左右旋转的角度,yrot用来传递给渲染函数这个值。lookupdown用来记录上下旋转的角度。
4.1.2镜头的平移
镜头的平移是靠获取键盘事件来实现的。镜头的平移分为左移、右移、前进、后退,分别对应键盘的A、D、W、S键。
4.2碰撞检测
碰撞检测就检测观察者在行进中是否遇到了阻碍。主要实现办法是根据不同的地形或建筑设定不同的高度值(也就是Y值),然后在行进中检测Y值的变化,如果在行进的某一瞬间Y值的变化超过某一范围则限制x或z值的变化。
5 结束语
本文以虚拟校园的实现为研究对象,利用虚拟现实技术绘制了虚拟校园的三维模型,编程实现了虚拟校园的漫游。但有些方面还存在不足,譬如只完成了室外建模,并没有对室内进行建模;碰撞检测算法不太精确造成了资源的浪费等。