使用opengl实现三维坐标的拣选

使用opengl实现三维坐标的拣选

ID:26166192

大小:81.29 KB

页数:7页

时间:2018-11-25

使用opengl实现三维坐标的拣选_第1页
使用opengl实现三维坐标的拣选_第2页
使用opengl实现三维坐标的拣选_第3页
使用opengl实现三维坐标的拣选_第4页
使用opengl实现三维坐标的拣选_第5页
资源描述:

《使用opengl实现三维坐标的拣选》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、使用OpenGL实现三维坐标的鼠标拣选ImplementationofRIP(Ray-Intersection-Penetration)3DCoordinatesMouseSelectionUsingOpenGL顾露(武汉理工大学计算机系中科院智能设计与智能制造研究所湖北武汉430070)摘要(Abstract):本文提出并实现一种用于三维坐标拣选的RIP(Ray-Intersection-Penetration)方法。介绍了如何在已经渲染至窗口的三维场景中,使用鼠标或者相关设备拣选特定三维对象的方法。此方法对于正交投影或透视投影均有效,相对于OpenGL自带的选择与反馈机制,本方法无

2、论是拣选精度还是算法实现效率均高出许多,是一种比较通用的解决方案。关键词(Keywords)正交投影(Ortho-Projection)、透视投影(Perspective-Projection)世界坐标系、屏幕坐标系、三维拣选、OpenGL一、简介(Introduction)OpenGL是一种比较“纯粹”的3D图形API,一般仅用于三维图形的渲染,对于特定领域的开发者(如游戏开发者)而言,如果选择使用OpenGL进行开发,类似碰撞检测的机制就都需要自行编写了。但是由于鼠标在图形程序中的应用非常非常之广泛(例如现在已经很少有PC游戏能完全地脱离鼠标),OpenGL在图形库的基础上添加了选

3、择与反馈机制(Select&Feedback)来满足用户使用鼠标实时操作三维图形的需要。但由于种种原因,我们需要更为特殊的选择机制以满足特定需求,在这里我们提出了一种简单迅速的RIP(Ray-Intersection-Penetration)方法,可以满足绝大多数典型应用的需要。二、相关研究(RelatedWork)用过OpenGL选择与反馈机制的开发者,或多或少可能都会觉得它难以令人满意。大致表现在下面几个方面:一、编写程序比较繁琐。想要使用选择反馈机制就需要切换渲染模式,操作命名堆栈,计算拣选矩阵,检查选中记录,这些繁琐的步骤很容易出错,而且非常不便于调试,只会降低工作效率和热情。

4、二、只能做基于图元的选定。如下图(1-a),使用GL_TRIANGLES绘制了一个三角形,三个顶点分别为P1、P2和P3。若使用该机制,你将只能判断是否在三维场景中选中了这个三角形(用户点击处是否在P1、P2和P3的范围内),而无法判断用户是点击了这个三角形哪一部分(是左边的m区域内还是右边的n区域内),因为所绘制的P1、P2和P3本身构成的三角形就是一个基本图元,对于拣选机制而言是不可分的。当然,把这个三角形拆成两个三角形再分别进行测试也是一个可行的方案,可是看看图(1-b),这可怎么拆呢?还有图(1–c)呢?另外,如果n和m两个平面不共面呢?对于使用者而言,OpenGL提供的拣选机

5、制功能的确有限。三、降低了渲染效率。OpenGL中的选择和反馈是与普通渲染方式不同的一种特殊的渲染方式。我们使用时一般是先在帧缓存中渲染普通场景,然后进入选择模式重绘场景,此时帧缓存的内容并无变化。也就是说,为了选择某些物体,我们需要在一帧中使用不同的渲染方式将其渲染两遍。我们知道对对象进行渲染是比较耗时的操作,当场景中需要选择的对象多而杂的时候,采用这个机制是非常影响速度的。另外在OpenGL红宝书中介绍了一种简便易行的办法:在后缓冲中使用不同的颜色重绘所有对象,每个对象用一个单色来标示其颜色,这样画好之后我们读取鼠标所在点的颜色,就能够确定我们拣选了哪个物体。这种方法有一个缺陷,当

6、场景中需要选择的对象的数目超出一定限度时,可能会出现标识数的溢出。对于这个问题,红宝书给出的解决办法就是多次扫描。实践证明这种方法的确简便易行,但仍有不少局限性,而且做起来并不比第一种机制方便多少。限于篇幅,不再赘述。三、具体描述(RelatedWork)看过了上面两种方法,我们会发现这两种方法都不是十分的方便,而且使用者不能对其进行完全的控制,不能精确地判定鼠标定位与实际的世界空间中三维坐标的关系。那么有什么更好的办法能够更简单更精确地对其加以控制呢?实际上此处给出的解决方案十分简单,就是一个很普通也很有用的GLU函数gluUnProject()。此函数的具体用途是将一个OpenGL

7、视区内的二维点转换为与其对应的场景中的三维坐标。转换过程如下图所示(由点P在窗口中的XY坐标得到其在三维空间中的世界坐标):这个函数在glu.h中的原型定义如下:intAPIENTRYgluUnProject(GLdoublewinx,GLdoublewiny,GLdoublewinz,constGLdoublemodelMatrix[16],constGLdoubleprojMatrix[16],constGLintviewport[4],G

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。