题
我正在创建一个简单的 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()
在数组上char
s: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实现。
只是在其影响您的错误的情况下检查其他内容。
不隶属于 StackOverflow