---------作者 熊斌
OpenGL中的交互功能中最重要的一个是拾取(或者叫选择),但是我们经常会碰到开启了选择模式,但是确在屏幕上选不到物体,或者是点屏幕上任何地方都有物体被选中的情况....
这是为什么呢?
看看使用选择模式的过程是怎么样的:
1.在绘图函数中给图元命名
2.在鼠标响应中调用你的选择处理函数
3. 在处理函数中设置选择缓冲区,
4.###### 最重要的地方 #########
1) 调用矩阵操作函数,切换到投影矩阵模式,然后将其压栈,并置为单位矩阵
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
2) 生成你的拾取矩阵
glGetIntegerv(GL_VIEWPORT, viewport);
gluPickMatrix(point.x, viewport[3] - point.y, 2,2, viewport);
要注意上面的函数的操作对象是投影矩阵, 所以调用它以后必须紧跟着下面的函数 设置与渲染模式下相同的透视投影矩阵,中间千万不要再干扰投影矩阵了,否则你就永远别想得到正确的选取了
3) 设置与渲染模式下相同的透视投影矩阵
gluPerspective(m_dFovy, (double)viewport[2]/(double)viewport[3],NEARPLANE, FARPLANE);
到此位置要进行的投影矩阵的准备工作就完成了
5. 切换渲染模式 到SELECT模式
glRenderMode(GL_SELECT);
6.渲染并搜集点击
RenderScene();
hits = glRenderMode(GL_RENDER);
根据上面的过程可以看出,要正确的使用选择模式,关键在于设置正确的投影矩阵, gluPickMatrix ,gluPerspective 两个函数所设置的投影矩阵的值不能被破坏,否则你就无法得到正确的结果了.
一般情况下,如果出现选择异常,则需要检查投影和模型视图矩阵的超作,比如PushMatrix后有没有PopMatrix, 是不是
对这些矩阵进行了不正确的改动.
以上为本人实践经验,如果有错,欢迎指正.
帮助俺点俺博客中左边的图图咯........
不要看了就跑(太自私了吧)......