1

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

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

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

提前致谢。

4

3 回答 3

3

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

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

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

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

您的代码的其他问题:

  • 您可能不应该glutPostRedisplay()draw(). 这将使您的 CPU 以 100% 运行。您可以改为glutTimerFunc()每隔几毫秒进行一次更新。
  • processMouse()中,您在swsprintf()数组上使用charwsprintf()接受一个宽字符数组 ( wchar_t),因此您应该制作stype的局部变量wchar_t[],或者使用sprintf()andMessageBoxA()而不是wsprintf()and MessageBoxW()MessageBox()在编译 Unicode 应用程序时扩展为宏,我假设你正在这样做)。您也容易受到缓冲区溢出的影响——您应该使用至少 12 个字符的缓冲区,即使实际上您永远不会被传递一个非常大的x值。最后,您还应该使用snprintf()/wsnprintf()代替sprintf()/wsprintf()来防止缓冲区溢出。
于 2009-03-08T06:31:38.033 回答
0

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

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

于 2009-03-08T06:06:36.110 回答
0

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

你有:

gluOrtho2D(0, appWidth, appHeight, 0);

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

大多数时候是:

gluOrtho2D(0, appWidth, 0, appHeight);

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

只是要检查其他东西,以防它影响您的错误。

于 2009-03-08T06:45:46.360 回答