我正在创建一个简单的 2D OpenGL 应用程序,但我似乎遇到了一些相机问题。当我在 (20,20) 处绘制一个矩形时,它会在 (25,20) 左右绘制。当我在 (100, 20) 处绘制它时,它被绘制在 125 左右。由于某些原因,一切都向右移动了几个%。
我在这里粘贴了一个精简版 http://pastebin.com/m56491c4c
我设置 GLUT 的方式有问题吗?我知道这不是我的对象在做任何奇怪的事情,因为当我禁用它们时也会发生同样的事情。
提前致谢。
我正在创建一个简单的 2D OpenGL 应用程序,但我似乎遇到了一些相机问题。当我在 (20,20) 处绘制一个矩形时,它会在 (25,20) 左右绘制。当我在 (100, 20) 处绘制它时,它被绘制在 125 左右。由于某些原因,一切都向右移动了几个%。
我在这里粘贴了一个精简版 http://pastebin.com/m56491c4c
我设置 GLUT 的方式有问题吗?我知道这不是我的对象在做任何奇怪的事情,因为当我禁用它们时也会发生同样的事情。
提前致谢。
需要在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()
数组上使用char
:wsprintf()
接受一个宽字符数组 ( wchar_t
),因此您应该制作s
type的局部变量wchar_t[]
,或者使用sprintf()
andMessageBoxA()
而不是wsprintf()
and MessageBoxW()
(MessageBox()
在编译 Unicode 应用程序时扩展为宏,我假设你正在这样做)。您也容易受到缓冲区溢出的影响——您应该使用至少 12 个字符的缓冲区,即使实际上您永远不会被传递一个非常大的x
值。最后,您还应该使用snprintf()/wsnprintf()
代替sprintf()/wsprintf()
来防止缓冲区溢出。你似乎在你的 ModelView 矩阵上调用你的 glOrtho2D 。我怀疑这就是问题所在(因为我猜在这种情况下,你的 Projection 应该是身份),但你仍然应该在你的 Projection 矩阵上调用它。
您还应该在 resize 调用中打印出 w 和 h ,以确保您的窗口大小实际上是您认为的那样(我不知道 glut 是如何工作的,但 glutInitWindowSize() 可能包含边框,这会搞砸事情向上)。
这取决于您正在使用的系统,但通常大多数 Windows 坐标系从左下角开始,从上到右计数。在这种情况下,您的 gluOrth02D 调用将是错误的。
你有:
gluOrtho2D(0, appWidth, appHeight, 0);
其中窗口的顶部映射到底部,反之亦然。
大多数时候是:
gluOrtho2D(0, appWidth, 0, appHeight);
正如我所说,这取决于您使用的系统和平台。我只能代表大多数 linux 实现。
只是要检查其他东西,以防它影响您的错误。