我已经设置了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,就像原点是左下角一样。不知道为什么。请注意,输入坐标也相对于左上角的原点。
答案 0 :(得分:2)
OpenGL的窗口空间始终定义为原点位于左下角。使用一些投影矩阵将不翻转它。它只会将一个镜像组件添加到从 eye 到 clip 空间(后面的窗口坐标从中派生)的转换中。因此,如果您向gluUnporject
提供y = 0处的点,则要求渲染后出现在底行的对象空间坐标。
在你的情况下,这只意味着由于这个正交矩阵(以及identity
作为ModelView),当你提出要求时,你会得到y = height
。