我正在创建一个简单的2D OpenGL应用程序,但我似乎遇到了一些相机问题。当我在(20,20)绘制一个矩形时,它被绘制在(25,20)左右。当我在(100,20)处绘制时,它被绘制在125左右。由于某些原因,一切都向右移动了几个百分点。
我在这里粘贴了一个修剪过的版本 http://pastebin.com/m56491c4c
我设置GLUT的方式有问题吗?我知道这不是我的对象做任何奇怪的事情,因为当我禁用它们时会发生同样的事情。
提前致谢。
答案 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的数组上使用char
:wsprintf()
采用一系列宽字符(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实现。
只是在其影响您的错误的情况下检查其他内容。