基于opengl的三维场景漫游实现

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于opengl的三维场景漫游实现

摘要:本课题是关于opengl三维场景的实现,要求能够实现人机交互,具有缩放、旋转等基本的功能。

利用opengl创建三维模型的原理,本课题在理解opengl创建图形元的基础上,实现了简单三维场景模型的建立。通过建立全局Camera,实现了对场景全方位的观测,同时能够及时响应键盘和鼠标的操作。在此基础上,利用天空盒子和全局地形的方法,实现了三维场景的基本框架,能够在虚拟场景中任意角度的漫游。通过纹理贴图的方法,实现场景的创建,并对场景内部的事物进行碰撞检测,来实现简单的三维场景漫游。

关键词:三维建模; 全局Camera; 场景漫游; 纹理贴图; 碰撞检测

目录

1 课题论述 (1)

1.1选题背景简介 (1)

1.2系统开发平台及运行环境 (1)

1.2.1 开发环境的搭建 (1)

1.2.2 opengl绘图机制 (1)

2课题实现的关键技术 (2)

2.1 场景建模 (2)

2.2 场景渲染 (2)

2.3 纹理映射 (2)

2.4 碰撞检测 (3)

3漫游场景的实现 (4)

3.1 全局Camera的创建 (4)

3.2 地形和天空的绘制 (5)

3.3场景的绘制 (6)

3.4纹理和字体类的设计 (7)

4 总结 (8)

5 程序使用方法介绍 (8)

1 课题论述

1.1选题背景简介

随着科技的发展,人们对视觉的需求也越来越高,这正好也促发了计算机图形学的快速发展:从简单的平面图形到3D空间的立体图形空间的一个转变,为opengl提供了广阔的应用和开发前景。随着opengl的越来越成熟,在各个领域的应用也变得广泛起来。从计算机、多媒体、影视到医学、工业等领域。Opengl开发的重心也有所转变,从普通的三维场景的建立,到现在的大型复杂场景的三维信息生成、实时三维场景光影效果的模拟和实时三维场景的内存使用控制,opengl的发展越来越成熟。

正是基于opengl目前广泛的应用,本课题从opengl基本的图形元的创建、渲染、视角的转换等方面,选择一些opengl的基本操作,实现简单的三维场景空间的漫游,促进对opengl进一步的了解,也为以后进一步的开发做准备。

1.2系统开发平台及运行环境

本设计是基于Opengl 1.0在windows7操作系统下使用Visual C++6.0集成开发环境开发并调试,设计中使用了基于Win Application的架构。

1.2.1 开发环境的搭建

本设计是在Visual C++ 6.0下使用Opengl1.0库开发的,开发环境搭建步骤详细如下:(1)安装Visual C++ 6.0。

(2)配置Opengl1.0

由于Visual C++ 6.0本身带有安装好的opengl1.0版本,所以一些头文件和bin路径的设置就不必要做了。但自带的opengl1.0 没有包含glut函数库,所以需要下载glut函数库,并正确的设置include和bin的路径,并把dll文件放到system32下。

1.2.2 opengl绘图机制

在Windows环境的绘图机制下使用图形设备接口GDI作图要通过设备上下文调用相应的函数,用opengl作图也是这样。Opengl通过“渲染上下文”即RC完成对三维图形的绘制。Windows下的设备上下文和窗口都支持“文图格式”属性,和RC在位图结构方面是一致的。因此只要在创建RC的同时与一个DC建立联系,opengl函数就可以通过对应的DC 绘制到相应的显示设备上面。

2课题实现的关键技术

2.1 场景建模

场景的建模能够直接的展示出场景的三维特性,也是影响三维可视化功能的关键。在本课题中,我主要完成了一下几个场景的建模。

首先是地形的建模,在地形的建模中,采用了四边形近视模型和纹理贴图的方式来完成。在xoz平面,建立的是一个46*46的网格模型,其中每个方格的大小大约为7个坐标。在y方向,通过读取位图信息的方式,建立的随机高度的模型。其中,地形中心部分为平面,用于建立一些基本的场景,而地形的边界部分,用位图数据随机读取,生成一圈环绕的小山,把整个场景环绕在山围之中。

