我参考了网上的代码:
void Ctest11View::TranslateGL(int x,int y,GLdouble &posX,GLdouble &posY,GLdouble &posZ)
{
GLint    viewport[4]; 
 GLdouble modelview[16]; 
 GLdouble projection[16]; 
 GLfloat winX,winY,winZ=.5;
 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 );
 TRACE("z%f %d %d %d %d\n",winZ,viewport[0],viewport[1],viewport[2],viewport[3]);
 TRACE("%d",gluUnProject(double(winX),double(winY), double(winZ), modelview, projection, viewport, &posX, &posY, &posZ)); }
每次结果都是glReadPixels输出的winZ毫无修改(应该是出错了)
然后直接导致gluUnProject出错
就算我把
          glLoadIdentity();
  glTranslatef(0,0,-1.5);
glRotatef(angx,1,0,0);
glRotatef(angy,0,1,0);
glRotatef(angz,0,0,1);
的注释去掉,结果依然相同(这些图像操作与我绘图时相同)
是环境设置的问题么OpenGL

解决方案 »

  1.   


    GCPosition4D OpenGLControl::ScreenToPoint(int x,int y)
    {
    GLint viewport[4];
    GLdouble mvmatrix[16],projmatrix[16];

    glPushMatrix();

    glGetIntegerv(GL_VIEWPORT,viewport);
    glGetDoublev(GL_MODELVIEW_MATRIX,mvmatrix);
    glGetDoublev(GL_PROJECTION_MATRIX,projmatrix);

    GLdouble wx, wy, wz;

    gluUnProject(x, viewport[3]-y - 1, 0.5, mvmatrix, projmatrix, viewport, &wx, &wy, &wz);

    glPopMatrix();

    return GCPosition4D(wx,wy,wz);
    }
    不过这个函数我一般仅用在Ortho投影,wz坐标一般是ortho立方体的Near面所在位置的值这个x,y,z 和Ortho的上下前后左右设置有关,不一定是坐标系的XYZ向
      

  2.   


    我的不是Ortho,而是 gluPerspective(50,aspect,0,2);
    怎么办?
      

  3.   

    我的不是Ortho,而是 gluPerspective(50,aspect,0,2);  这个不知道,我测试用给出的函数去转换,可以得到点坐标,但结果不是想要的只有Ortho下才能得到我想要的结果,我是获取点然后判断是不是在一个矩形内部
      

  4.   

    额,我做的是一个正方体,其实每次点击(查询坐标)的时候我已经把他的一个面转到与视面平行了,理论上只要单位转换就可以了,有其他办法么既然是正方体,而且转到与视面平行了,那就试一下这个时候换成ortho投影(使用和当前perspective相同的视点视向和Up),然后看能否取到你需要的值
      

  5.   

    额,我做的是一个正方体,其实每次点击(查询坐标)的时候我已经把他的一个面转到与视面平行了,理论上只要单位转换就可以了,有其他办法么既然是正方体,而且转到与视面平行了,那就试一下这个时候换成ortho投影(使用和当前perspective相同的视点视向和Up),然后看能否取到你需要的值
    好的,我回去试试
      

  6.   

    解决了,错在glReadPixels无法读取z坐标
    根源在我用了gluPerspective(50,aspect,0,2);
    而glReadPixels返回的是点在近远平面的比例,而近平面是0,则永远返回1(无穷大)
      

  7.   

    myjisgreat 您好,请问你最终是怎么讲屏幕坐标转换为正确的OpenGL坐标的呢?glReadPixels返回的是点在近远平面的比例,而近平面是0,则永远返回1(无穷大)这句话是什么意思,可以详细解释下否?谢谢了