C++ 2D opengl旋转导致精灵失真

C++ 2D opengl旋转导致精灵失真,c++,ios,rotation,opengl-es-2.0,glm-math,C++,Ios,Rotation,Opengl Es 2.0,Glm Math,我对使用OpenGLES2.0相当陌生。我也在使用iPhone和GLM数学库。作为参考,我一直在使用本教程:但我发现很难找到2D OpenGL教程 我试图旋转一个2D精灵,但是图像被扭曲了。 例如,旋转角度为0度时:和旋转角度为45度时: 在我的雪碧课上 glm::mat4 projection = glm::ortho(0.0f, 480.0f, 0.0f, 320.0f); glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, glm::val

我对使用OpenGLES2.0相当陌生。我也在使用iPhone和GLM数学库。作为参考,我一直在使用本教程:但我发现很难找到2D OpenGL教程

我试图旋转一个2D精灵,但是图像被扭曲了。 例如,旋转角度为0度时:和旋转角度为45度时:

在我的雪碧课上

glm::mat4 projection = glm::ortho(0.0f, 480.0f, 0.0f, 320.0f);
glUniformMatrix4fv(projectionUniform, 1, GL_FALSE, glm::value_ptr(projection));

glm::mat4 newModel = glm::rotate(glm::mat4(), 0.0f, glm::vec3(0, 0, 1));
glUniformMatrix4fv(modelUniform, 1, GL_FALSE, value_ptr(newModel));

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

在我的顶点着色器中

vec4 newPosition = vec4(position + offset, 0.0, 1.0);
gl_Position = model * projection * newPosition;
我认为问题的一部分是图像在旋转时没有考虑纵横比,我真的不知道如何解决这个问题


谢谢

我认为您以错误的顺序应用了转换

而不是:

gl_Position = model * projection * newPosition;
尝试:

更好的方法是(避免将两个4x4矩阵相乘):


更好的方法是:在应用程序中乘法矩阵,在着色器中执行单个矩阵向量乘法。您可能还应该在矩阵中包含翻译

我试用了你的代码,它似乎解决了倾斜问题。但是,图像似乎没有围绕其中心旋转。你能澄清一下你所说的翻译是什么意思吗。这是在移动矩阵吗?谢谢。glm::rotate将围绕原点创建旋转。要围绕不同的点旋转,必须将该点平移到原点,旋转,然后再次平移回原点。如果精灵的顶点定义为原点位于中心,则非常容易。要按如下方式组合矩阵:投影*平移*旋转。是的,翻译是一种立场的改变,明白了。非常感谢你的帮助。
gl_Position = projection * model * newPosition;
gl_Position = projection * ( model * newPosition );