1、论文题目: 基于 OpenGL的屏幕对象拾取 II毕业论文(设计)原创性声明本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果。据我所知,除文中已经注明引用的内容外,本论文(设计)不包含其他个人已经发表或撰写过的研究成果。对 本论文(设计)的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。 作者签名: 日期: 毕业论文(设计)授权使用说明本论文(设计)作者完全了解*学院有关保留、使用毕业论文(设计)的规定,学校有权保留论文(设计)并向相关部门送交论文(设计)的电子版和纸质版。有权 将论文(设计)用于非赢利目的的少量复制并允许论文(设计)进入学校图书馆被
2、查阅。学校可以公布论文(设计)的全部或部分内容。保密的论文(设计)在解密后适用本规定。 作者签名: 指导教师签名: 日期: 日期: III注 意 事 项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300 字左右) 、关键词4)外文摘要、关键词 5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论) 、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于 1 万字(不包括图纸、程序清单等) ,文科类论文正文字数不少于 1.2 万字。3.附件包括:任务书、开题报告、外文译文、译文原文
3、(复印件) 。4.文字、图表要求:1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画3)毕业论文须用 A4 单面打印,论文 50 页以上的双面打印4)图表应绘制于无格子的页面上5)软件工程类课题应有程序清单,并提供电子文档5.装订顺序1)设计(论文)2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订3)其它IV目录摘要 .1ABSTRACT.21 绪论 .31.1 课题的目的和意义 .3
4、1.2 拾取技术国内外研究拾取技术国内外研究拾取技术国内外研究 .31.3 本论文研究主要内容 .32 基于 OPENGLMFC 的建模基础 .52.1 OpenGL概括 .52.2 OpenGL渲染管线过程 .52.2.1顶点变换 .62.2.2图元组装 .62.2.3图元处理 .62.2.4片元处理 .62.2.5光栅化操作 .62.3 MFC概述 .62.4 MFC特点 .72.4.1封装 .72.4.2继承 .82.4.3虚拟函数和动态约束 .82.5 应用程序的构成 .82.6 基于 OpenGL+MFC的三维模拟的编程环境配置 .93 拾取技术 .123.1 基于射线求交拾取技术
5、.123.1.1判断线段和包围盒的相对位置 .123.2 基于 GPU的重绘式拾取技术 .143.3 各种拾取技术比较 .164 系统的设计及实现 .184.1 系统的选择机制 .184.1.1进入选择模式之前 .184.1.2获取当前选择模式 .184.1.3退出选择模式 .204.1.4拾取 .204.2 拾取结果截图 .215 结论与展望 .255.1 结论 .255.2 展望 .25参考文献 .26致谢 .281摘要屏幕对象的拾取是计算机图形处理系统中一个重要的功能,在许多情况下,计算机图形处理系统不仅要绘制图形,而且要允许操作者能够通过输入设备(通常是鼠标)操纵屏幕上的物体(标识、移
6、动和修改)。有时还需要获取物体上点的空间坐标或测量物体的几何特性如距离、角度、半径等,这些操作都需要以拾取作为实现的基础。OpenGL 为了解决拾取问题,提供了一种基于名字堆栈和命中记录的选择机制。在 OpenGL 中,拾取物体是利用拾取矩阵和投影变换,将拾取的范围限制在鼠标热点的有效区中,一旦触发鼠标事件就进入选择模式并将有效区初始化,最后利用拾取矩阵拾取有效区内的物体。有效区的定义由 glPick2Matix()函数来完成。一旦拾取成功,就以记录的形式返回与拾取物体相关的信息,并生成一个记录表示一个物体被命中。这种物体拾取方法非常简单,不需要写很多代码。在使用 OpenGL 工具包开发图形
7、处理系统时,物体的拾取有多种方法,其中包括 OpenGL 提供的选择机制、射线拾取法、重绘式拾取法等。本文采用 OpenGL 本身提供的选择机制来拾取对象,突出 OpenGL 工具包在屏幕对象的拾取方面的优势。关 键 词:OpenGL;计算机应用;拾取算法2AbstractIn most cases, one important feature of graphics processing system is picking, which allow users to select objects by mouse, and to modify the their attributes, su
8、ch as gemetry mesh or angle and so on. In order to solve the problem, pick OpenGL provides a name on the stack and hit record choice mechanism. In the OpenGL and pickobject is using the loot matrix and projection transformation, and will gather in the limits of the mouse, effective once entered the
9、mouse event trigger mode choice and will be effective area, finally using initialization gleaned matrix pick objects in the area of effective. The definition of effective glPick2Matix () function to finish. Once pick success, to return to pick the record object relevant information, and to create a
10、record, says an object to be hit. This object pick method is very simple, need not write many code.In the use of graphics processing system development OpenGL toolkit objects, pick a variety of methods, including OpenGL provide choice mechanism, ray pick, redrawn type gather method, etc. Based on th
11、e mechanism of OpenGL itself to provide choice pickup, outstanding OpenGL toolkit objects in the screen in the object.Key words: OpenGL; computer application;picking31 绪论目前许多优秀的图形工具能为我们绘制惟妙惟肖的虚拟现实场景,在面对这些场景时候我们除了欣赏之外更多的是希望能与之互动,做为编程人员可以使用代码轻松的重新构造场景,但对于终端用户而言,他们也希望自己也能对造场景进行一些操作,如添加,删除等等。对于这些操作而言,首先
12、我们要做的是能让用户使用鼠标来选择他所希望操作的对象,这就是本文要讨论的一个重点:拾取,这是一种在许多交互性程序中有基础地位的操作,是对屏幕中对象进行定位,并确定所选择的是哪个物体。然而该操作给我们提出了一些难题,首先,需要对对象进行届定。其次,必须对“拾取目标”进行定义。这就需要终端用户确定单击的位置是构成对象的图元上,还是对象附近的位置以及考虑如果选取点落在两个以上物体交集部分如何处理等等问题,本文利用了 OpenGL 中的选择模式进行有效的对象判别和拾取。1.1 课题的目的和意义图形对象的拾取是计算机图形处理系统中一个重要的功能,很多图形系统需要用户通过输入设备与系统交互,如移动、旋转某
13、个物体,或查询某个物体的状态信息,需要通过拾取来确定景中的操作对象。快速可靠的拾取被广泛地运用于各种系统中,如实时图形系统、虚拟现实、游戏和 CAD系统等方面,拾取操作己成为这些系统的重要部分,它在计算机建模软件尤其重要,能够通过拾取操作对模型进行局部修改和编辑,提高建模系统的灵活性和适用性。随着计算机软硬件的快速发展,人们对实时系统的交互的实时性要求也越发苛刻,而且三维场景复杂度也日益提高,这就要求系统提供快速的拾取操作。因此,高效的拾取算法能够决定拾取操作快与慢的关键所在,从而开发高效的拾取算法已成为当今一个的课题研究。1.2 拾取技术国内外研究随着网络科技越来越发达,拾取操作也越来越方便
14、了,有的只要鼠标点点就可以。而拾取操作的关键是拾取算法。到目前为止,拾取算法大致上可以分三种。第一种是基于射线求交的拾取技术,1992 年,Mark Segul,Carl Korobkin,Rolf van Widenfelt 等人首次采用了基于射线求交的拾取技术原理实现了对衣服的拾取 1;1998 年 Michael Deering,Step hanie Winner and Bic Schediwy 等也才采用了同样的技术成功做到了人物的拾取 2;2005 年,龚堰珏,颜敏等人采用了基于射线求交的拾取技术实现对几个简单物体的拾取 3;同年,韦宇炜也是用此技术实现对游戏中各类的拾取,如对技能
15、的释放,对地上物品的捡起来,对别的玩家人物属性的查看等等 4;2006年,姚继权,李晓豁等人也采用了这种拾取技术成功地做到了对 3D 网游游戏中的各种各样的拾取 5,等等。第二种是基于 GPU 的重绘式拾取技术,这种方法对硬件的依赖性大,不过拾取速度快。1997年,MasaakiOka,Kyoya Tsutsui,Akio Ohba 等人第一次采用了基于 GPU 的重绘式拾取技术在房子中拾取到了房子主人与小孩子 6;2006 年,刘力强,周明全等多人采用基于 GPU 的重绘式拾取技术,在大规模室外地形中拾取到了地面某个区域 7。第三种是 OpenGL 自带的拾取机制,1992 年7 月,SGI
16、 公司发布了 OpenGL 的 1.0 版本,随后又与微软公司共同开发了 Windows NT 版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型 3D 图形处理软件也可以在微机上运用。1995 年 OpenGL 的 1.1 版本面市,该版本较 1.0 性能提高许多,并加入了一些新的功能,如本身自带的拾取机制,这项功能使 OpenGL 在各个领域都得到了应用 8。随后出现的各个版本,使自带的拾取机制越来越完善,操作越来越方便,应用范围越来越广泛。1.3 本文研究的主要内容(一):综述本课题研究的意义以及国内外研究现状;(二):介绍了 OpenGL 与 OpenGL 渲染管道,分
17、析 MFC 编程框架和基于 OpenGL+MFC 的三维模拟的编程环境配置;(三):各种拾取技术的实现原理,优缺点;(四):采用了 OpenGL 本身自带的拾取机制设计并实现简单的拾取操作;4(五):总结本文并进一步给出了展望。52 基于 OpenGLMFC 的建模基础2.1 OpenGL概括 OpenGL(全写 Open Graphics Library)是个定义了一个跨编程语言、跨平台的编程软件接口的规格,该接口包括了大约 250 个不同的函数(其中核心 OpenGL 大约包括 200 个函数,另外还有50 个左右位于 OpenGL 工具函数库) ,可以用这些函数指定物体和操作,创建交互性
18、三维应用程序。它是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库,Opengl 用于三维图象(二维的亦可) 。OpenGL 的设计目标就是作为一种流线型的、独立于硬件的接口,可以在许多不同的硬件平台上实现。为了实现这个目标,OpenGL 并未包含用于执行窗口任务或者获取用户输入之类的函数。反之,必须通过窗口系统控制所使用的特定硬件。类似地,OpenGL 并没有提供用于描述三维物体模型的高层函数。这类函数可能允许你指定相对较为复杂的形状,例如汽车、身体的某 个部位、飞机或分子等。在 OpenGL 中,必须根据少数几个基本几何图元(geometric primitive) (如点、直线
19、和多边形)来创建你所需要的模型。当然,我们可以在 OpenGL 上创建能够提供这些特性的高级函数库。OpenGL 实用函数库(GLU)提供了许多建模特性,例如二次曲面以及 NURBS 曲线和表面。GLU 是所有 OpenGL 实现的一个标准组成部分。1992 年 7 月,SGI 公司发布了 OpenGL 的 1.0 版本,随后又与微软公司共同开发了 Windows NT版本的 OpenGL,从而使一些原来必须在高档图形工作站上运行的大型 3D 图形处理软件也可以在微机上运用。1995 年 OpenGL 的 1.1 版本面市,该版本较 1.0 性能提高许多,并加入了一些新的功能。1997 年,W
20、indows 95 下 3D 游戏的大量涌现,游戏开发公司迫切需要一个功能强大、兼容性好的 3D 图形接口,而当时微软公司自己的 3D 图形接口 DirectX 3.0 功能却是很糟糕。因而以制作雷神之锤等经典 3D 射击游戏而著名的 id 公司同其它一些游戏开发公司一同强烈要求微软在Windows95 中加入对 OpenGL 的支持。微软公司最终在 Windows95 的 OSR2 版和后来的 Windows 版本中加入了对 OpenGL 的支持。这样,不但许多支持 OpenGL 的电脑 3D 游戏得到广泛应用,而且许多在 3D 图形设计软件也可以运用支持 OpenGL 标准的 3D 加速卡
21、,大大提高其 3D 图形的处理速度。2003 年的 7 月 28 日,SGI 和 ARB 公布了 OpenGL 1.5。OpenGL 1.5 中包括 OpenGL ARB 的正式扩展规格绘制语言“OpenGL Shading Language”。2004 年 8 月,OpenGL2.0 版本发布 OpenGL 2.0 标准的主要制订者并非原来的 SGI,而是逐渐在 ARB 中占据主动地位的 3Dlabs。2008 年 8 月初 Khronos 工作组在 Siggraph 2008 大会上宣布了 OpenGL 3.0 图形接口规范,GLSL1.30 shader 语言和其他新增功能将再次未来开放
22、 3D 接口发展指明方向。2009 年 3 月又公布了升级版新规范 OpenGL 3.1,也是这套跨平台免费 API 有史以来的第九次更新。2009 年 8 月 Khronos 小组发布了 OpenGL 3.2,这是一年以来 OpenGL 进行的第三次重要升级。Khronos 旗下的 OpenGL ARB(Architecture Review Board)工作组推出了 GLSL 1.5OpenGLShading Language(OpenGL 着色语言)的升级版,以及在 OpenGL3.2 框架下推出了两个新功能,可以让开发者在开发新程序时能够在使用流水线内核特性或兼容性特性之间做出选择,其
23、中兼容性特性会提供与旧版 OpenGL 之间的兼容性。2.2 OpenGL渲染管线过程管线这个术语用于描述一种过程,它涉及两个或更多个独特的阶段或步骤。当应用程序进行OpenGL API 调用时,这些命令被放置在一个命令缓冲区中。这个缓冲区最终填满了命令、顶点数据、纹理数据等。当缓冲区被刷新时,命令和数据就被传递给管线的下一个阶段。通常,顶点数据首先进行转换和光照。在转换阶段,描述物体几何形状的点被重新计算,以确定这个物体的位置和6方向。同时所进行的光照计算将确定每个顶点应该具有的颜色亮度。当这个阶段完成之后,数据就被输入到管线的光栅化部分。光栅阶段根据几何图形、颜色和纹理数据实际创建彩色图像
24、。然后,图像被放入帧缓冲区中。帧缓冲区就是图形显示设备的内存,这意味着这幅图像将会在屏幕上显示。图 1 显示了 OpenGL 工作流程图顺序,虽然并没有严格规定 OpenGL 必须采用这样的实现,但它却提供了一个可靠的指南方向,可以预测 OpenGL 将以什么样的顺序来执行这些操作。图 1 Opengl 工作渲染流程图OpenGL 渲染管线的操作过程主要包括以下几部分:1)顶点变换2)图元组装3)图元处理4)片元处理5)光栅化操作2.2.1顶点变换这个阶段主要是对输入的顶点进行逐个处理,这些顶点都包括很多属性(如位置、颜色、法线和纹理坐标等) ,经过处理后,输出是经过变换后的顶点属性及关联信息
25、。主要过程:顶点变换(几何变换和投影变换) 、光照计算、纹理坐标变换和生成。2.2.2图元组装这个阶段主要是按照输入的变换后的顶点属性和关联信息,组装形成图元。2.2.3图元处理这个阶段主要是对输入的图元进行处理,输出片元(帧缓存中更新象素属性的数据)信息,该片元信息是对顶点变换阶段得出的属性进行插值处理得到的。主要过程:视景裁剪、背面剔除。2.2.4片元处理这个阶段的输入为经过插值计算后的最终片元信息,经过处理后,输出信息为片元的深度和颜色值。主要过程:纹理、雾化、颜色汇总(包括纹理颜色,光照颜色,主颜色等) 。2.2.5光栅化操作这个阶段的输入为像素位置和片元的深度、颜色值等信息,经过一系列的测试(剪切测试、Alpha 测试、模板测试和深度测试)后形成像素的颜色。主要过程:剪切测试、Alpha 测试、模板测试和深度测试、写入帧缓存。2.3 MFC概述MFC(Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,