OpenGL无法正确使用glTranslate和glRotate

时间:2013-06-08 08:48:01

标签: opengl 2d lwjgl slick2d

我在这里制作一个小游戏,但OpenGL存在一个小问题。当我翻译相机时,旋转播放器的图像,希望它看起来一样,除了略带标题的纹理,一切都很糟糕。在下面的示例中,当我向上移动时,相机向上移动但是玩家根据纹理面向的位置向上移动(在下面的示例中,纹理移动了50度)。什么地方出了错?它是怎么发生的?

The "Horror Issue" - A Story Of OpenGL

这是我的代码:

 glTranslatef(x, y, 0.0f);
 drawMap(); //You don't see the map in the picture
 glRotatef(50.0f, 0.0f, 0.0f, 1.0f);
 drawPlayer();

谢谢!

1 个答案:

答案 0 :(得分:2)

OpenGL正在使用MatrixStack作为模型视图矩阵,将矩阵转换为相机空间。

因此,如果您在不恢复堆叠的情况下进行翻译,则翻译也将应用于播放器,并且旋转仅应用于播放器。如果您不希望应用转换,请使用glPushMatrix()重置您的堆栈,这意味着您之前使用过glPushMatrix(),否则会出现一堆错误

我建议您先阅读有关模型视图矩阵以及如何使用矩阵平移/旋转/缩放对象的内容。

如果你想恢复矩阵,你可以做一些事情 glPushMatrix()将当前状态推送到堆栈并且 glPopMatrix()恢复上次使用的状态。 堆栈总是要在最后清除,因此你必须像glPushMatrix()那样经常调用glPopMatrix(),否则会出错。

关于OpenGL背后的线性代数以及如何将它与OpenGL的内置方法一起使用,有很多非常好的教程。 [1]这里接受的答案非常适合数学[2]

[1] http://www.opengl.org/archives/resources/faq/technical/viewing.htm [2] 3D Graphics Processing - How to calculate modelview matrix