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

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

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

提前致谢。

有帮助吗?

解决方案

您需要在重塑函数中设置投影矩阵(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(), ,你正在使用 wsprintf() 在数组上 chars: wsprintf() 接受一个宽字符数组(wchar_t),所以你应该创建局部变量 s 类型的 wchar_t[], ,或使用 sprintf()MessageBoxA() 代替 wsprintf()MessageBoxW() (对于其中 MessageBox() 在编译 Unicode 应用程序时扩展为宏,我假设您正在这样做)。您还容易受到缓冲区溢出的影响 - 您应该使用至少 12 个字符的缓冲区,即使实际上您永远不会传递一个非常大的字符 x 价值。最后,您还应该使用 snprintf()/wsnprintf() 代替 sprintf()/wsprintf() 以防止缓冲区溢出。

其他提示

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

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

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

你有:

gluOrtho2D(0, appWidth, appHeight, 0);

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

大部分时间都是:

gluOrtho2D(0, appWidth, 0, appHeight);

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

只是在其影响您的错误的情况下检查其他内容。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top