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 始终 定义为原点位于左下角。使用一些投影矩阵将 而不是 翻转它。它只会在从 eye 到 clip space 的转换中添加一个镜像组件(稍后导出 window 坐标从)。因此,如果您向 gluUnporject
提供 y=0 处的一个点,则您要求对象 space 坐标用于渲染后出现在底行的东西。
在您的情况下,这仅意味着由于该正交矩阵(以及 identity
作为 ModelView),当您要求时,您将得到 y=height
作为结果。
我设置了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 始终 定义为原点位于左下角。使用一些投影矩阵将 而不是 翻转它。它只会在从 eye 到 clip space 的转换中添加一个镜像组件(稍后导出 window 坐标从)。因此,如果您向 gluUnporject
提供 y=0 处的一个点,则您要求对象 space 坐标用于渲染后出现在底行的东西。
在您的情况下,这仅意味着由于该正交矩阵(以及 identity
作为 ModelView),当您要求时,您将得到 y=height
作为结果。