窗口调整大小后将鼠标位置转换为 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 中的世界坐标的主要内容,如果未能解决你的问题,请参考以下文章