您的位置:首页 > 运维架构

屏幕坐标向OpenGL坐标转换的问题

2015-06-13 11:01 633 查看



屏幕坐标向OpenGL坐标转换的问题

搬运自我的百度空间

问题困扰我很久了,网上给出了这样一段代码:
voidTranslateGL(intx,inty,GLdouble &posX,GLdouble &posY,GLdouble &posZ)
{
GLint viewport[4];
GLdouble modelview[16];
GLdouble projection[16];
GLfloat winX,winY,winZ=10086;

glPushMatrix();
glLoadIdentity();
glTranslatef(0,0,-1.5);
// glRotatef(angx,1,0,0);
// glRotatef(angy,0,1,0);
// glRotatef(angz,0,0,1);

glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);

glGetDoublev(GL_PROJECTION_MATRIX, projection);
glPopMatrix();
winX = (float)x;
winY = viewport[3] - (float)y;
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
gluUnProject(double(winX),double(winY), double(winZ), modelview, projection, viewport, &posX, &posY, &posZ);

}

我发现最后没有成功返回X ,Y,Z坐标,调试后发现错在了glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );这一句上,返回的winZ永远是1.0

查阅无数次Google后,总算在一个外国论坛上看到,问题出在了近平面与远平面设置的问题。
gluPerspective(50,aspect,0,2);
这一句我把近平面设为0,而glReadPixels返回的winZ是某点在近远平面之间的比例,而可能由于除数是0(近平面)的缘故,返回的是无穷大(也就是1.0)
修改的办法就是gluPerspective(50,aspect,0.5,2);
还是要掌握好原理呀~

2013-06-26
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: