当我写的程序启动时,我在窗口中有一些顶点。视口设置为占据整个窗口。在鼠标单击时,计算从鼠标位置到每个顶点的距离。如果它们中的任何一个在某个阈值内(比如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是我的新视口的限制。我在设置新视口之前和之后尝试过这些。似乎没有解决问题。
答案 0 :(得分:0)
从评论中看,您的问题是在调整窗口大小时重新计算投影。
调整大小后调用glOrtho()
(确保将矩阵模式设置为GL_PROJECTION),你应该好好去。
答案 1 :(得分:0)
检查一下:
screenHeight = h;
screenWidth = w;
// ...
widthBound = width;
heightBound = height;
您是否使用screen***
或***Bound
来转换鼠标坐标?这可能是一个问题,因为它们在宽高比强制执行时具有不同的大小,否则相等。