【问题标题】:Convert mouse position to world coordinates in 2D openGL after window resize窗口调整大小后将鼠标位置转换为 2D openGL 中的世界坐标
【发布时间】: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);

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

【问题讨论】:

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

标签: opengl 2d coordinates


【解决方案1】:

检查一下:

screenHeight = h;
screenWidth = w;

// ...

widthBound = width;
heightBound = height;

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 2012-01-19
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多