【问题标题】:OpenGL coordinate problem [closed]OpenGL坐标问题[关闭]
【发布时间】:2009-03-08 05:42:30
【问题描述】:

我正在创建一个简单的 2D OpenGL 应用程序,但我似乎遇到了一些相机问题。当我在 (20,20) 处绘制一个矩形时,它会在 (25,20) 左右绘制。当我在 (100, 20) 处绘制它时,它被绘制在 125 左右。由于某些原因,所有内容都向右移动了几个 %。

我在这里粘贴了一个精简版 http://pastebin.com/m56491c4c

我设置 GLUT 的方式有问题吗?我知道不是我的对象在做任何奇怪的事情,因为当我禁用它们时也会发生同样的事情。

提前致谢。

【问题讨论】:

    标签: c++ opengl glut


    【解决方案1】:

    需要在reshape函数(resize())里面设置投影矩阵,也自动解决了用户调整窗口大小的问题:

    void resize(int w, int h)
    {
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      gluOrtho2D(0, w, h, 0);
    }
    

    然后在你的绘图函数中,确保矩阵模式是模型视图:

    void draw()
    {
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      ...
    }
    

    您的代码的其他问题:

    • 您可能不应该在draw() 的末尾调用glutPostRedisplay()。这将使您的 CPU 以 100% 运行。您可以改为使用 glutTimerFunc() 来保持每隔几毫秒更新一次。
    • processMouse() 中,您在chars 数组上使用wsprintf()wsprintf() 采用宽字符数组 (wchar_t),因此您应该将局部变量 s 设为键入wchar_t[],或使用sprintf()MessageBoxA() 而不是wsprintf()MessageBoxW()(编译Unicode 应用程序时MessageBox() 扩展为宏,我假设你正在这样做)。您还容易受到缓冲区溢出的影响——您应该使用至少 12 个字符的缓冲区,即使实际上您永远不会被传递一个非常大的 x 值。最后,您还应该使用snprintf()/wsnprintf() 而不是sprintf()/wsprintf() 来防止缓冲区溢出。

    【讨论】:

    • 谢谢,解决了!感谢您的其他建议。我知道这是混乱的代码,我只想发布一个快速工作的示例。再次感谢!
    【解决方案2】:

    您似乎在 ModelView 矩阵上调用 glOrtho2D。我怀疑这就是问题所在(因为我猜在这种情况下,您的 Projection 应该是身份),但您仍然应该在您的 Projection 矩阵上调用它。

    您还应该在 resize 调用中打印出 w 和 h ,以确保您的窗口大小实际上是您认为的(我不知道 glut 是如何工作的,但 glutInitWindowSize() 可能包括边框,其中会搞砸的)。

    【讨论】:

    • 我已经尝试按照您建议的顺序设置它,但没有任何运气。我弄乱了输出,并且相当有信心窗口大小是正确的。完全没有想法。
    【解决方案3】:

    这取决于您正在使用的系统,但通常大多数窗口坐标系从左下角开始,从上到右计数。在这种情况下,您的 gluOrth02D 调用将是错误的。

    你有:

    gluOrtho2D(0, appWidth, appHeight, 0);
    

    窗口的顶部映射到底部,反之亦然。

    大多数时候是:

    gluOrtho2D(0, appWidth, 0, appHeight);
    

    正如我所说,这取决于您使用的系统和平台。 我只能代表大多数 linux 实现。

    只需检查其他内容,以防它影响您的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多