或者使用简单的方法避开复杂的拾取操作_第1页
或者使用简单的方法避开复杂的拾取操作_第2页
或者使用简单的方法避开复杂的拾取操作_第3页
或者使用简单的方法避开复杂的拾取操作_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、在我们的实验二中用到了物体的拾取,在实际的实现中,我们可以使用openGL的拾取机制来实现。或者使用简单的方法避开复杂的拾取操作。参考网址:1、 使用包围盒实现拾取:我们可以将绘制的几何体(如三角形)以结构体的形式保存下来,然后用List实现绘制。每一个几何体在屏幕窗口中都会占用一定的面积。如果我们获取鼠标点击的位置,然后把这个位置与几何体的包围盒(可以是三角形,也或者是四边形)相判断。如果与某一几何体相交,则表示击中该几何体。同时这种方法也会产生击中多个几何体的情况。2、使用openGL的拾取机制实现击中拾取操作(推荐的方法,如果采用,对成绩有好的影响)OpenGL中采用一种比较复杂的方式实

2、现了拾取操作,即选择模式。选择模式是一种绘制模式,它基本思想是在一次拾取操作时,系统根据拾取操作的参数(如鼠标位置)生成一个特定视景体,然后由系统重新绘制场景中的所有图元,但这些图元并不会绘制到颜色缓存中,系统跟踪有哪些图元绘制到了这个特定的视景体中,并将这些对象的标识符保存到拾取缓冲区数组中。 在OpenGL中实现拾取操作主要包括以下步骤。 1设置拾取缓冲区 拾取时,在特定的视景体中绘制每个对象都会产生一个命中消息,命中消息将存放在一个名字堆栈中,这个名字堆栈就是拾取缓冲区。函数: void glSelectBuffer(GLsizei n, GLunint *buff);指定了一个具有n个

3、元素的整形数组buffer作为拾取缓冲区。对于每个命中消息,都会在拾取缓冲区数组中添加一条记录,每条记录包含了以下的信息: (1)命中发生时堆栈中的名称序号; (2)拾取图元所有顶点的最大和最小窗口z坐标。这两个值的范围都位于0,1内,他们都乘以232-1,然后四舍五入为最接近的无符号整数。 (3)命中发生时堆栈中的内容,最下面的名称排在最前面。 2进入选择模式 在定义了拾取缓冲区后,需要激活选择模式。选择模式的指定采用函数: GLint glRenderMode(GLenum mode);其中,参数mode值可以为GL_RENDER(默认值)、GL_SELECT或GL_FEEDBACK,分别

4、指定应用程序处于渲染模式、选择模式和反馈模式。应用程序一直处于当前模式下,直到调用本函数改变为其他模式为止。 3名字堆栈操作 在选择模式下,需要对名字堆栈进行一系列操作,包括初始化、压栈、弹栈以及栈顶元素操作等。 void glInitNames();/初始化名字堆栈,其初始状态为空 void glPushName(GLuint name);/将一个名字压入堆栈,其中name是标识图元的一个无符号整数值 void glLoad Name(GLuint name);/将名字堆栈的栈顶元素替换为name void glPopName();/将栈顶元素弹出 4设置合适的变换过程 拾取操作可以通过矩形

5、拾取窗口来实现,我们可以用下面的函数调用: gluPickMatrix(xPick, yPick, widthPick, heightPick, *vp);其中参数xPick和yPick指定相对于显示区域左下角的拾取窗口中心的双精度浮点屏幕坐标值。当使用鼠标进行选择操作时,xPick和yPick由鼠标位置确定,但要注意y坐标的反转。参数widthPick和heightPick指定拾取窗口的双精度浮点宽高值。参数vp指定了一个包含当前显示区域的坐标位置和尺寸等参数的整型数组,该参数可以通过函数glGetIntegerv来获得。这个函数可以设置一个用于拾取操作的观察空间。 5为每个图元分配名字并绘

6、制 为了标识图元,在图元绘制过程中需要用一个整型值指定图元的名称,并在选择模式下,将这个名字压入到名字堆栈中。为了节省名字堆栈的空间,应该在图元绘制完成后,将其名字从堆栈中弹出。 6切换回渲染模式 在选择模式下,所有的图元绘制完成后,应该再次调用函数glRenderMode选择渲染模式,在帧缓冲存储器中绘制图元,并返回被选中图元的个数。 7分析选择缓冲区中的数据 拾取操作完成之后,可以根据选择缓冲区中的内容进行分析,以确定拾取的图元。程序3-3 OpenGL实现的拾取操作的例子#include <gl/glut.h>#include<stdio.h>const GLin

7、t pickSize = 32;int winWidth = 400, winHeight = 300;void Initial(void)glClearColor(1.0f, 1.0f, 1.0f, 1.0f); void DrawRect(GLenum mode)if(mode = GL_SELECT) glPushName(1); /压入堆栈glColor3f(1.0f,0.0f,0.0f);glRectf(60.0f,50.0f,150.0f,150.0f); if(mode = GL_SELECT) glPushName(2); /压入堆栈glColor3f(0.0f,1.0f,0.

8、0f);glRectf(230.0f,50.0f,330.0f,150.0f);if(mode = GL_SELECT) glPushName(3); /压入堆栈glColor3f(0.0f,0.0f,1.0f);glRectf(140.0f,140.0f,240.0f,240.0f);void ProcessPicks(GLint nPicks, GLuint pickBuffer)GLint i;GLuint name, *ptr;printf("选中的数目为%d个n",nPicks);ptr=pickBuffer;for(i=0;i<nPicks; i+)nam

9、e=*ptr; /选中图元在堆栈中的位置ptr+=3; /跳过名字和深度信息ptr+=name-1; /根据位置信息获得选中的图元名字if(*ptr=1) printf("你选择了红色图元n");if(*ptr=2) printf("你选择了绿色图元n");if(*ptr=3) printf("你选择了蓝色图元n");ptr+;printf("nn");void ChangeSize(int w, int h)winWidth = w;winHeight = h;glViewport(0, 0, w, h);(GL

10、_PROJECTION); glLoadIdentity();gluOrtho2D(0.0,winWidth,0.0,winHeight);void Display(void)glClear(GL_COLOR_BUFFER_BIT);DrawRect(GL_RENDER);glFlush();void MousePlot(GLint button, GLint action, GLint xMouse, GLint yMouse)GLuint pickBufferpickSize;GLint nPicks, vp4;if(button = GLUT_LEFT_BUTTON &&

11、 action = GLUT_DOWN)glSelectBuffer(pickSize,pickBuffer); /设置选择缓冲区glRenderMode(GL_SELECT); /激活选择模式glInitNames(); /初始化名字堆栈glMatrixMode(GL_PROJECTION);glPushMatrix();glLoadIdentity();glGetIntegerv(GL_VIEWPORT, vp);/定义一个10×10的选择区域gluPickMatrix(GLdouble(xMouse), GLdouble(vp3-yMouse),10.0,10.0,vp);gl

12、uOrtho2D(0.0,winWidth,0.0,winHeight);DrawRect(GL_SELECT);/恢复投影变换glMatrixMode(GL_PROJECTION);glPopMatrix();glFlush();/获得选择集并输出nPicks = glRenderMode(GL_RENDER);ProcessPicks(nPicks, pickBuffer);glutPostRedisplay();int main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(40

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论