c++ - OpenGL坐标问题

标签 c++ opengl 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/

相关文章:

c++ - 为模板特化提供*隐式*转换运算符

c++ - SDL/OpenGL : Implementing a "Loading thread"

c++ - 使用 GLUT 按键停止动画?

c++ - GLUT程序链接错误

android - 如何删除 QCalendarWidget 中的选定日期矩形和小部件中的小图标

c++ - OpenCv 填充单 channel 图像的像素并显示

c++ - 虚函数和性能 C++

opengl - OpenGL 渲染可以用于 3D 显示器吗?

macos - MAC : missing: ZLIB_INCLUDE_DIR && OPENGL_INCLUDE_DIR

OpenGL 线图