b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

蓝宝书opengl_opengl编程指南 pdf_opengl超级宝典(2)

电脑杂谈  发布时间:2017-02-05 11:30:41  来源:网络整理

在使用选择模式glRenderMode(GL_SELECTION);之前,要设置选择缓冲区:

voidglSelectBuffer(GLsizeisize,GLuint*buffer);

size为缓冲区的大小,buffer为缓冲区的指针。在进入选择模式时,OpenGl会将一个指针初始化指向这个选择缓冲区,当有点击记录产生时,就往这个缓冲区中写记录。如果在填充这个选择缓冲区时溢出了,那么OpenGL并设置一个溢出标志。

选择缓冲区

在选择模式下,渲染的过程中选择缓冲区由点击记录填充。点击记录由在可视区域内有多少个被命名的物体来产生的。在默认情况下,即可视区域为整个窗口。

选择缓冲区是一组无符号的整型数组。每一个点击记录至少产生4个元素。opengl超级宝典这四个元素分别是名称栈中名称的个数,最小z值,最大z值,栈底的名称1,如果有更多继续往下添加。如下图:

OpenGL超级宝典学习笔记——选择

挑选

许多情况下我们想用鼠标去挑选某个物体。要使用选择模式实现这个功能,首先是在鼠标点击附近的范围内创建一个裁剪区域(可视区域),然后测试有哪些物体在这个可视区域内。GLU库中提供了一个函数gluPickMatrix,我们可以用这个函数创建一个用于描述新的可视区域的矩阵,然后乘以当前的投影矩阵,就可以得到我们想要的可视区域。

void gluPickMatrix(GLdouble x, GLdouble y, GLdouble width, GLdouble height, GLint viewport[4]);

x,y为窗口的坐标定义了可视区域的中心,我们可以设置为鼠标点击的位置。width 和height指定了可视区域的宽高(以窗口中的像素为单位)。viewport是视口。我们可以通过glGetIntegerv(GL_VIEWPORT, viewport);来获得。

gluPickMatrix的效果是把裁剪区域变换为单位立方体-1<= (x,y,z) <=1(或-w<=(wx,wy,wz)<=w,挑选矩阵有效的执行一次正交变换,把裁剪区域映射到单位立方体上。

由于OpenGL的坐标原点在窗口的左下角,而windows的坐标原点在窗口的左上角。

OpenGL超级宝典学习笔记——选择

所以我们调用时,要注意把Y轴的值反转一下。如下:

gluPickMatrix(xPos, viewport[3] – yPos + viewport[1], 2,2, viewport);

我们可以用glut库提供的函数,设置回调函数来处理鼠标点击事件。

glutMouseFunc(MouseCallBack);

void MouseCallBack(int key, int state, int x, int y)

{

if (key == GLUT_LEFT_BUTTON && state == GLUT_DOWN)

{

ProcessSelection(x, y);

}

}

总体的步骤:

调用glSelectBuffer设置选择缓冲区

蓝宝书opengl_opengl超级宝典_opengl编程指南 pdf

glRenderMode(GL_SELECTION)切换到选择模式。

使用glInitNames和glPushName初始化名称栈

定义用于选择的可视区域

为每个图元命名,并绘制图元。

调用glRenderMode(GL_RENDER);返回点击记录

因为只有在GL_RENDER模式下glInitNames,glPushName,glLoadName将被忽略,所以我们可以把这些函数和绘制图元的函数写在一个函数调用中。

示例代码片段:

voidRenderSphere()


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30673-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...