或者使用简单的方法避开复杂的拾取操作。.docVIP

或者使用简单的方法避开复杂的拾取操作。.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
或者使用简单的方法避开复杂的拾取操作。.doc

在我们的实验二中用到了物体的拾取,在实际的实现中,我们可以使用openGL的拾取机制来实现。或者使用简单的方法避开复杂的拾取操作。 参考网址: /s/blog_5ff6097b0100xu4i.html 使用包围盒实现拾取: 我们可以将绘制的几何体(如三角形)以结构体的形式保存下来,然后用List实现绘制。每一个几何体在屏幕窗口中都会占用一定的面积。如果我们获取鼠标点击的位置,然后把这个位置与几何体的包围盒(可以是三角形,也或者是四边形)相判断。如果与某一几何体相交,则表示击中该几何体。同时这种方法也会产生击中多个几何体的情况。 2、使用openGL的拾取机制实现击中拾取操作(推荐的方法,如果采用,对成绩有好的影响) OpenGL中采用一种比较复杂的方式实现了拾取操作,即选择模式。选择模式是一种绘制模式,它基本思想是在一次拾取操作时,系统根据拾取操作的参数(如鼠标位置)生成一个特定视景体,然后由系统重新绘制场景中的所有图元,但这些图元并不会绘制到颜色缓存中,系统跟踪有哪些图元绘制到了这个特定的视景体中,并将这些对象的标识符保存到拾取缓冲区数组中。 在OpenGL中实现拾取操作主要包括以下步骤。 1.设置拾取缓冲区 拾取时,在特定的视景体中绘制每个对象都会产生一个命中消息,命中消息将存放在一个名字堆栈中,这个名字堆栈就是拾取缓冲区。函数: void glSelectBuffer(GLsizei n, GLunint *buff); 指定了一个具有n个元素的整形数组buffer作为拾取缓冲区。对于每个命中消息,都会在拾取缓冲区数组中添加一条记录,每条记录包含了以下的信息: (1)命中发生时堆栈中的名称序号; (2)拾取图元所有顶点的最大和最小窗口z坐标。这两个值的范围都位于[0,1]内,他们都乘以232-1,然后四舍五入为最接近的无符号整数。 (3)命中发生时堆栈中的内容,最下面的名称排在最前面。 2.进入选择模式 在定义了拾取缓冲区后,需要激活选择模式。选择模式的指定采用函数: GLint glRenderMode(GLenum mode); 其中,参数mode值可以为GL_RENDER(默认值)、GL_SELECT或GL_FEEDBACK,分别指定应用程序处于渲染模式、选择模式和反馈模式。应用程序一直处于当前模式下,直到调用本函数改变为其他模式为止。 3.名字堆栈操作 在选择模式下,需要对名字堆栈进行一系列操作,包括初始化、压栈、弹栈以及栈顶元素操作等。 void glInitNames();//初始化名字堆栈,其初始状态为空 void glPushName(GLuint name);//将一个名字压入堆栈,其中name是标识图元的一个无符号整数值 void glLoad Name(GLuint name);//将名字堆栈的栈顶元素替换为name void glPopName();//将栈顶元素弹出 4.设置合适的变换过程 拾取操作可以通过矩形拾取窗口来实现,我们可以用下面的函数调用: gluPickMatrix(xPick, yPick, widthPick, heightPick, *vp); 其中参数xPick和yPick指定相对于显示区域左下角的拾取窗口中心的双精度浮点屏幕坐标值。当使用鼠标进行选择操作时,xPick和yPick由鼠标位置确定,但要注意y坐标的反转。参数widthPick和heightPick指定拾取窗口的双精度浮点宽高值。参数vp指定了一个包含当前显示区域的坐标位置和尺寸等参数的整型数组,该参数可以通过函数glGetIntegerv来获得。这个函数可以设置一个用于拾取操作的观察空间。 5.为每个图元分配名字并绘制 为了标识图元,在图元绘制过程中需要用一个整型值指定图元的名称,并在选择模式下,将这个名字压入到名字堆栈中。为了节省名字堆栈的空间,应该在图元绘制完成后,将其名字从堆栈中弹出。 6.切换回渲染模式 在选择模式下,所有的图元绘制完成后,应该再次调用函数glRenderMode选择渲染模式,在帧缓冲存储器中绘制图元,并返回被选中图元的个数。 7.分析选择缓冲区中的数据 拾取操作完成之后,可以根据选择缓冲区中的内容进行分析,以确定拾取的图元。 程序3-3 OpenGL实现的拾取操作的例子 #include gl/glut.h #includestdio.h const GLint pickSize = 32; int winWidth = 400,

文档评论(0)

docinpfd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5212202040000002

1亿VIP精品文档

相关文档