基于Opengl的屏幕对象拾取本科毕业论文Word格式文档下载.docx
- 文档编号:18435490
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:17
- 大小:265.04KB
基于Opengl的屏幕对象拾取本科毕业论文Word格式文档下载.docx
《基于Opengl的屏幕对象拾取本科毕业论文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于Opengl的屏幕对象拾取本科毕业论文Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
5)目次页(附件不统一编入)
6)论文主体部分:
引言(或绪论)、正文、结论
7)参考文献
8)致谢
9)附录(对论文支持必要时)
2.论文字数要求:
理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:
任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:
按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
3)其它
目录
摘要1
Abstract2
1绪论3
1.1课题的目的和意义3
1.2拾取技术国内外研究3
1.3本论文研究主要内容3
2基于OpenGL+MFC的建模基础5
2.1OpenGL概括5
2.2OpenGL渲染管线过程5
2.2.1顶点变换6
2.2.2图元组装6
2.2.3图元处理6
2.2.4片元处理6
2.2.5光栅化操作6
2.3MFC概述6
2.4MFC特点7
2.4.1封装7
2.4.2继承8
2.4.3虚拟函数和动态约束8
2.5应用程序的构成8
2.6基于OpenGL+MFC的三维模拟的编程环境配置9
3拾取技术12
3.1基于射线求交拾取技术12
3.1.1判断线段和包围盒的相对位置12
3.2基于GPU的重绘式拾取技术14
3.3各种拾取技术比较16
4系统的设计及实现18
4.1系统的选择机制18
4.1.1进入选择模式之前18
4.1.2获取当前选择模式18
4.1.3退出选择模式20
4.1.4拾取20
4.2拾取结果截图21
5结论与展望25
5.1结论25
5.2展望25
参考文献26
致谢28
摘要
屏幕对象的拾取是计算机图形处理系统中一个重要的功能,在许多情况下,计算机图形处理系统不仅要绘制图形,而且要允许操作者能够通过输入设备(通常是鼠标)操纵屏幕上的物体(标识、移动和修改)。
有时还需要获取物体上点的空间坐标或测量物体的几何特性如距离、角度、半径等,这些操作都需要以拾取作为实现的基础。
OpenGL为了解决拾取问题,提供了一种基于名字堆栈和命中记录的选择机制。
在OpenGL中,拾取物体是利用拾取矩阵和投影变换,将拾取的范围限制在鼠标热点的有效区中,一旦触发鼠标事件就进入选择模式并将有效区初始化,最后利用拾取矩阵拾取有效区内的物体。
有效区的定义由glPick2Matix()函数来完成。
一旦拾取成功,就以记录的形式返回与拾取物体相关的信息,并生成一个记录表示一个物体被命中。
这种物体拾取方法非常简单,不需要写很多代码。
在使用OpenGL工具包开发图形处理系统时,物体的拾取有多种方法,其中包括OpenGL提供的选择机制、射线拾取法、重绘式拾取法等。
本文采用OpenGL本身提供的选择机制来拾取对象,突出OpenGL工具包在屏幕对象的拾取方面的优势。
关键词:
OpenGL;
计算机应用;
拾取算法
Abstract
Inmostcases,oneimportantfeatureofgraphicsprocessingsystemispicking,whichallowuserstoselectobjectsbymouse,andtomodifythetheirattributes,suchasgemetrymeshorangleandsoon.Inordertosolvetheproblem,pickOpenGLprovidesanameonthestackandtheOpenGLandpickobjectisusingthelootmatrixandprojectiontransformation,andwillgatherinthelimitsofthemouse,effectiveonceenteredthemouseeventtriggermodechoiceandwillbeeffectivearea,finallyusinginitializationgleanedmatrixpickobjectsintheareaofeffective.ThedefinitionofeffectiveglPick2Matix()functiontofinish.Oncepicksuccess,toreturntopicktherecordobjectrelevantinformation,andtocreatearecord,saysanobjecttobetheuseofgraphicsprocessingsystemdevelopmentOpenGLtoolkitobjects,pickavarietyofmethods,includingOpenGLprovidechoicemechanism,raypick,redrawntypegathermethod,etc.BasedonthemechanismofOpenGLitselftoprovidechoicepickup,outstandingOpenGLtoolkitobjectsinthescreenintheobject.
Keywords:
OpenGL;
computerapplication;
picking
1绪论
目前许多优秀的图形工具能为我们绘制惟妙惟肖的虚拟现实场景,在面对这些场景时候我们除了欣赏之外更多的是希望能与之互动,做为编程人员可以使用代码轻松的重新构造场景,但对于终端用户而言,他们也希望自己也能对造场景进行一些操作,如添加,删除等等。
对于这些操作而言,首先我们要做的是能让用户使用鼠标来选择他所希望操作的对象,这就是本文要讨论的一个重点:
拾取,这是一种在许多交互性程序中有基础地位的操作,是对屏幕中对象进行定位,并确定所选择的是哪个物体。
然而该操作给我们提出了一些难题,首先,需要对对象进行届定。
其次,必须对“拾取目标”进行定义。
这就需要终端用户确定单击的位置是构成对象的图元上,还是对象附近的位置以及考虑如果选取点落在两个以上物体交集部分如何处理等等问题,本文利用了OpenGL中的选择模式进行有效的对象判别和拾取。
1.1课题的目的和意义
图形对象的拾取是计算机图形处理系统中一个重要的功能,很多图形系统需要用户通过输入设备与系统交互,如移动、旋转某个物体,或查询某个物体的状态信息,需要通过拾取来确定景中的操作对象。
快速可靠的拾取被广泛地运用于各种系统中,如实时图形系统、虚拟现实、游戏和CAD系统等方面,拾取操作己成为这些系统的重要部分,它在计算机建模软件尤其重要,能够通过拾取操作对模型进行局部修改和编辑,提高建模系统的灵活性和适用性。
随着计算机软硬件的快速发展,人们对实时系统的交互的实时性要求也越发苛刻,而且三维场景复杂度也日益提高,这就要求系统提供快速的拾取操作。
因此,高效的拾取算法能够决定拾取操作快与慢的关键所在,从而开发高效的拾取算法已成为当今一个的课题研究。
1.2拾取技术国内外研究
随着网络科技越来越发达,拾取操作也越来越方便了,有的只要鼠标点点就可以。
而拾取操作的关键是拾取算法。
到目前为止,拾取算法大致上可以分三种。
第一种是基于射线求交的拾取技术,1992年,MarkSegul,CarlKorobkin,RolfvanWidenfelt等人首次采用了基于射线求交的拾取技术原理实现了对衣服的拾取[1];
1998年MichaelDeering,StepGraphicsLibrary)是个定义了一个跨编程语言、跨平台的编程软件接口的规格,该接口包括了大约250个不同的函数(其中核心OpenGL大约包括200个函数,另外还有50个左右位于OpenGL工具函数库),可以用这些函数指定物体和操作,创建交互性三维应用程序。
它是个专业的图形程序接口,是一个功能强大,调用方便的底层图形库,Opengl用于三维图象(二维的亦可)。
OpenGL的设计目标就是作为一种流线型的、独立于硬件的接口,可以在许多不同的硬件平台上实现。
为了实现这个目标,OpenGL并未包含用于执行窗口任务或者获取用户输入之类的函数。
反之,必须通过窗口系统控制所使用的特定硬件。
类似地,OpenGL并没有提供用于描述三维物体模型的高层函数。
这类函数可能允许你指定相对较为复杂的形状,例如汽车、身体的某个部位、飞机或分子等。
在OpenGL中,必须根据少数几个基本几何图元(geometricprimitive)(如点、直线和多边形)来创建你所需要的模型。
当然,我们可以在OpenGL上创建能够提供这些特性的高级函数库。
OpenGL实用函数库(GLU)提供了许多建模特性,例如二次曲面以及NURBS曲线和表面。
GLU是所有OpenGL实现的一个标准组成部分。
1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了WindowsNT版本的OpenGL,从而使一些原来必须在高档图形工作站上运行的大型3D图形处理软件也可以在微机上运用。
1995年OpenGL的1.1版本面市,该版本较1.0性能提高许多,并加入了一些新的功能。
1997年,Windows95下3D游戏的大量涌现,游戏开发公司迫切需要一个功能强大、兼容性好的3D图形接口,而当时微软公司自己的3D图形接口DirectX3.0功能却是很糟糕。
因而以制作《雷神之锤》等经典3D射击游戏而著名的id公司同其它一些游戏开发公司一同强烈要求微软在Windows95中加入对OpenGL的支持。
微软公司最终在Windows95的OSR2版和后来的Windows版本中加入了对OpenGL的支持。
这样,不但许多支持OpenGL的电脑3D游戏得到广泛应用,而且许多在3D图形设计软件也可以运用支持OpenGL标准的3D加速卡,大大提高其3D图形的处理速度。
2003年的7月28日,SGI和ARB公布了OpenGL1.5。
OpenGL1.5中包括OpenGLARB的正式扩展规格绘制语言“OpenGLShadingLanguage”。
2004年8月,OpenGL2.0版本发布OpenGL2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3Dlabs。
2008年8月初Khronos工作组在Siggraph2008大会上宣布了OpenGL3.0图形接口规范,GLSL1.30shader语言和其他新增功能将再次未来开放3D接口发展指明方向。
2009年3月又公布了升级版新规范OpenGL3.1,也是这套跨平台免费API有史以来的第九次更新。
2009年8月Khronos小组发布了OpenGL3.2,这是一年以来OpenGL进行的第三次重要升级。
Khronos旗下的OpenGLARB(ArchitectureReviewBoard)工作组推出了GLSL1.5OpenGLShadingLanguage(OpenGL着色语言)的升级版,以及在OpenGL3.2框架下推出了两个新功能,可以让开发者在开发新程序时能够在使用流水线内核特性或兼容性特性之间做出选择,其中兼容性特性会提供与旧版OpenGL之间的兼容性。
2.2OpenGL渲染管线过程
管线这个术语用于描述一种过程,它涉及两个或更多个独特的阶段或步骤。
当应用程序进行OpenGLAPI调用时,这些命令被放置在一个命令缓冲区中。
这个缓冲区最终填满了命令、顶点数据、纹理数据等。
当缓冲区被刷新时,命令和数据就被传递给管线的下一个阶段。
通常,顶点数据首先进行转换和光照。
在转换阶段,描述物体几何形状的点被重新计算,以确定这个物体的位置和方向。
同时所进行的光照计算将确定每个顶点应该具有的颜色亮度。
当这个阶段完成之后,数据就被输入到管线的光栅化部分。
光栅阶段根据几何图形、颜色和纹理数据实际创建彩色图像。
然后,图像被放入帧缓冲区中。
帧缓冲区就是图形显示设备的内存,这意味着这幅图像将会在屏幕上显示。
图1显示了OpenGL工作流程图顺序,虽然并没有严格规定OpenGL必须采用这样的实现,但它却提供了一个可靠的指南方向,可以预测OpenGL将以什么样的顺序来执行这些操作。
图1Opengl工作渲染流程图
OpenGL渲染管线的操作过程主要包括以下几部分:
1)顶点变换
2)图元组装
3)图元处理
4)片元处理
5)光栅化操作
2.2.1顶点变换
这个阶段主要是对输入的顶点进行逐个处理,这些顶点都包括很多属性(如位置、颜色、法线和纹理坐标等),经过处理后,输出是经过变换后的顶点属性及关联信息。
主要过程:
顶点变换(几何变换和投影变换)、光照计算、纹理坐标变换和生成。
2.2.2图元组装
这个阶段主要是按照输入的变换后的顶点属性和关联信息,组装形成图元。
2.2.3图元处理
这个阶段主要是对输入的图元进行处理,输出片元(帧缓存中更新象素属性的数据)信息,该片元信息是对顶点变换阶段得出的属性进行插值处理得到的。
视景裁剪、背面剔除。
2.2.4片元处理
这个阶段的输入为经过插值计算后的最终片元信息,经过处理后,输出信息为片元的深度和颜色值。
纹理、雾化、颜色汇总(包括纹理颜色,光照颜色,主颜色等)。
2.2.5光栅化操作
这个阶段的输入为像素位置和片元的深度、颜色值等信息,经过一系列的测试(剪切测试、Alpha测试、模板测试和深度测试)后形成像素的颜色。
剪切测试、Alpha测试、模板测试和深度测试、写入帧缓存。
2.3MFC概述
MFC(MicrosoftFoundationClassLibrary)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
MicrosoftVisualC++提供了相应的工具来完成这个工作:
AppWizard可以用来生成初步的框架文件(代码和资源等);
资源编辑器用于帮助直观地设计用户接口;
ClassWizard用来协助添加代码到框架文件;
最后,编译,则通过类库实现了应用程序特定的逻辑。
MFC是在1992年随微软的MicrosoftCC++7.0编译器发布的,用于面向16位Windows的软件开发。
起初,MFC是作为一个应用程序框架开发的,所以定名为ApplicationFrameworkX(AFX)。
Borland几乎同时发布了面向TurboC编译器的OWL,并且在一开始比MFC更具有市场占有率,但是在Borland发布了一个不向下兼容的应用程序框架之后,它丧失了很多市场份额;
在Borland从微软获得发布MFC的授权之后它的市场份额进一步减少。
Borland最终用VisualComponentLibrary来作为OWL的后继者。
随着VisualBasic和VisualStudio.NET的发布,曾经一度被微软重点推荐的MFC被VisualBasic、C#、WindowsForms抢走了不少市场份额,但是MFC继续在非托管软件开发中占据重要地位。
在托管开发方面,MFC中也包括对WindowsForms和托管非托管互操作的封装。
微软在WindowsVista和Windows7发布之后在MFC中增加了对新的WindowsAPI支持。
很多商用类库在MFC的基础上进一步实现了皮肤、渐变风格、多顶层窗口程序、属性列表等较受欢迎的功能;
同时,在C++在线社区中,很大一部分开放的源代码也是基于MFC的。
VC++产品版本与MFC版本如下:
表格1VC++产品版本与MFC版本
2.4MFC特点
2.4.1封装
构成MFC框架的是MFC类库。
MFC类库是C++类库。
这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下:
(1)对Win32应用程序编程接口的封装;
(2)对应用程序概念的封装;
(3)对COMOLE特性的封装;
(4)对ODBC功能的封装。
2.4.2继承
首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。
这些类中,最重要的类是CObject和CCmdTarget。
CObject是MFC的根类,绝大多数MFC类是其派生的,包括CCmdTarget。
CObject实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。
所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。
CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。
MFC中,任何可以处理消息的类都从CCmdTarget派生。
针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。
这些对象包括以下种类:
窗口对象,基类是CWnd;
应用程序对象,基类是CwinThread;
文档对象,基类是Cdocument,等等。
2.4.3虚拟函数和动态约束
MFC以“C++”为基础,自然支持虚拟函数和动态约束。
但是作为一个编程框架,有一个问题必须解决:
如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。
例如,CWnd封装Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。
如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。
于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。
2.5应用程序的构成
图2解释了该应用程序的结构与对象,箭头表示信息流向。
图2应用程序的结构
从CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd类对应地派生出CTApp、CTDoc、CTView、CMainFrame、CChildFrame五个类,这五个类的实例分别是应用程序对象、文档对象、视对象、主框架窗口对象和文档边框窗口对象。
主框架窗口包含了视窗口、工具条和状态栏。
对这些类或者对象解释如下:
(1)应用程序(CWinApp)
应用程序类派生于CWinApp。
基于框架的应用程序必须有且只有一个应用程序对象,它负责应用程序的初始化、运行和结束。
(2)边框窗口(CMDIFrameWnd)
如果是SDI应用程序,从CFrameWnd类派生边框窗口类,边框窗口的客户子窗口(MDIClient)直接包含视窗口;
如果是MDI应用程序,从CMDIFrameWnd类派生边框窗口类,边框窗口的客户子窗口(MDIClient)直接包含文档边框窗口。
如果要支持工具条、状态栏,则派生的边框窗口类还要添加CToolBar和CStatusBar类型的成员变量,以及在一个OnCreate消息处理函数中初始化这两个控制窗口。
边框窗口用来管理文档边框窗口、视窗口、工具条、菜单、加速键等,协调半模式状态(如上下文的帮助(SHIFT+F1模式)和打印预览)。
(3)文档边框窗口(CMDIChildWnd)
文档边框窗口类从CMDIChildWnd类派生,MDI应用程序使用文档边框窗口来包含视窗口。
(4)文档(CDocument)
文档类从CDocument类派生,用来管理数据,数据的变化、存取都是通过文档实现的。
视窗口通过文档对象来访问和更新数据。
(5)视(CView)
视类从CView或它的派生类派生。
视和文档联系在一起,在文档和用户之间起中介作用,即视在屏幕上显示文档的内容,并把用户输入转换成对文档的操作。
用图的形式可直观地表示所涉及的MFC类的继承或者派生关系,如下:
图3MFC的层次
2.6基于OpenGL+MFC的三维模拟的编程环境配置
用MFC调用OpenGL函数来进行三维模拟的编程环境配置:
(一)创建MFC项目
(1)创建项目文件:
选择FileNew菜单选项,建立一个名为MyTest的单文档(SDI)应用程序;
(二)配置OpenGL开发环境
(1)将91.—powoftwo之别,屏幕分辨率一般不为powoftwo,因此可以考虑采用渲染到表面(RRS),用Direct3D9中的CreateRenderTarget()创建一个RenderTarget型表面,CPU上的主要流程如下:
鼠标点击拾取事件触发下面流程:
(1)建立一张新的临时纹理;
(2)将当前设备屏幕的内容存入缓冲中,将设备的渲染对象设为该临时纹理;
(3)做好渲染前的准备,包括从fx文件中读入effect;
(4)对于每个几何对象在GPU通过Shader进行特殊渲染;
(5)还原设备信息,设备的渲染对象指向帧缓冲;
(6)获取临时纹理上拾取区域的像素;
(7)将获得的像素按定义的格式解码。
图8说明了上述整个流程。
图8GPU拾取流程
下面定义VertexShader的输出内容,定义了一个包括坐标和颜色的结构(struct)。
其中,pos用于顶点转换,color用于顶点信息存储。
StructVSResult
{
Float4pos:
POSITION;
Float4color:
TEXCOORDO
};
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Opengl 屏幕 对象 拾取 本科毕业 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)