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