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



屏幕坐标向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); 

 

}

 

我发现最后没有成功返回YZ坐标,调试后发现错在了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);

还是要掌握好原理呀~

 

展开阅读全文

没有更多推荐了,返回首页