想把屏幕上的二维坐标转换成OpenGL下面的三维坐标
一般常用的方法是:
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX, winY, winZ;
glGetIntegerv(GL_VIEWPORT, viewport); // 得到的是最后一个设置视口的参数
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
glGetDoublev(GL_PROJECTION_MATRIX, projection);
winX = pt.x;
winY = viewport[3] - pt.y;
glReadPixels((int)winX, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
都没错。但是,经常会出现winZ值为1.0的情况
就像我所做的,功能是移动物体,如果winZ的值为1.0之后,物体就跑的没影了
用
TRACE("point:%f, %f, %f \t", winX, winY, winZ);
TRACE("pos :%f, %f, %f \n", posX, posY, posZ);
跟踪一下,居然发现如下的输出:
point:633.000000, 301.000000, 0.963236
pos :0.318562, -9.291403, 0.769923
point:633.000000, 298.000000, 1.000000
pos :39.343056, -1186.848810, -9917.619793
注意这里:当winZ的值变成1.0的时候就出现错误了
经过多方查找资料,发现了一个重大的问题:
glRealPixels的定义是什么?
——The glReadPixels function reads a block of pixels from the framebuffer.
问题就出现在这里
如果framebuffer里面没有东西,当然就读取不出来了啊
所以就会出现上面的错误。
经验证,果不然,如果鼠标点在空白的位置
point:439.000000, 356.000000, 1.000000 pos :-2504.841247, -426.216424, -9799.354916
找到问题的症结了
那么下面将好好学习一下帧缓存,然后把解决方案分享给大家。