【问题标题】:2D opengl rotation causes sprite distortion2D opengl 旋转导致精灵扭曲
【发布时间】:2013-07-14 15:38:43
【问题描述】:

我对使用 OpenGL ES 2.0 还是很陌生。我也在使用 iPhone 和 GLM 数学库。正如我所引用的,我一直在使用本教程:http://tomdalling.com/blog/modern-opengl/03-matrices-depth-buffering-animation/ 但我发现很难找到 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;

我认为部分问题在于图像在没有考虑纵横比的情况下被旋转,我不确定如何解决这个问题。

谢谢

【问题讨论】:

    标签: c++ ios rotation opengl-es-2.0 glm-math


    【解决方案1】:

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

    代替:

    gl_Position = model * projection * newPosition;
    

    尝试:

    gl_Position = projection * model * newPosition;
    

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

    gl_Position = projection * ( model * newPosition );
    

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

    【讨论】:

    • 我试用了您的代码,它似乎解决了倾斜问题。但是,图像似乎并未围绕其中心旋转。 i.imgur.com/C2oIM96.png 能否请您澄清一下您所说的翻译是什么意思。这是在移动矩阵吗?谢谢。
    • glm::rotate 将围绕原点创建一个旋转。要围绕不同的点旋转,您必须将该点平移到原点,旋转,然后再次平移回来。如果你的精灵的顶点被定义为原点位于中心,这很容易。您想按如下方式组合矩阵:投影 * 平移 * 旋转。是的,翻译是位置的改变。
    • 知道了。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2023-03-22
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多