<分区>
我正在创建一个简单的 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);
}
然后在你的绘制函数中,确保矩阵模式是模型 View :
void draw()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
...
}
您的代码的其他问题:
draw()
结束时调用 glutPostRedisplay()
。这将使您的 CPU 以 100% 的速度运行。您可以改为使用 glutTimerFunc()
以每隔几毫秒更新一次。processMouse()
中,您在 char
数组上使用 wsprintf()
:wsprintf()
采用宽字符数组 (wchar_t
),因此您应该创建类型为 wchar_t[]
的局部变量 s
,或者使用sprintf()
和 MessageBoxA()
而不是 wsprintf()
和 MessageBoxW()
( MessageBox()
在编译 Unicode 应用程序时扩展为宏,我假设您正在这样做)。您还容易受到缓冲区溢出的影响——您应该使用至少 12 个字符的缓冲区,即使实际上您永远不会被传递一个非常大的 x
值。最后,您还应该使用 snprintf()/wsnprintf()
而不是 sprintf()/wsprintf()
来防止缓冲区溢出。关于c++ - OpenGL坐标问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/623127/