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

Posted

技术标签:

【中文标题】窗口调整大小后将鼠标位置转换为 2D openGL 中的世界坐标【英文标题】:Convert mouse position to world coordinates in 2D openGL after window resize 【发布时间】:2011-04-17 23:45:02 【问题描述】:

当我编写的程序启动时,我在一个窗口中有一些顶点。视口设置为占据整个窗口。单击鼠标时,将计算从鼠标位置到每个顶点的距离。如果它们中的任何一个在某个阈值内(比如说 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);

左、右、下和上是我的新视口的界限。在设置新视口之前和之后,我都尝试过这样做。似乎无法解决问题。

【问题讨论】:

你确定你也更新了投影矩阵吗?能否给出设置视口、投影矩阵和计算坐标的代码? 查看我的代码,我认为我没有更新投影矩阵。这也很奇怪,因为在我强制执行纵横比之前它运行良好。 【参考方案1】:

检查一下:

screenHeight = h;
screenWidth = w;

// ...

widthBound = width;
heightBound = height;

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

【讨论】:

【参考方案2】:

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

只需在调整大小后调用glOrtho()(确保将矩阵模式设置为 GL_PROJECTION)就可以了。

【讨论】:

以上是关于窗口调整大小后将鼠标位置转换为 2D openGL 中的世界坐标的主要内容,如果未能解决你的问题,请参考以下文章

使用 GLM 功能放大 OpenGL 中的当前鼠标位置

从视口坐标转换为 [-1,1]^2 顶点 [OpenGL]

调整窗口大小时如何使用鼠标单击获取图像坐标?

OpenGL - 正交投影矩阵,glViewport

怎样让XP系统记住上次打开窗口的大小和位置?

使用 OpenGL 和 SDL 处理窗口大小调整