房子模型的建立是通过opengl简单的图形元建立,首先建立房子的四周,即四个围墙,用四个平面图形建立,然后屋顶通过两个四边形和两个三角形进行建模,实现三维房屋的构建。

天空的建立有很多方法,基本的有两种:一种是天空盒法,另一种是天空球法。天空盒是有一个长方体,在它的各个面上贴有天空的图片组成。天空球是有一个球体,在它的表面贴上天空的纹理组成。天空球相对于天空盒子较简单,因为它只需要一张纹理,但为了显示效果的真实性,本课题采用的是天空盒子的方法,建立六个天空的面,然后选取合适的天空图片进行贴图。由于六个面的链接处会出现一条线,为了实现天空的无缝连接,需要设置纹理的一些属性,来达到天空的无缝连接。

2.2 场景渲染

场景的渲染对于三维空间来说也是十分最要的,因为这直接决定着场景的真实性。本课题主要利用了纹理映射场景进行渲染。

纹理映射是把纹理空间中的纹理像素映射到屏幕空间中的像素的过程,利用纹理映射,可以使三维的世界显得更加的逼真。本课题中主要对地形、天空、房子等进行了纹理的渲染,同时利用鼠标来旋转摄像机,相当于对物体进行了三维空间的旋转,来更好的观测场景的效果。

2.3 纹理映射

纹理映射技术的原理是通过把纹理空间坐标与物体空间坐标的每一点建立关联,实现把二维的纹理图像映射到三维的物体表面,从而呈现出真实的视觉效果。

纹理映射操作包括启用及载入纹理,指定纹理坐标,设置纹理的参数,使用纹理对象等方面。Opengl中规定纹理贴图在RGBA模式下。本文启用了opengl中的纹理映射技术来对三维场景中的地形、天空和房子进行纹理的渲染,实现的大体过程如下:

(1)首先要创建纹理对象并且为此对像指定纹理。

调用glGenTexture()函数创建纹理对象,使用一个正整数对纹理对象进行编号,并

把相应的对象存储到指定的数组中。最后调用glBindTexture()函数实现把生成的

纹理名字绑定到对应的目标纹理上。

(2)控制滤波的方式

Opengl在图像的时候,有可能显示的图像比原始的要大,也有可能比原始的图像

要小,所以要采用控制滤波的方式,对其进行适当的放大和缩小。本课题采用的

是GL_LINEAR方式,这样纹理总是以平滑的方式来显示。

(3)启用纹理并载入纹理的数据

首先要启用纹理,通过glEnable(GL_TEXTURE_2D)来启用二维的纹理,并通过

glBindTexture()和glTexImage2D()来绑定纹理数据。由于贴纹理的时候要明确纹理

与映射物体的映射关系,所以通过函数glTexCoord2f()来进行绑定。

2.4 碰撞检测

碰撞检测技术主要是对场景内部的物体进行的,由于场景都是自己通过三维图形建立的,而随着在场景内部全局Camera的移动,相当于观察者在场景中进行漫游。当观察者移动到一些场景内部时,如果没有碰撞检测,就会直接穿过物体,不符合实际的情况,所以需要引入碰撞检测技术。

碰撞检测技术有很多中,本课题采用的是基于盒子的碰撞检测原理,即在被检测物体的一定范围之内,假设存在一个盒子把物体包围住,当观察者移动到盒子的范围边界时,就停止一定,然后根据Camera的角度,进行偏移。本课题场景比较简单,主要是有山和房子组成,所以碰撞检测只做了山和房子的检测。

对于山的检测比较简单,利用盒子原理,在山的内部边界部分,设置一个四方体边界,当相机移动到边界的时候,就停止移动,然后根据角度左右或则前后移动,防止穿过环绕山。而对于房子的检测,就要分为好几部分,墙面的检测,门的检测。其中在房子内部和外部的边界部分都要做边缘的检测,使从外部进入和里面出来都不能穿过墙面和门。其实现方法也是在墙面和门的附近很小的距离设置检测边界,当到达边界时,即碰撞到了物体,不能越过边界,从而达到碰撞检测并不穿过物体的目的。

相关文档
最新文档