三维模型的拾取方法研究与实现.docx
- 文档编号:15744847
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:40
- 大小:1.20MB
三维模型的拾取方法研究与实现.docx
《三维模型的拾取方法研究与实现.docx》由会员分享,可在线阅读,更多相关《三维模型的拾取方法研究与实现.docx(40页珍藏版)》请在冰点文库上搜索。
三维模型的拾取方法研究与实现
毕业设计〔论文〕
题目三维模型拾取算法的
研究与实现
专业计算机科学与技术
班级
学生zzy
指导教师nxj
2021年
摘要
在计算机图形学中,三维模型的拾取技术是其中的一个比拟重要的分支,在许许多多的情景下,用户所使用的软件或系统一方面要有着优秀的图形化界面,另一方面要允许用户能够通过一些输入设备(比方是键盘、鼠标)来实现控制(选中、平移和旋转等),而这些操作实现的根底都要用到拾取技术。
本文首先介绍了射线拾取法、基于DEM的包围盒策略,阐述了其实现的根本原理,并进展了比照,分析了各自方法的优缺点。
其次,着重对射线拾取法进展了介绍,并使用OpenGL函数库与VC实现了三维模型的旋转、平移、放大缩小及点的拾取功能。
在此根底上,又对基于DEM的包围盒策略〔它是对射线拾取方法的一种改良〕进展了探讨。
最后,对实验结果进展了分析,并对三维模型的拾取技术进展了展望。
通过实验可以发现,利用OpenGL函数库与VC实现的三维模型射线拾取功能,效果明显。
射线拾取方法与包围盒策略对运行速度、拾取精度、渲染效率和交互感有着比拟明显的效果。
关键字:
三维模型,OpenGL,射线拾取,包围盒策略
ABSTRACT
Inputergraphics,3dmodelofthepickingtechniqueisoneoftheimportantbranch,inmanysituations,softwareusedbytheuserorthesystemtohaveexcellentgraphicalinterface,ontheotherhandtoallowuserstobeabletopasssomeinputdevices(suchaskeyboard,mouse)torealizecontrol(selected,translationandrotation,etc.).thebasisoftheseoperationsareusedtopickuptechnology.
Atfirst,thispaperprovidesanintroductiontothefieldofputergraphicsincludingraypickupmethod,theboundingboxstrategybasedonDEMandredrawstrategiesbasedongpu'sbasicintroduction,thispaperexpoundsthebasicprincipleofitsrealization,andsomeparison,analyzestheadvantagesanddisadvantagesofeachmethod.Second,focusonraypickmethodareintroduced,andusetheOpenGLlibrarywithVCtoachievethethree-dimensionalmodelofrotation,translation,zoominandpickupfunction.Onthisbasis,andtheboundingboxstrategybasedonDEM(whichisanimprovementtothemethodofraypick)arediscussedinthispaper.Finally,theexperimentalresultsareanalyzed,andthe3dmodelofpickingtechnologyisprospected.
Canbefoundthroughtheexperiment,usingtheOpenGLlibraryandVCrealizethe3dmodelofraypickupfunction,effectisobvious.Raypickupmethodandtheboundingboxstrategyofrunningspeed,precision,renderingefficiencyandpickupmutualinductancehastheobviouseffect.
Keywords:
3dmodel,OpenGL,raypick,boundingboxstrategy
第一章绪论
1.1选题背景及研究意义
1.1.1选题背景
在市场上目前有众多的优秀图形工具可以为我们的软件或系统制作出各种的逼真的虚拟现实的场景〔比方大型游戏〕,我们在使用这些软件时候除了赞叹逼真的虚拟场景之外,我们更多的是渴望能与之进展互动,对于用户而言,用户希望自己也能对造场景有着掌控感,比方进展一些行为操作,如选中,复制等等。
而实现这些操作的前提就是要求我们能让用户使用鼠标或键盘来拾取他所希望操作的物体。
在本文中,要讨论的一个重点就是:
拾取,许多交互性软件程序都离不开这种最根本的操作,首先是对屏幕中物体进展选择,并且确定选择的是哪个对象。
其次,必须对“拾取目标〞进展定义。
这些也带来了一系列问题,本文研究的是OpenGL如何进展三维模型的拾取。
1.1.2研究意义
最近几年,3D技术、游戏制作和VR成为计算机领域非常重要的研究方向,它们都是真实三维模型为技术核心的,于是各种三维图形开发软件也不断更替,其中比拟好的有unity3d,OpenGL,Direct3D,OpenCV等。
与此同时,为了让用户通过计算机有更好的感知现实世界的用户体验,三维拾取算法的研究及实现也被越来越多的学着所研究和关注。
本课题的研究就是为了探索利用OpenGL进展三维模型的拾取的优势与缺乏。
并通过比照不同拾取的方法对处理结果进展综合全面的分析,最后进一步地提出改良意见。
1.2在国内外的研究状况和开展趋势
1.2.1国内外的研究状况
随着三维技术在计算机科学与技术领域得到不断的开展和不断的深入,目前,三维技术在众多的领域得到快速的开展与研究,目前国内外在三围技术的研究中,依次通过模型视点变换,投影变换和视口变换才能实现现实世界中的物体要影射到屏幕窗口上,而三维模型的拾取技术,失去技术本质是在二维的屏幕上,对三维模型中的物体进展拾取操作的一种技术。
目前国内外研究中,比拟成型的拾取算法主要有射线拾取技术、包围盒技术和基于GPU的重绘拾取方法。
1.2.1.1国外的研究状况
1992年,MarkSegul,CarlKorobkin,RolfvanWidenfelt等人首次采用了基于射线求交的拾取技术原理实现了对衣服的拾取;
1998年MichaelDeering,StephanieWinnerandBicSchediwy等也采用了基于射线求交的拾取技术而成功做到了对人物的拾取;
第二种是基于GPU的重绘式拾取技术,这种方法对硬件的依赖性大,不过拾取速度快。
1997年,Masaaki.Oka,KyoyaTsutsui,AkioOhba等人第一次采用了基于GPU的重绘式拾取技术在房子中拾取到了房子的主人与小孩子[6];
第三种是OpenGL内部含有的一种拾取的机制。
在一九九二年的七月,1.0的OpenGL版本出现,随后SGI公司和微软公司联合制作了基于WINDOWS之下的OpenGL,此次的研发成果最大的好处就是之前在图形的工作站上运作的3D的图形类软件根本上也是能够适用于微机之上。
在一九九五年1.1的版本出现,它在1.0的根底之上出现了许多的之前没有的功能,就像它的标志性功能:
拾取机制,它是拓宽OpenGL的使用领域的“功臣〞,在随后的多年来出现的各个版本,使自带的拾取机制越来越完善,操作越来越方便,应用范围越来越广泛。
1.2.1.2国内的研究状况
2005年,龚堰珏,颜敏等人采用了基于射线求交的拾取技术实现对几个简单物体的拾取;
2005年,韦宇炜用基于射线求交的拾取技术实现对游戏中各类的拾取,如对技能的释放,对地上物品的捡起来,对别的玩家人物属性的查看等等;2006年,姚继权,李晓豁等人也采用了基于射线求交拾取技术而成功地做到了对3D网游游戏中的各种各样的拾取;
2006年,X力强,周明全等多人采用基于GPU的重绘式拾取技术,在大规模室外地形中拾取到了地面某个区域。
1.2.2开展趋势
目前的三维拾取技术,是通过将现实世界中的三维模型要依次经过模型视点变换、投影变换与视口变换才影射到屏幕窗口上的,而对物体的拾取操作。
在未来的一段时间内,将在现有的拾取技术上通过数学建模解决光标投影模型的运动速率和鼠标的移动速率不匹配与光标的射线与参考平面的交角为0出现没有交点和无数交点的问题。
随着VR等技术的开展,三维模型的拾取技术和算法研究急需得到开展,在未来,拾取算法的研究与实现将会让更多的学者进展关注。
1.3拾取技术简介
拾取算法可以分成两种:
一类是基于三维空间的射线拾取算法,代表算法就是射线求交拾取技术;另一类是基于图像空间的拾取算法,例如:
基于GPU的重绘式拾取技术。
1.3.1射线拾取算法
基于射线求交拾取技术的根本原理是:
将屏幕坐标并转换成图形软件或系统的视口坐标,依据不一样图形API实现给该点加上适当的深度值再推出拾取点的世界空间坐标,再将焦点坐标变换为屏幕坐标,过相机位置点向鼠标选中点作一条射线在三维空间中对射线和物体进展求交,被选中的实体就是离相机位置点最近的实体。
1.3.2基于GPU的重绘式拾取技术
重绘式拾取法是在OpenGL绘图模式下,通过2次绘图来拾取并显示物体,这种方法比拟依赖硬件。
1.3.3包围盒策略
这种算法是射线拾取方法的一种改良方法。
它的原理是用体积稍大且特征简单的几何体〔称为包围盒〕来近似地代替复杂的几何对象。
1.3.4各种拾取技术比拟
表1-1各种拾取技术比拟
原理
优点
局限性
OpenGL的选择机制
这种算法先将场景放入进帧进展缓冲,再之后进入选择模式重新绘制这个场景。
在退出选择模式时OpenGL会返回某个图元清单,这个图元可能被视见体分割。
每个被视见体图元引出一条选择并命中。
准确的说,图元清单就是一个相关的数据-命中记录(hitrecord)-对应名字栈(namestack)的当前内容和取整数值的名字的数组。
在选择模式下传递图元绘制命令时向名字栈中参加名字就可以建立起名字栈。
然后当名字清单被返回后,就可以确定屏幕上的哪个图元可能被使用者拾取了。
此算法简单
因为堆栈容量有限制的,这种算法不能处理大场景中的拾取。
本文不做深入研究
射线拾取方法
将获取屏幕坐标转换成图形系统的视点坐标,再然后依据不同图形接口API,实现给该点加上相当的深度值吗,OpenGL标准的深度值介于0-1,反算推出该拾取点的世界空间坐标,然后引出引一条射线,在三维空间中进展求交。
当拾取对象为点或者是简单的物体较为迅速,效率高效。
〔1〕因为这种算法假设所有的图形变换矩阵必须是可逆的,它是可以经过一系列的逆运算得到图像空间某一个点的三维坐标,但在实际上,这些矩阵不全是可逆的;
〔2〕当拾取对象为复杂的物体时,此时,判断物体是否在所选择体内部的算法极其的复杂增加了难度。
从而使整个运算过程耗时大,而且这么复杂的算法也会给整个系统的实现带来很大的难点。
1.4本文研究的主要内容
〔1〕结合资料对本课题研究的意义以及国内外研究现状进展陈述;
〔2〕采用包围盒算法和射线拾取算法相结合的方法来对三维模型进展相关的操作。
〔3〕采用VC++和OpenGL函数库进展编程,实现了友好的程序界面和友好性的交互操作。
〔4〕比拟各种拾取技术的实现方法和其原理,并分析优缺点和适用场景;
〔5〕通过射线拾取法和基于包围盒策略实现了简单的一些拾取操作〔点的拾取〕;
〔6〕总结本论文,并结合论文对三维模型的拾取给出了展望。
第二章三维模型数据与OpenGL建模根底及配置
2.1三维模型数据的格式
当我们需要获取一个文件的类型,第一步必须要知道它是怎么存储的,他的头部包含了什么东西。
例如,Ply三维模型文件的头部先是类型、版本信息,再然后是ment,这个也可以不存在,最后是property的声名和element。
再比方3ds是按照chunk存的,3ds每个块都有独属于自己的标识。
这些声明和标识为我们提供了该文件的outline,有多少个vertex,多少个face等这些信息可以方便程序编写循环。
不管是3ds还是obj或者是ply,这里都存在非标准和标准这样的一种说法。
标准的网格面片也就是输出的时候对存储是比拟讲究的和诸如delaunay三角化有关,在一个三角形中三个顶点的顺序是按照一定时针转向和法向量对应的,或者说是按固定的序号叉乘计算出的法向量。
在本论文中采用的是PLY2格式的三维模型数据,在这里,我们将对obj、3ds、ply三维数据格式进展简单的介绍。
2.1.1obj格式的三维数据
OBJ文件是由WAVEFRONT所研发的一种文件的格式,它是在工作站的根底之上进展的软件动画以及3D建模的软件。
它相比拟于之前的老版本,它可以在自由形态曲线、划线以及多边形等的情况下使用。
它根本上是分为两类:
〔1〕是Alias|Wavefront公司推出的OBJ模型文件。
〔2〕在monObjectFileFormat格式的根底之上通过将源代码进展编译之后成型的,它比拟特殊,它是不可以直接进展的,它必须要将程序连接起来才能够执行。
它根本上是由机器代码构成,但是还是可以有其他的一些指令代码,这些特殊的指令代码可以是自己定义的也可以其它的,但是有一点,如果是自己定义的,那么就必须加一些对于自己定义的代码指令的解释的程序,随后的连接程序,见名知义,它就是将库文件与它所对应的目标代码连接到一起。
很少有人可以给出OBJ文件的具体特征的一个完整的描述,大多数人是使用Poser认识OBJ文件的。
想要得到人体建模的OBJ文件,那么就需要通过将Poser生成的需要的文件放到除poser之外的3D软件里面重新加工。
OBJ文件在3D软件模型中间的互相导入有特别大的优点,它拥有非常标准的3D模型文件的格式。
例如,如果需要把在LightWave中构建的一个三维模型,再次在Maya里面动画或者渲染,那么最好的方法就是使用导出OBJ文件。
目前绝大多数的3D软件都需要安装必要的插件才可以做到完全可以进展OBJ文件的写入以及读出。
除此之外,它还是在3D模型中比拟好的一种文件格式。
大局部的游戏类引擎都能够兼容于OBJ文件之中。
3D软件模型导出之后完全打不开有可能会发生,有的时候甚至有可能会出现互导之后模型缺少线面的状况。
所以,当前的3D软件模型导出功能都不那么完美,需要得到开展。
OBJ文件优化了存储但劣化了读写。
2.1.23ds格式的三维数据
3DS是3DMAX中的一个格式。
用于导出文件模型的时候使用。
用3DS可以导出文件模型,3DS文件的优点就是,不局限于某一软件版本,它意味着不会出现高版本制作的在低版本打不开的情景发生,这个解决了很多的麻烦。
但是如果想用低版本的文件翻开的化,那就可以选择保存为3DS文件,这样任何版本都是可以翻开的。
3DS是基于PC系统的三维动画渲染和制作软件,它是由Discreet公司开发的。
其前身是基于DOS操作系统的3DStudio系列软件。
2.2.3PLY格式的三维数据
PLY的全称为史丹佛三角形档案〔StanfordTriangleFormat〕,也可以成为多边形档案〔PolygonFileFormat〕。
它是由斯坦福大学所研发的三维模型数据格式的一种,在计算机图形学之中有许许多多的模型数据,比拟知名就是斯坦福兔子。
它不同于OBJ格式,它是电脑档案格式。
它在存储档案的内容时有两种版本。
一种是二元码〔binary〕版本,另一种是纯文字〔ASCII〕版本。
这两种版本的差异表现于:
在表示元素资讯时是否使用ASCII编码〔存储时〕。
本论文程序所使用的三维模型数据就是斯坦福兔子。
为了构建针对多边形模型同时构造较简单而且又可以满足绝大局部图形应用所需要的三维模型格式,所以开发了PLY多边形文件格式。
如前面所述,这种文件格式可以用二进制形式存储文件,亦可以用ASCII码格式进展存储文件。
正因为PLY拥有着既简单又灵活的文件格式的优点,所以它可以帮助开发人员减少重复开发工作的时间。
但是在工业生产的领域内,因为各种的原因,不断的出现新的文件格式。
但是在三维模型的领域中,PLY仍然是一种比拟重要的文件格式。
PLY格式和游戏三维引擎中常常使用到的文件格式是不同的,它是一种多边形模型数据格式。
PLY文件描述一个多边形模型对象时,经常是通过模型的定点、面等的数据描述的,这样的数据称之为Element。
PLY文件格式,相比于其它图形游戏引擎所使用的三维数据格式,是一种较为简单的数据格式。
PLY文件构造包含了:
文件头与文件数据列表。
在其中的文件头是用元素的属性、文件类型等进展描述的,再之后依次记录每一个元素的属性值。
在这里,程序选择了ply格式的三维模型数据进展三维模型数据的读入。
2.2OpenGL简介
OpenGraphicsLibrary是定义软件件接口的规格,这种接口包含了250个左右不同的函数,其中核心OpenGL函数大约包括200个函数,此外还有大约50个位于OpenGL工具函数库,用这些函数指定物体和操作可以构建交互性三维软件。
而且这些接口是跨平台的,比拟专业。
OpenGl在三维模型处理方面是比拟强大,而且调用图形库较为方便的。
OpenGL可以兼容许多不同的平台,独立于硬件的接口。
为了完成这个目标,OpenGL并未包括用获取用户输入之类的函数或者于执行窗口任务。
另一方面,必须使用规定特定硬件。
与之一样的,OpenGL没有提供用于三维物体模型的高层函数的描述。
1992年7月,SGI公司的OpenGL的1.0版本发布,之后和微软公司开发了WindowsNT版本的OpenGL。
1995年,OpenGL1.1参加了一些新的功能。
2021年8月Khronos小组对OpenGL进展的第三次重要升级并发布了OpenGL3.2。
Khronos旗下的OpenGLARB(ArchitectureReviewBoard)工作组推出了GLSL1.5OpenGLShadingLanguage(OpenGL着色语言)的升级版,并且在OpenGL3.2框架下推出了两个新的功能,这两个新的功能开发新程序时能够在兼容性特性和使用流水线内核特性之间做出选择,并且会和旧版Opengl进展兼容。
2.2.1OpenGL渲染管线过程
当应用程序调用OpenGL接口时,会将命令被放置在一个命令的缓冲区中。
所以,进过一段时间,这个缓冲区最终将会填满了顶点数据、纹理数据等信息。
然后如果缓冲区被刷新,那么命令和数据就被传送给管线的下个阶段。
大局部情况下首先进展转换和光照的是顶点数据。
在变换阶段,那些描述对象几何形状的点将会被重新计算,用来确定这个对象的方向和位置。
之后,图像再放入帧缓冲区中。
帧缓冲区其实就是图形显示设备的内存,这也意味着图像将会在屏幕上进展显示。
图2-1显示了OpenGL工作的一个流程顺序,这里虽然我们没有严格规定OpenGL一定要采用这样的实现方法,但是它却提供了一个可靠的研究方向,这个可以预测OpenGL将会以什么样的顺序来执行如下的操作。
OpenGL渲染管线的操作流程主要包含下面几个局部:
顶点变换、图元组装、图元处理、片元处理、光栅化操作
2.2.1.1顶点变换
在这个阶段主要工作是对输入的顶点进展挨个处理,这些顶点包括了许多的属性,如位置、颜色、法线和纹理坐标等,在经过处理后,经过变换后的顶点属性及关联信息是这个阶段的输出结果。
主要过程有纹理坐标变换和生成和顶点变换〔几何变换和投影变换〕以及光照计算。
2.2.1.2图元组装
这个阶段主要是对输入的变换后的顶点属性和关联信息进展组装形成图元。
2.2.1.3图元处理
在这个阶段主要做的是是对输入的图元进展处理,并且输出片元〔帧缓存中更新象素属性的数据〕信息,这个片元信息是对顶点转换阶段得出的属性,然后进展插值处理所得到的。
主要过程有反面剔除和视景裁剪。
2.2.1.4片元处理
经过插值计算后的最终片元信息作为这个阶段的输入,经过一系列处理后,片元的深度和颜色值就是这个阶段的输出信息。
主要过程有颜色汇总〔包括纹理颜色,光照颜色,主颜色等〕和纹理以及雾化。
2.2.1.5光栅化操作
像素位置和片元的深度、颜色值等信息作为这个阶段的输入,通过一系列的测试后所形成像素的颜色。
要过程有剪切测试,模板测试和深度测试,和Alpha测试以及写入帧缓存。
2.3开发环境与环境配置
2.3.1开发环境
三维模型的拾取研究及程序的实现采用的是微软公司的vc++6.0的开发平台与SGI公司的OpenGL函数库进展实现的。
并且是以c++程序进展编程的。
2.3.2环境配置
VC的安装与搭建已是众所周知的,所以在此不再进展累赘介绍。
在2.2小节中,概述了OpenGL,下面,主要介绍下VC++6.0中OpenGL的相关配置。
GLUT不是OpenGL必须要求的,但是如果安装了它,它可以给编程实现给予一定的方便,并且十分快捷,首先,我们需要下载GLUT的工具包,本论文程序所使用的GLUT工具包是从OPenGL的官方下载的,下载时请注意区分windows版本和LINUX版本,本论文所使用的windows下的GLUT工具包。
下载好压缩包后,进展如下步骤〔这里是window下安装GLUT的步骤,LINUX的本文不再讨论〕。
〔1〕解压下载好的压缩包,得到glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll这5个文件;
〔2〕上面解压的glut.h放到安装vc6.0的目录:
C:
\ProgramFiles〔X86)\MicrosoftVisualStudio\VC98\include\GL文件夹中,在这里,可能会出现include下没有GL文件的问题,如果出现这种情况,手动创立一个GL文件夹即可,再将glut.h放入其中。
〔3〕再把〔1〕中解压得到的glut.lib与glut32.lib放到安装vc6.0的目录:
C:
\ProgramFiles〔X86)\MicrosoftVisualStudio\VC98\lib文件夹中,lib是静态函数库文件夹,没有它,许多程序将会出现问题。
〔4〕同理,再把
(1)中解压得到的glut.dll和glut32.dll放到windows下system32文件夹内。
〔32位机器:
C:
\Windows\System3264位机器:
C:
\Windows\System\syswow64〕,需要注意,这一步很重要的,它是动态连接的库设置。
〔5〕接下来,创立一个工程,翻开vc6.0,创立一个Win32ConsoleApplication工程。
〔6〕这一步需要连接OpenGLlibraries,实现方法是在vc6.0中先翻开Project按钮,再点击设置按钮,然后可以看见Link按钮,点击,然后再Object/librarymodules的最前面加上opengl32.libGlut32.libG
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 三维 模型 拾取 方法 研究 实现