gluUnProject 给出翻转的 y 位置

gluUnProject gives flippped y position

我设置了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);
}

这个 returns py 仍然好像原点在左下角。不知道为什么。请注意,输入坐标也是相对于左上角的原点。

OpenGL 的 window space 始终 定义为原点位于左下角。使用一些投影矩阵将 而不是 翻转它。它只会在从 eyeclip space 的转换中添加一个镜像组件(稍后导出 window 坐标从)。因此,如果您向 gluUnporject 提供 y=0 处的一个点,则您要求对象 space 坐标用于渲染后出现在底行的东西。

在您的情况下,这仅意味着由于该正交矩阵(以及 identity 作为 ModelView),当您要求时,您将得到 y=height 作为结果。