基于OpenGL的3D虚拟场景设计与实现(共36页)

上传人:58****5 文档编号:47345207 上传时间:2021-12-20 格式:DOC 页数:36 大小:1.11MB
收藏 版权申诉 举报 下载
基于OpenGL的3D虚拟场景设计与实现(共36页)_第1页
第1页 / 共36页
基于OpenGL的3D虚拟场景设计与实现(共36页)_第2页
第2页 / 共36页
基于OpenGL的3D虚拟场景设计与实现(共36页)_第3页
第3页 / 共36页
资源描述:

《基于OpenGL的3D虚拟场景设计与实现(共36页)》由会员分享,可在线阅读,更多相关《基于OpenGL的3D虚拟场景设计与实现(共36页)(36页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上 基于OpenGL的3D虚拟场景设计与实现院 系专 业班 级学 号姓 名指导教师负责教师沈阳航空航天大学2010年6月专心-专注-专业摘 要虚拟现实技术是一门新兴的学科,是迄今为止最强的人机接口技术,也是一项最基本最重要的研究内容。目前,虚拟现实技术已广泛应用到许多领域。虚拟现实技术是利用计算机中高逼真的虚拟环境,并通过多种传感器接口,使用户“沉浸”到该虚拟环境中,从而实现用户与虚拟环境之间的交互。建立虚拟系统的首要问题便是虚拟环境的构建。本文主要论述了如何构建一幅“天涯共此时”的虚拟场景。该场景的实现基于OpenGL绘图知识和MFC编程原理及应用程序的整体框架。在此

2、基础上,本文主要开展了以下几个方面的研究工作:一、对OpenGL的编程功能和工作原理进行了分析,包括绘图流程以及OpenGL的主要功能。对编程开发工具VC+进行了简单介绍,并概括出MFC的编程原理及应用程序的整体框架。此外,还分析了OpenGL绘制图形的优化工具显示列表的使用与管理以及OpenGL绘制复杂图形的方法图形变换。二、利用MFC框架和OpenGL的显示列表知识以及有关绘图函数,完成了复杂的雪花、花瓣、弯月、灯笼的绘制,实现了一幅“天涯共此时”场景的天空场景,同时,还实现了花瓣飞舞、雪花飞舞、灯笼随风飘动、花瓣飞舞场景与雪花飞舞场景的相互转化等功能。三、基于图形方法,利用OpenGL绘

3、图函数,实现了由小树、小人、小房子组成的地面场景的绘制,使整个虚拟场景看起来更加和谐、唯美。关键词:虚拟场景;OpenGL;显示列表;图形变换Design and Implementation of 3D virtual Scene Using OpenGLAbstractAs a rising subject, virtual reality is the best human-machine interface technology, and it is also the fundamental and important study content. At present, the vi

4、rtual reality technology has broad applications to many areas. Virtual reality technology is the use of sensor interface, users can immerse to the virtual environment. And through a variety of senor interface, users can immerse to the virtual environment, achieving interaction between user and the v

5、irtual environment. This paper elaborates how to establish a scene of “Time Together Across the Strait”. On this base, this paper carried out research in these aspects as follows:Firstly, make some analysis about OpenGL programming and working theory, including the drawing process and the main funct

6、ions of OpenGL and so on. Make an introduction about VC+, at the same time summarize programming principles of MFC and application frame work. Besides, analyze rendering graphics optimization tools of OpenGLthe use and management of display list, and the method of drawing complex graphicsgraphics tr

7、ansformation.Second, using MFC framework and OpenGL display list and relevant drawing function knowledge, finished drawing complex snowflakes, petals, moon, lantern. Realize the scene of “Time Together Across the Strait”, but also achieve the scene of petals flying, snowflakes dancing, waving lanter

8、n dancing with the wind and the mutual transformation function of petal flying and snowflakes dancing.In the end, basing on the method of graphics, realize the construction of ground system consisting of tree, little people and small house, make whole virtual scene look more harmonious and beautiful

9、. Keywords: virtual environment; OpenGL; display list; graphics transformation目 录1 绪论虚拟现实技术是近年来十分活跃的技术研究领域,是一系列高新技术的汇集,这些技术包括计算机图形学、多媒体技术、人工智能、人机接口技术、传感技术以及高度并行的实时计算技术,还包括人的行为学研究等多项关键技术。虚拟现实是多媒体技术发展的更高境界,是这些技术的更高层次的集成和深透。1.1 虚拟现实的发展及研究现状1.1.1 虚拟现实的起源和发展随着计算机软硬件水平的迅猛发展,虚拟现实技术在经历了最初的高潮和随之而来的低谷后,再一次迎来了

10、新的春天。新兴交互设备的不断涌现和完善,PC图形加速卡性能的大幅度提高,使得虚拟现实的应用领域不断扩展。一般认为,研究目标明确的VR技术是从60年代开始形成的。但由于技术复杂、投资太大,除了少数军工方面的研究之外,几乎很少被大家注意。60年代初,电影摄影师Morton Heiling构造了第一个多感知仿真环境的原型Sensorama Simulator,这是第一个VR视频系统。1965年,在IPIF会议上,有VR“先锋”之称的计算机图形学的创始人IvanSutherland作了题为“The Ultimate Display”的报告,提出了一项富有挑战性的计算机图形学研究课题。他指出,人们可以把

11、显示屏当作一个窗口观察一个虚拟世界,使观察者有身临其境的感觉。这一思想提出了虚拟现实概念的雏形。1968年,他使用两个戴在眼睛上的阴极射线管(CRT),研制了第一台头盔式显示器HMD。并发表了题为“AHead-Mounted 3D Display”的论文,对头盔式三维显示装置的设计要求、构造原理进行了深入的讨论,并绘出了这种装置的设计原型,成为三维立体显示技术的奠基性成果。1971年,Frederick Brooks研制了具有力反馈的原型系统Grope-用户通过操纵一个实际的机械手,来控制屏幕中的图形机械手去“抓取”一个立体图像表示的物体,而且人手能够感觉到它的重量。1975年,Myron K

12、rueger 提出“人工现实”(Artificial Reality)的思想,展示了称之为Video place的“并非存在的一种概念化环境”。VR研究的进展从60年代到80年代中期是十分缓慢的。直到80年代后期,VR技术才得以加速发展。1985年,美国航空航天管理局NASA的Scott Fisher 等研制了著名的VIEW一种“数据手套”(Data Glove)。NASA科学家又继续制成第一套VR系统,由一台DEC PDP11-40主机、一个图形系统及图形计算机和一个Polhmus非接触式跟踪仪组成。在1985年,Scott Fisher加入了此项研究工作,他在模拟中又增加了一种新的传感手套

13、。Fisher用VIVED系统作实验。1986年终研制成功了第一套基于HMD及数据手套VR系统VIEW(Virtual Interactive Environment Workstation)。这是世界上第一个较为完整的多用途、多感知的VR系统,使用了头盔显示器、数据手套、语言识别与跟踪技术等,并应用于空间技术、科学数据可视化、远程操作等领域,被公认为当前VR技术的发源地。1987年,美国 Scientific American 发表论文,报道了一种称为 Data Glove 的虚拟手控器。该论文引起了公众的极大兴趣。1989年,VPL公司的创始人之一 Jaron Lanier,创造了 “Vi

14、rtual Reality”(虚拟现实)这一名词。从此,Data Glove 和“Virtual Reality”便引起新闻界极大的关注和丰富的想象。VR第一次展出是在1990年第17届国际图形学会议上,图形学专家们报道了近年来输入输出设备技术以及声、像等多媒体技术的进展,使得交互技术从二维输入向三维甚至多维的方向过渡,使三维交互取得了突破性进展。随着新的输入设备研制成功和微型视频设备投入使用,再加上工作站提供了更加强有力的图形处理能力,从而为构成“虚拟现实”的交互环境提供了可能。由于学术界、工业界以及新闻界对VR技术的巨大兴趣,美国NSF(自然科学基金会)于1992年3月23至24日在北卡罗

15、莱纳大学主持召开了一次国际研讨会,与会代表有来自美国和加拿大的18位专家学者,计算机图形学之父、VR技术的创始人之一 Ivan Sutherland 也出席了会议。会议对VR的定义及研究方向提出了详细建议,奠定了VR作为独立研究方向的地位,讨论并提出了VR 研究的主要研究方向。20世纪90年代中期以后迅速发展的计算机软、硬件系统使得基于大型数据集合的声音和图像的实时动画制作成为可能,越来越多新颖、实用的输入输出设备相继进入市场,美国波音公司利用虚拟现实技术设计波音777的成功使得全世界对虚拟现实的广阔发展前景充满了憧憬和兴趣。1.1.2 国内外研究现状在当前实用虚拟现实技术的研究与开发中,日本

16、是居于领先位置的国家之一,主要致力于建立大规模VR知识库的研究。另外在虚拟现实的游戏方面的研究也做了很多工作。但日本大部分虚拟现实硬件是从美国进口的。美国是VR技术的发源地。美国VR研究技术的水平基本上就代表国际VR技术发展的水平。目前美国在该领域的基础研究主要集中在感知、用户界面、后台软件和硬件四个方面。美国宇航局(NASA)的 Ames 实验室完善了HMD,并将VPL的数据手套工程化,使其成为可用性较高的产品。NASA研究的重点放在对空间站操纵的实时仿真上,大多数研究是在NASA的约翰逊空间中心完成的。他们大量运用了面向座舱的飞行模拟技术。NASA完成的一项著名的工作时对哈勃太空望远镜的仿

17、真。NASA的Ames现在正致力于一个叫“虚拟行星探索(VPE)”的试验计划。现在NASA已经建立了航空、卫星维护VR训练系统,空间站VR训练系统,并且已经建立了可提供全国使用的VR教育系统。在紧跟国际新技术的同时,我国国内一些重点院校,已积极投入到了这一领域的研究工作。北京航空航天大学虚拟现实与多媒体研究室已经在DVENET上开发了直升机虚拟仿真器、坦克虚拟仿真器、虚拟战场环境观察器、计算机兵力生成器等,他们的总设计目标是为我国军事模拟训练与演习提供一个多武器协同作战或对抗的战术演练系统。清华大学对虚拟现实及其临场感、力反馈系统等方面进行了大量的研究,其中有不少方案和方法都独具特色,比如球面

18、屏幕显示和图像随动、克服立体图闪烁的措施和深度感实验测试等。浙江大学的CAD&CG国家重点实验室是国内最早研究和开发虚拟现实技术的中心之一,他们开发的CAVE也是目前国内最完备的洞穴式虚拟现实系统,不仅在虚拟现实基础理论研究方面做出了杰出贡献,而且开发的一些虚拟现实系统已经实用化。北京科技大学的虚拟显示实验室最近20年来一直从事虚拟现实研究,成功地开发出了纯交互式汽车模拟驾驶训练系统,该系统的虚拟环境与真实的驾驶环境几乎没有什么差别,实用效果良好,他们下一步要开发基于Internet的虚拟驾驶训练系统。和一些发达国家相比,我国VR技术还有一定的差距,但已引起政府有关部门和科学家们的高度重视。根

19、据我国的国情,制定了开展VR技术的研究,例如,九五规划、国家自然科学基金会、国家高技术研究发展计划等都把VR列入了研究项目,我国的VR技术也在不断的发展着。1.2 基于OpenGL的系统实现方法1.2.1 OpenGL图形库技术(1) OpenGL函数构成OpenGL图形库实际上是一种图形与硬件的接口,它包括了100多种图形处理函数,提供给用户一种直观的编程环境,可以大大简化三维图形程序的编制。它不仅要求开发者将三维物体模型的数据写成固定的数据格式,允许你直接使用自己才记得数据,还可以利用其他不同格式的数据源。不仅极大节省了开发者的时间,也提高了软件开发的效益。OpenGL的库函数大致可以分为

20、六类:OpenGL核心库,包含115个函数,前缀为“gl”,提供了最基本的绘图命令函数,用于常规的、核心的图形处理;OpenGL实用库,包含43个函数,前缀为“glu”,这部分函数通过调用核心库的函数,为开发者提供相对简单的用法,实现一些较为复杂的操作,如:坐标变换、纹理映射、绘制椭圆、茶壶等简单多边形,OpenGL核心库和实用库可以在所有的OpenGL平台上运行;OpenGL辅助库,包括31个函数,前缀为“aux”,这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体,OpenGL辅助库不能在所有的OpenGL平台上运行;OpenGL工具库,包含大约30多个函数,前缀为“glut”,

21、这部分函数主要提供基于窗口的工具,如:多窗口绘制、空消息和定时器,以及绘制一些较为复杂的物体,OpenGL工具库可以在所有的OpenGL平台上运行;Windows专用库,包含16多个函数,前缀为“wgl”,这部分函数主要用于连接OpenGL和Windows95/NT,以弥补OpenGL在文本方面的不足;Win32API函数库,包含6个函数,无专用前缀,这部分函数主要用于处理像素存储格式和双帧缓存,这6个函数将替换WindowsGDI中原有的同样的函数。Windows专用库和Win32API函数库只能用于Windows95/98/NT环境中。(2) OpenGL渲染管线管线这个术语用于描述一种过

22、程它可能涉及到两个或更多独特的阶段或步骤。图1.1给出了OpenGL渲染管线流程。图1.1 OpenGL渲染管线如图1.1所示,大多数OpenGL应用都采用这样一种操作顺序。其中:集合顶点数据包括模型的顶点集、线集、多边形集等。像素数据包括像素集、影像集、位图集等。显示列表技术是OpenGL的重要技术之一,它是由一组预先存储起来的、留待以后调用的OpenGL函数语句组成。当调用这张显示列表时,就依此执行表中所列出的函数语句。顶点操作就是对图形的每一个顶点的空间坐标经模型取景矩阵变换、纹理矩阵变换等处理。图元组装就是根据定点要素类型的不同,进行不同的装配,然后根据点图案、线宽、调整等生成像素段,

23、并赋上颜色、深度值等。像素操作是对读入的像素数据,执行一定的操作如放大、偏置、映射、调整等处理,然后以适当的格式压缩并返回处理器内存。对像素段的操作是根据OpenGL所处的模式不同,由颜色屏蔽等处理这个像素段,写入适当的帧缓冲区,等待实现图形显示。整个流程操作过程实际上分为两条:第一是对几何图形的处理都用顶点来描述,经过运算器和顶点操作,然后进行光栅处理形成图元,放入帧缓冲区。第二是对像素数据的处理,是经过像素操作后结果被存储在内存中,再像几何顶点一样进行光栅化处理形成图元,等待实现图形显示。 (3)OpenGL图形库主要功能 绘制物体 真实世界里的任何物体都可以在计算机中用简单的点、线、多边

24、形来描述。OpenGL提供了丰富的基本图元绘制命令,从而可以方便地绘制物体。 变换 可以说,无论多复杂的图形都是由基本图元组成并经过一系列变换来实现的。OpenGL提供了一系列基本的变换,如取景变换、模型变换、投影变换及视口变换。 光照处理 正如自然界不可缺少光一样,绘制有真实感的三维物体必须做光照处理。 着色 OpenGL提供了两种物体着色模式,一种是RGBA颜色模式,另一种是颜色索引模式。 反走样 在OpenGL绘制图形过程中,由于使用的是位图,所以绘制出的图像的边缘会出现锯齿形状,称为走样。为了消除这种缺陷,OpenGL提供了点、线、多边形的反走样技术。 融合 为了使三维图形更加具有真实

25、感,经常需要处理半透明或透明的物体图像,这就需要用到融合技术。 雾化 正如自然界中存在烟雾一样,OpenGL提供了fog的基本操作来达到对场景进行雾化的效果。 位图和图像 在图形绘制过程中,位图和图像是非常重要的一个方面。OpenGL提供了一系列函数来实现位图和图像的操作。 纹理映射 在计算机图形学中,把包含颜色、alpha值、亮度等数据的矩形数组称为纹理。而纹理映射可以理解为将纹理粘贴在所绘制的三维模型表面,以使三维图形显得更生动。在此次设计中,所采用的开发工具是C+程序设计语言,并且大量的涉及到了C+语言中的OpenGL函数库。1.2.2 VC+编程平台及MFC库VC+以及MFC库都是由美

26、国Microsoft公司出品,它是针对软件程序员程序开发设计的一套编程工具。从产品上市至今已更新发展了若干版本,现在比较流行的版本主要是VC+6.0以及和其配套的MFC库。(1) VC+编程平台VC+作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。在使用VC+开发应用程序的过程中,系统为我们生成了大量的各种类型的文件。下面介绍一些VC+中这些不同类型的文件分别起到什么样的作用,在此基础上了解VC+如何管理应用程序所用到的各种文件。扩展名为dsw的文件类型的文件在VC+中是级别最高的,称为Workspace文件。在VC+中,应用程序是以Projec

27、t的形式存在的,Project文件以dsp为扩展名,在Workspace文件中可以包含多个Project,由Workspace文件对它们进行统一的协调和管理。与dsw类型的Workspace文件相配合的一个重要的文件类型是以opt为扩展名的文件,这个文件中包含的是在Workspace文件中要用到的本地计算机的有关配置信息,所以这个文件不能在不同的计算机上共享,当我们打开一个Workspace文件时,如果系统找不到需要的opt类型文件,就会自动地创建一个与之配合的包含本地计算机信息的opt文件。Project文件的扩展名是dsp,这个文件中存放的是一个特定的工程,也就是特定的应用程序的有关信息,

28、每个工程都对应有一个dsp类型的文件。以clw为扩展名的文件是用来存放应用程序中用到的类和资源的信息的,这些信息是VC+中的ClassWizard工具管理和使用类的信息来源。对应每个应用程序有一个readme.txt 文件,这个文件列出了应用程序中用到的所有的文件的信息,打开并查看其中的内容就可以对应用程序的文件结构有一个基本的认识。在应用程序中大量应用的是以h和cpp为扩展名的文件,以h为扩展名的文件称为头文件。以cpp为扩展名的文件称为实现文件,一般来说h为扩展名的文件与cpp为扩展名的文件是一一对应配合使用的,在以h为扩展名的文件中包含的主要是类的定义,而在cpp为扩展名的文件中包含的主

29、要是类成员函数的实现代码。在应用程序中经常要使用一些位图、菜单之类的资源,VC+中以rc为扩展名的文件称为资源文件,其中包含了应用程序中用到的所有的windows资源,要指出的一点是rc文件可以直接在VC+集成环境中以可视化的方法进行编辑和修改。最后是以rc2为扩展名的文件,它也是资源文件,但这个文件中的资源不能在VC的集成环境下直接进行编辑和修改,而是由我们自己根据需要手工地编辑这个文件。对于以ico,bmp等位扩展名的文件是具体的资源,产生这种资源的途径很多。使用rc资源文件的目的就是为了对程序中用到的大量资源进行统一的管理。VC+在开发应用程序的各个阶段都需要经常对程序进行编译连接和运行

30、,以对部分已实现的功能进行调试和修改。它提供了功能强大的编译器,对连接错误提示信息比较丰富准确。当程序员单击运行命令时,便一起开始运行,它首先进行预处理,创建编译输入,该编译器创建一个包含机器代码、连接指令、区段、外部引用和从原文件产生的函数名和数据名的对象文件。(2) MFC编程技术近几年来,面向对象技术无论是在理论上还是实践上都在飞速地发展。面向对象技术中最重要的就是“对象”的概念,它把现实世界中的气球、自行车等客观实体抽象成程序总的“对象”。这种“对象”具有一定的属性和方法,这里的属性指对象本身的各种特性参数。如其球的体积、自行车的长度等,而方法是指对象本身所能执行的功能,如气球能飞、自

31、行车能滚动等。一个具体的对象可以有许多的属性和方法,面向对象技术的重要特点就是对象的封装性,对于外界而言,并不需要知道对象有哪些属性,也不需要知道对象本身的方法是如何实现的,而只需要调用对象所提供的方法来完成特定的功能。从这里我们可以看出,当把面向对象技术应用到程序设计中时程序员只是在编写对象方法时才需要关心对象本身的细节问题,大部分的时间是放在对对象的方法的调用上,组织这些对象进行协同工作。MFC的英文全称是Microsoft Foundation Classes,即微软的基本类库,MFC的本质就是一个包含了许多微软公司已经定义好的对象的类库,我们知道,虽然我们要编写的程序在功能上是千差万别

32、的,但从本质上来讲,都可以划归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等等一些最主要的方面。这一点正是微软提供MFC类库最重要的原因,在这个类库中包含了一百多个程序开发过程中最常用到的对象。在进行程序设计的时候,如果类库中的某个对象能完成所需要的功能,这时我们只要简单地调用已有对象的方法就可以了。我们还可以利用面向对象技术中很重要的“继承”方法从类库中的已有对象派生出我们自己的对象,这时派生出的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需要的特性和方法,产生一个更专门的,功能更为强大的对象。当然,也可以在程序中创建全新的对象,并根据需要不断完善对

33、象的功能。正是由于MFC编程方法充分利用了面向对象技术的优先,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。在使用MFC方式的应用程序中,CMyApp类主要的作用是用来处理消息的,它统一管理程序收到的所有的消息,然后把消息分配到相应的对象。CFrameWnd是CMainFrame的父类,CMainFrame负责视图、工具条和状态条等的显示。Cview是CMyView的父类,视图是一个窗口的对象,用户就是通过视图这个窗口对象来与文档进行交互作用的

34、。CDocument是CMyDoc的父类,文档是数据的对象、目标、集合,文档通常是由文件菜单的新建菜单项或者打开菜单项来创建的,并且通常是以文件的形式保存下来。在MFC程序中,程序的数据是放在文档当中的,而显示数据则是利用视图方式,文档与视图分离带来的好处就是一个文档可以同时具有多个视图,每个视图只显示文档中的一部分数据,或者以特定的风格显示文档中的数据。文档与视图分离的另一个好处就是在程序中可以处理多个文档,通过对不同的视图的处理达到对不同的文档分别处理的目的。传统的Windows编程方法是在应用程序中有一个重要的函数WinMain()。这个函数是应用程序的基础,用户的操作所产生的消息正是经

35、过这个函数的处理派送到对应的对象中进行处理。在MFC方式的Windows应用程序中,用来处理消息的是系统自动生成的MFC中的类CWinApp的派生类CmyApp。1.3 小结本章介绍了虚拟现实的发展过程及国内外研究现状,同时还对OpenGL图形库技术进行了分析,简要介绍了OpenGL函数的构成以及渲染管线。此外,还对VC+编程平台以及MFC库作了详细的介绍。2 需求分析2.1 任务背景及目标虚拟现实(VR)技术是仿真技术的高级发展与突破,它最适合于系统仿真,是仿真技术的发展方向。虚拟现实中的可视化部分称为虚拟场景(Virtual Scene),它是虚拟现实中的关键技术。虚拟场景,与Intern

36、et网络技术一样,同是发源于军事开发的需要。随着计算机硬件技术的飞速发展,虚拟场景技术也将在社会各领域迅速成长,成为现今社会经济发展和军事应用中不可或缺的重要组成部分。虚拟场景技术的开发,主要分为平面图像设计、三维模型设计和图形驱动程序开发三个方面工作。平面图像设计:该部分的主要任务是根据三维模型设计的需求,采集素材的过程。通过摄像、照相、扫描、航拍及卫星影像等手段将有用的图像信息采集到计算机系统,形成一定格式的电子图像,通常以文件形式存储。利用专业图像处理工具对这些图像进行裁剪、修正、存储格式及图素大小等方面进行加工处理,使其成为正式的纹理图像。三维模型设计:虚拟环境中的几何要素大部分属于在

37、非实时状态下通过一定的建模工具建立的实体模型,地形模型是其中较为特殊的一类实体。通常,建模过程大致分为两个步骤,首先,根据实体的几何形状特性建立其三维空间的等体模型,该模型描述了实体形状、尺寸等信息,称其为几何模型;其次,要对几何模型表面属性进行配置,即给实体表面加上一定的颜色、材质、纹理等,增加了实体的逼真度。模型一般采用树状结构存储,构建良好的模型结构能够提高模型内部的遍历速度。图形驱动程序:图形驱动也可称为图形管理,它是所有图要素在三维场景中显示的依托,也是仿真算法实现的平台,它负责创建通道、视口、场景等基础的图形环境,并建立一个大地坐标系,将实体模型导入到场景当中,根据计算结果设置实体

38、在场景中的空间位置,同是,它还需要提供地形匹配、碰撞检测等基本的图形算法,图形驱动程序往往还包括一些特效模块,生成燃烧、烟等特效实体。在实时系统中,图形驱动程序可大致分为初始化(Initialization)、帧循环(OnIdle)、退出并释放资源(Quit)三大部分,初始化部分用于完成创建基础环境、导入模型等工作,仿真控制和仿真算法都是在帧循环部分实现的,它是一个无限循环的回调函数。本文要实现的是图形驱动程序部分的工作,需要完成一个“天涯共此时”三维虚拟场景的图形绘制、场景变换、场景动画等工作,具体实现绘制出月亮、花瓣、雪花、灯笼、树、人、房子的工作,实现从雪花飞舞的场景到花瓣飞舞场景的相互

39、转换,实现灯笼随风飘动的动画场景。此次设计的重点在于雪花、花瓣、灯笼的绘制,雪花花瓣场景的互相转化,灯笼随风飘动这三个部分。2.2 任务功能分析在此次设计中,需要实现三个模块:天空模块、灯笼模块以及地面模块,天空模块要求有月亮,还要有雪花飘舞;灯笼模块需要实现灯笼随风飘动;地面模块需要实现有房子,人物。在天空模块中,当点击“天涯共此时”按钮时,场景要从雪花飞舞变成花瓣飘舞。(1) 天空模块该模块是本文的重点部分,在该模块中,首先要解决的问题就是要绘制月亮、雪花、花瓣,实现雪花飞舞和花瓣飞舞两个动态场景,月亮保持静止不动。其次要考虑的是如何实现雪花飞舞的场景与花瓣飞舞场景的相互转换。绘制月亮、雪

40、花、花瓣时,需要使用OpenGL中的绘图函数,同时在绘制雪花和花瓣时需要定义定时器来实现雪花飞舞和花瓣飞舞的动画场景,此外,还需要使用显示列表技术来实现场景的变换。(2) 灯笼模块灯笼模块也是本文的一个重点部分,需要实现灯笼随风飘动的情景,因此,首先要解决的问题是如何绘制出感官上看起来比较唯美的灯笼和灯穗,在OpenGL中可以使用OpenGL绘图函数进行绘制,然后要解决的问题是如何能够使整个灯笼随风飘动,这个功能可以使用定时器来实现,然后在调用绘图函数时使灯笼随坐标轴旋转,两者配合循环使用,可以实现灯笼的随风飘动。(3) 地面模块该模块的实现也是此次设计中不可缺少的环节,为了增加场景的美观性,

41、需要绘制人、树、房子,这个部分的绘制同样需要调用OpenGL的绘图函数来完成,可以调用绘制线条的函数来实现简单物体的绘制。此外,需要考虑地面场景的协调性,树、人房子的高度等都要协调,需要通过调用OpenGL的位置变换函数来实现。2.3 系统开发技术此次设计中涉及到复杂的图形绘制问题、场景变换的问题以及布景等问题,要解决这些问题,主要使用到OpenGL中的显示列表技术以及场景变换原理,此外,还涉及到了平滑反走样技术以及色彩变化技术等。在此主要介绍一下显示列表技术和场景变换原理。2.3.1 显示列表技术OpenGL显示列表(Display List)实际上是一组预先存储在高速缓存中已经编译过的Op

42、enGL命令。调用显示列表时,将按照顺序执行其中的函数。大部分OpenGL函数调用既可存储在显示列表中,也可以在直接模式下执行。在程序中,可以同时使用直接模式编程和显示列表。灵活地应用显示列表,会提高绘制图形的能力和技巧。(1) 显示列表的应用场合显示列表是程序运行的优化工具,其主要优化以下场合: 曲线、曲面等复杂图形的绘制; 数据量大、调用次数多的几何模型; 纹理、图像等图形的操作; 光照、材质操作; 多次进行的变化操作; 绘制运动的复杂图形、物体和场景;(2) 显示列表的创建与执行OpenGL通过函数对glBeginList()与glEndList()创建显示列表,通过调用glCallLi

43、st(GLuint list)函数来执行调用显示列表命令。在创建显示列表时,需要注意的是:一个序号的显示列表只能创建一个显示列表,重复创建时,后面的显示列表将取代前面的显示列表;显示列表一旦创建,就会长期存在,所以应该只执行一次创建过程;大量创建显示列表会降低程序的运行速度;显示列表一经定义,就不会改变。(3) 显示列表的管理OpenGL通过函数命令与状态变量定义管理显示列表。通过这些函数,OpenGL可以定义、创建、查询、调用、删除显示列表。这些函数有glGenLists()、glListBase()、glIsList()、glDeleteLists()、glCallLists()等。2.3

44、.2 场景变换原理OpenGL提供的变换功能,可以用来解决如何“布景”、场景变换的问题。OpenGL将图形显示在屏幕上要经过多个变换过程,但主要是经过透视投影变换、视区变换、剪切变换以及几何变换四个过程。在此次设计中,主要涉及到几何变换。OpenGL的几何变换,是在世界坐标系下几何图元相对坐标原点的平移、旋转与缩放变换。(1) 平移变换物体是相对原点定义与绘制的,所以移动坐标原点就相当于物体的平移运动。OpenGL中使用glTranslatef()、glTranslated()函数进行物体的平移变换。函数分别采用浮点数与整数,将原点移动到参数中指定的位置。(2) 旋转变换旋转变换是指物体所在的

45、坐标系发生旋转变换,因为物体相对于坐标系位置固定由坐标定义的顶点位置固定,所以坐标系的变化将直接导致物体的变化。OpenGL中使用glRotatef()以及glRotated()函数来实现物体的旋转变换,函数分别采用浮点数与整数,绕着原点指向参数中指定方向的射线,逆时针旋转指定的角度。(3) 缩放变换缩放变换比较复杂,由于物体是相对原点和坐标系定义和绘制的,缩放坐标系即使坐标系中的物体缩放。OpenGL中使用glScalef()和glScaled()函数来实现物体的缩放。函数分别采用浮点数与整数,将坐标系的x、y、z轴分别缩放指定的倍数,同样坐标系中的物体将同步缩放。2.4 小结本章主要论述了

46、在实现虚拟场景初期需要做的准备工作以及要实现的设计目标,对本次三维虚拟场景的设计任务进行了功能分析,将其划分为三大任务模块。此外,还分析介绍了本次程序设计需要解决的关键问题所采用的关键技术显示列表技术及场景变换原理。3 软件设计与实现3.1 总体设计根据任务要求,可以把该虚拟场景划分为三个子模块来实现,它们分别是:天空模块、灯笼模块、地面模块。图3.1 系统总体模块图如图3.1所示,将虚拟场景拆分为三个部分来实现,每一个部分都实现一定的场景,最后整体形成一个主题为“天涯共此时”的三维虚拟场景。天空模块主要实现月亮、雪花、花瓣的绘制以及实现花瓣飞舞、雪花飞舞、雪花飞舞场景与花瓣飞舞场景的相互转换

47、。在该模块中需要用到OpenGL中的显示列表技术以及场景变换原理,还涉及到花瓣和雪花的绘制原理。灯笼模块主要是绘制三个灯笼以及灯穗,实现灯笼随风飘动的动画效果。在该模块中,灯笼的绘制和色彩变化是一个复杂的部分,此外,还涉及到定义定时器来实现灯笼随风飘动效果。地面模块虽然简单但却是不可缺少的。地面模块需要绘制树、人、房子,使用OpenGL的基本的绘图函数就可以实现简单的树、人、房子的绘制。在该模块中,虽然绘制的图形很简单,但是却能够增加整个场景的观赏度。任何一种程序都有它的运行环境。OpenGL的所有绘图命令都必须在OpenGL的运行环境中使用,这个运行环境称为OpenGL的框架。所以,在设计三

48、维虚拟场景的时候,首先要构建OpenGL的框架。构建好框架之后,就要往框架里添加内容了。当将所有的绘图工作做完后,填入OpenGL的框架,就可以最终形成所要实现的三维虚拟场景。图3.2展示了系统总流程图,经过一系列的调用与循环之后,就可以实现此次设计的“天涯共此时”的虚拟场景。其中,在mydraw()函数中完成场景的绘制。图3.2 系统总流程图整个场景的绘制是在mydraw()函数中完成调用的,如图3.3所示,是mydraw()函数的函数调用流程图。图3.3 mydraw()函数的函数调用流程图3.2 天空模块3.2.1 天空模块功能及原理天空模块的设计主要是为了实现月亮、花瓣、雪花的绘制和雪

49、花飞舞、花瓣飞舞的动画以及雪花飞舞场景与花瓣飞舞场景的相互转换。在绘制该场景时,雪花和花瓣的绘制都是通过循环控制来实现的。单个雪花的绘制通过调用newyear()函数来完成,在newyear()函数中,使用OpenGL的绘图函数来绘制雪花,通过绘制一个雪花花瓣,然后再循环,完成一个雪花的绘制。单个花瓣的绘制是通过调用un2()函数实现,在un2()函数中,绘制单个的花瓣也是由循环控制完成绘制的。月亮的绘制由两个填充的一个为月亮颜色一个为背景颜色的圆重叠,然后设置视角,可以绘制出弯月的效果。对于雪花飞舞和花瓣飞舞的动画的实现,通过设计定时器来完成,当雪花和花瓣的数量达到定时器检测时的要求时,雪花

50、和花瓣重新绘制,通过不断循环绘制,实现雪花飞舞和花瓣飞舞的动画。定义一个显示列表,并且在定时器中进行设定,当满足条件后可以实现由雪花飞舞和花瓣飞舞场景的相互转换,并且在程序的运行过程中,定时器会不断监测是否发生场景的变换,如果发生了场景的变换,则调用显示列表给予响应,从而来实现雪花飞舞与花瓣飞舞场景的相互转换。图3.4 天空模块结构图 在绘制天空模块中的图形的时候,还必须做一些其他的辅助性工作,如启用阴影平滑、启用色彩变幻、指定前后表面的建模方式等。3.2.2 天空模块中的数学关系在该模块中,需要通过OpenGL绘图函数来绘制图形,还需要计算绘图方法,即建立一种数学模型,将图形转化成顶点坐标的

51、计算来进行绘制。其中花瓣和雪花的绘制都是基于单体然后通过循环来进行绘制。60在绘制雪花时,由于每一个雪花都是六个角,并且是对称的,所以对于每一个雪花的绘制可以先绘制一个雪花花瓣,旋转60之后,再次循环。如此进行三次循环就可以绘制出一个雪花。如图3.5所示,左图左边是一个花瓣的形状,右图是绘制完成之后的一个雪花。 图3.5 雪花绘制示意图zx3412y扇形角度30旋转开角也随大角度旋转,动态变化变小半径随大角度旋转,动态变化增加绘制花瓣时,需要通过计算来绘制,每一个花瓣的绘制都是通过循环控制,分成一定的份数来完全绘制,如果没有循环,不能绘制出比较真实的花瓣,在绘制的时候,不仅要计算花瓣顶点的坐标

52、,还需要对颜色变换进行计算,以达到控制颜色变换的目的。图3.6展示出了花瓣的绘制原理。图3.6 花瓣绘制原理图从图3.6可以看出,使用四边形片绘制花瓣时需要将整个花瓣拆分不断循环绘制,才能绘制出接近真实的花瓣。这种拆分法也是本文绘制图形时所用的方法。3.2.3 天空模块的算法实现在绘制该模块时,本文分为三个函数进行绘制:绘制雪花的函数、绘制的花瓣的函数、月亮的绘制函数,然后从mydraw()函数中顺序调用moon()函数来绘制一弯明月,循环调用绘制雪花的函数year()函数和un2()函数分别来绘制雪花和花瓣,实现雪花和花瓣飞舞的动画场景,从而完成整个天空模块的绘制。图3.7 moon()函数

53、流程图 绘制月亮的函数的moon()函数的流程图如图3.7所示。首先对所能够定义的变量进行初始化,然后初始化场景,设置绘制面的填充模式、平滑模式、缩放模式、位置变换等。然后使用OpenGL的有关绘图函数循环进行绘制,直到绘制结束。图3.8是绘制雪花的函数year()函数的流程图,从图中可以得到要绘制雪花,首先得初始化所定义的绘制雪花的变量,然后初始化场景,再通过循环来完成一个雪花的绘制。图3.8 year()函数流程图花瓣的绘制同雪花的绘制一样,需要用循环进行完成,绘制花瓣的函数的un2()函数的流程图如图3.9所示,同样,首先得初始化所定义的变量、初始化场景,然后使用循环不断调用OpenGL

54、的绘图函数来完成花瓣的绘制。图3.9 绘制花瓣的函数un2()的流程图3.2.4 基于OpenGL的天空模块的设计与实现在该模块的设计中,首先就是定义雪花和花瓣的大小和位置角度的数组变量、雪花和花半数的变量、灯穗的摆动变量。此外还需要定义显示列表,用来实现雪花飞舞和花瓣飞舞场景的变换。在进行绘制之前,需要对这些定义的变量进行初始化,这样当动画开关打开后才能实现动画效果。然后在绘制的过程中,还涉及到平移变换、旋转变换、缩放变换、绘制面填充模式等设置,这些都需要通过调用OpenGL相应的绘图函数来完成。当这些绘制之前的工作都做完了以后,就可以调用算法来实现绘图。3.3 灯笼模块3.3.1 灯笼模块

55、的功能及原理在灯笼模块中,主要实现的功能是灯笼随风飘动的动画,首先需要绘制灯笼和灯穗,在绘制的过程中通过旋转变换以及定时器来实现灯笼的随风飘动。可以将该模块分为两个部分:绘制灯笼体部分以及绘制灯笼穗部分(如图3.10所示),灯笼穗部分的绘制可以在调用灯笼绘制函数的mydraw()函数中来完成,灯笼体部分的绘制需要编写一个lantern()函数来实现。图3.10 灯笼模块结构图绘制灯笼时,通过循环来完成灯笼的绘制。将灯笼的绘制分为两个部分:灯笼边直筒部分以及灯笼的外围部分,这两个部分的绘制分别是通过循环控制实现的。灯笼的随风飘动动画是通过定时器来实现,在整个虚拟场景绘制开始之前启动定时器,然后将

56、监测的内容添加进去,灯笼随风飘动的动画则是在mydraw()函数调用绘制灯笼的函数之前通过旋转来达到效果,定时器只监测一次。3.3.2 基于OpenGL的灯笼模块的算法设计与实现z3421xy每次绘制角度为360的旋转圆环随角度旋转绘制灯笼表面在利用OpenGL中的有关绘图函数来实现该模块时,首先需要清楚灯笼的绘制原理,图3.11给出了灯笼外围的绘制原理,由图可以得到绘制灯笼是需要用循环控制来实现的。图3.11 灯笼绘制原理图绘制灯笼需要分为灯笼体部分和灯笼穗两个部分来实现,灯笼穗的绘制在mydraw()函数部分完成,灯笼体部分由lantern()函数来实现。在该函数中绘制灯笼时,除了用到Op

57、enGL有关绘图函数图外,还用到了色彩变幻函数,使灯笼看起来更像纸质的灯笼。此外,绘制时为了避免绘制的图形有缺陷,在循环时使用了大于360的循环。在绘制灯笼边直筒部分时,颜色需要呈现出固定且有过渡的色彩,而在绘制灯笼外围部分时,灯笼的颜色需要根据数学函数来呈现出渐变过渡的色彩,这样才能绘制出更接近现实纸质的灯笼。图3.12 lantern()函数流程图图3.12是灯笼体绘制部分函数lantern()的函数流程图,绘制灯笼时,首先要定义变量并将其初始化,同时初始化场景,然后使用循环控制来进行灯笼边直筒部分的绘制,最后是使用循环控制来绘制外围部分,来实现整个灯笼的绘制。3.4 地面模块3.4.1

58、地面模块功能及原理该模块的设计是为了增加场景的可观性,主要实现树、人、房子的绘制。该模块是一个比较简单的模块,需要用到OpenGL中绘制线的函数,然后通过场景变换来实现合理“布景”,使整个场景看起来更加美观、协调。如图3.13所示,地面模块主要分为三个小的部分:绘制树的部分、绘制小人的部分以及绘制小房子的部分。在绘制该模块时,树、人、房子的绘制都是通过OpenGL里的绘制线的函数来完成的。其中“合理布景”涉及到场景变换中的平移变换原理。函数tree()实现树的绘制,room()实现房子和小人的绘制。图3.13 地面场景的结构图3.4.2 基于OpenGL的地面模块的算法设计与实现在绘制地面模块

59、时,使用OpenGL中的图形绘制函数以及色彩设置函数,绘制树、人、房子时将物体转换为顶点坐标,用OpenGL进行绘制,所以实现的是简单的物体的绘制。图3.14 tree()函数流程图图3.14所示为tree()函数流程图,在绘制树时,首先定义变量,进行场景的初始化,然后调用OpenGL的绘图函数来进行树的绘制,完成绘制后,取消线型设置。图3.15 room()函数流程图图3.15是room()函数流程图,在该函数中要实现的是小人和房子的绘制,首先定义并且初始化变量,初始化场景、定义线的类型,然后使用OpenGL绘图函数通过循环控制来绘制小人和房子。在绘制过程中,使用到平移变换来实现合理“布景”

60、。3.5 小结本章是本程序的设计与实现部分,在本章节中主要论述了本程序的模块划分和各个模块的实现过程。本程序被分为了天空模块、灯笼模块和地面模块三个部分。每个部分都是基于C+语言中的OpenGL函数库实现的。通过本章节的论述,对该程序的详细设计原理和算法以及实现都一一进行了阐述。4 软件测试和运行4.1 实验环境本软件的运行环境需要一定的软件以及硬件设备,以便于实现较为理想的运行结果,其所需软件及硬件条件如下:硬件设备:微机一台操作系统:Windows xp sp3编程语言:C+程序设计语言运行环境:Visual C+ 6.0开发技术:OpenGL4.2 环境配置在编写OpenGL程序之前,需

61、要对OpenGL程序进行初始设置工作。建立一个程序,首先打开Visual C+ 6.0程序。(1) 建立一个新的工程,命名为plmy。(2) 完成OpenGL基础库设置 更改头文件:打开Visual C+程序WorkSpace区域的FileView页面,打开plmyView.h文件,然后在程序前面加入#include glgl.h和#include glglu.h两条语句,然后对所做的工作进行保存。 打开设置对话框:单击Visual C+程序菜单中的“工程”选项,在单击“设置”菜单,然后在弹出的对话框中选择“常规”选项,然后在Microsoft基础类中选择“使用MFC作为静态链接库”,如图4.

62、1所示。 连接OpenGL库文件:如图4.2所示,选择“链接”页面,然后在“对象/库模块”中添加两个OpenGL库文件(OpenGL32.lib和glu32.lib),最后单击“确定”,即可完成OpenGL的初始设置。图4.1 “常规”项的配置图4.2 “连接”项有关OpenGL库文件的配置4.3 运行结果本文基于OpenGL技术实现了3D虚拟场景的设计与实现。通过运行本程序,得到了一幅“天涯共此时”的虚拟场景。其中带有雪花的场景如图4.3所示。该场景中灯笼随风飘动,雪花缓缓落下,月亮的绘制也比较成功。图4.3 带有雪花的场景图图4.4 带有花瓣的场景图图4.4展示了带有花瓣的虚拟场景,该场景

63、是在点击了工具栏里“天涯共此时”按钮后,由飘雪的场景转换为漫天花瓣飞舞的场景,呈现出一幅唯美景象。图4.5 显示版本属性的场景图图4.5 是点击工具栏中的帮助按钮后出现的能够显示一个对话框的场景,在对话框中,所提示的信息是关于程序的版本以及说明,为整个设计添加了趣味性。图4.6 显示状态栏和工具栏的场景图图4.6是当点击了工具栏里“属性”按钮之后,场景不再是全屏状态显示,而是显示出带有工具栏和状态栏的场景。再一次点击“属性”按钮后,会回到全屏显示状态。参考文献1 徐波. OpenGL编程指南(原书第5版)M. , 20062 郭兆荣. Visual C+ OpenGL 应用程序开发M. 人民邮电出版社, 20063 . M. 电子工业出版社, 19994 费广正,乔林. Visual C+ 6.0高级编程技术OpenGL篇M. 中国铁道出版社, 20005 OpenGL体系结构审核委员会. OpenGL编程指南(第四版)M. 人民邮电出版社,20056 朱亚平等. OpenGL编程实例M. 人民邮电出版社,19997 石教英. 虚拟现实基础及实用算法M. 科学出版社, 20028 周建龙,肖春. 计算机图形学理论与OpenGL编程实践

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!