【问题标题】:gluUnProject gives flippped y positiongluUnProject 给出翻转的 y 位置
【发布时间】:2015-05-14 15:50:04
【问题描述】:

我已经设置了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,就好像 origin 在左下角一样。不知道为什么。请注意,输入坐标也是相对于左上角的原点。

【问题讨论】:

    标签: opengl 3d coordinate-systems


    【解决方案1】:

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

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

    【讨论】:

    • 酷。这很令人困惑!我想我只需要手动翻转它就可以了。
    • @Luca:或者您可以简单地为 glUnProject 提供一个未翻转的投影矩阵。总的来说,我很难理解为什么人们希望在左上角有原点。
    • 我只需要它,因为 opencv 和 qt 也有这个约定。
    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2019-07-21
    • 2021-02-13
    • 2013-08-16
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多