OpenGL坐标问题

时间:2009-03-08 05:42:31

标签: c++ opengl glut

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

我在这里粘贴了一个修剪过的版本 http://pastebin.com/m56491c4c

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

提前致谢。

3 个答案:

答案 0 :(得分:3)

您需要在重塑函数(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() s的数组上使用charwsprintf()采用一系列宽字符(wchar_t),因此您应该创建s类型的本地变量wchar_t[],或使用sprintf()MessageBoxA()代替wsprintf()MessageBoxW()MessageBox() x 1}}在编译Unicode应用程序时作为宏扩展,我假设你正在做。您也容易受到缓冲区溢出的影响 - 您应该使用至少12个字符的缓冲区,即使实际上您永远不会传递非常大的snprintf()/wsnprintf()值。最后,您还应该使用sprintf()/wsprintf()而不是{{1}}来防止缓冲区溢出。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

你有:

gluOrtho2D(0, appWidth, appHeight, 0);

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

大部分时间都是:

gluOrtho2D(0, appWidth, 0, appHeight);

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

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