在窗口调整大小后,将鼠标位置转换为2D openGL中的世界坐标

时间:2010-09-27 20:50:17

标签: opengl 2d coordinates

当我写的程序启动时,我在窗口中有一些顶点。视口设置为占据整个窗口。在鼠标单击时,计算从鼠标位置到每个顶点的距离。如果它们中的任何一个在某个阈值内(比如5个单位),则选择顶点。这部分没有问题。

然后,在调整窗口大小后,我限制新窗口的视口以保持纵横比。这也有效。

然而,在调整大小后,尝试单击顶点会产生奇怪的行为,因为鼠标位置似乎不再与世界坐标对齐。如何将鼠标位置转换为存储这些顶点的x / y值的世界坐标系?

我之前看过这个问题,但是在3D环境中。对此的修复似乎是使用gluUnproject。我不确定这是否适用于2D程序。任何帮助将不胜感激!

以下是调整大小功能的代码:

//resize function; used to maintain aspect ratio
void resize(int w, int h)
{
    screenHeight = h;
    screenWidth = w;

    int width, height;

    //taller
    if ((float)(w/h) < R)
    {
        width = w;
        height = w/R;
    }
    //wider
    else
    {
        width = h*R;
        height = h;
    }

    widthBound = width;
    heightBound = height;

    glViewport(0, 0, width, height);
} //end resize

我尝试通过以下方式重置代码中的投影矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(left, right, bottom, top);

其中left,right,bottom和top是我的新视口的限制。我在设置新视口之前和之后尝试过这些。似乎没有解决问题。

2 个答案:

答案 0 :(得分:0)

从评论中看,您的问题是在调整窗口大小时重新计算投影。

调整大小后调用glOrtho()(确保将矩阵模式设置为GL_PROJECTION),你应该好好去。

答案 1 :(得分:0)

检查一下:

screenHeight = h;
screenWidth = w;

// ...

widthBound = width;
heightBound = height;

您是否使用screen******Bound来转换鼠标坐标?这可能是一个问题,因为它们在宽高比强制执行时具有不同的大小,否则相等。