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

来源:互联网 发布:2016全球社交网络排行 编辑:程序博客网 时间:2024/05/17 23:50


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

    还是要掌握好原理呀~

     

    0 0
    原创粉丝点击