gluUnProject给出了翻转的y位置

时间:2015-05-14 15:50:04

标签: opengl 3d coordinate-systems

我已经设置了openGL,因此原点位于左上角。但是,使用gluUnProject将鼠标坐标转换为OpenGL坐标,仍然给出了原点在左下角的坐标,我不知道为什么会这样。因此,OpenGL的设置如下:

void setup_GL()
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    // bottom and top flipped to change origin
    glOrtho(0, width, height, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

将屏幕坐标转换为OpenGL坐标的功能如下:

Point get_gl_from_screen(int x, int y)
{
    set_up_view();
    GLint viewport[4];
    GLdouble modelview[16];
    GLdouble projection[16];

    GLfloat z;
    GLdouble px, py, pz;

    glGetDoublev(GL_MODELVIEW_MATRIX, modelview );
    glGetDoublev(GL_PROJECTION_MATRIX, projection );
    glGetIntegerv(GL_VIEWPORT, viewport);
    gluUnProject(x, y, z, modelview, projection, viewport, &px, &py, &pz);

    return Point(px, py);
}

这仍然会返回py,就像原点是左下角一样。不知道为什么。请注意,输入坐标也相对于左上角的原点。

1 个答案:

答案 0 :(得分:2)

OpenGL的窗口空间始终定义为原点位于左下角。使用一些投影矩阵将翻转它。它只会将一个镜像组件添加到从 eye clip 空间(后面的窗口坐标从中派生)的转换中。因此,如果您向gluUnporject提供y = 0处的点,则要求渲染后出现在底行的对象空间坐标。

在你的情况下,这只意味着由于这个正交矩阵(以及identity作为ModelView),当你提出要求时,你会得到y = height