2013-06-20 84 views
2

我对使用OpenGL ES 2.0相当陌生。也即时使用iPhone和GLM数学库。正如我参考的,我一直在使用本教程:http://tomdalling.com/blog/modern-opengl/03-matrices-depth-buffering-animation/但是我发现很难找到2D OpenGL教程。2D opengl旋转导致精灵失真

我想旋转2D精灵但图像被扭曲。 例如以0度的旋转角度:http://i.imgur.com/yBTN2ST.png和以45度的旋转角度:http://i.imgur.com/cY5IJcg.png

以我精灵类

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; 

我认为这部分问题是图像是b eing旋转而不考虑纵横比我不知道如何解决这个问题。

谢谢

回答

0

我想你是以错误的顺序应用你的转换。

相反的:

gl_Position = model * projection * newPosition; 

尝试:

gl_Position = projection * model * newPosition; 

更妙的是(为了避免乘以2点4X4矩阵一起):

gl_Position = projection * (model * newPosition); 

更妙的是:乘你的矩阵中的应用程序并在着色器中执行单个矩阵向量乘法。您应该也可以在矩阵中包含翻译。

+0

我试过你的代码,它似乎修复了偏移问题。但是,图像似乎并未围绕其中心旋转。 http://i.imgur.com/C2oIM96.png请您澄清一下您的翻译意思。这是否移动矩阵?谢谢。 – Eamonn

+0

glm :: rotate将围绕原点创建一个旋转。要围绕不同的点旋转,必须将该点翻译为原点,旋转,然后再次翻译。如果精灵的顶点被定义为原点位于中心,那么这很容易。您想要如下组合矩阵:投影*平移*旋转。翻译是一种改变立场。 – GuyRT

+0

明白了。非常感谢你的帮助。 – Eamonn