在OpenGL中转换应用顺序令我感到困惑

时间:2018-09-28 17:38:03

标签: c++ glm-math

我阅读了本教程https://learnopengl.com/Getting-started/Transformations 最后,在最后一张图片的上方,它说:

glm::mat4 trans;
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

我不知道最终的转换值是什么,它是 translate *旋转 rotate *翻译吗?

  

在这里,我们首先绕原点(0,0,0)旋转容器,然后旋转一次   它旋转了,我们将其旋转版本翻译到右下角   屏幕的一角。 记住实际的转换顺序   应该反读:即使在代码中我们先翻译并   然后旋转,实际的变换首先应用旋转   然后是翻译。

那么最后的 transform =翻译*旋转吗? 但是为什么它不写这样的代码:

glm::mat4 trans;
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f)); // revise order

顶点着色器中的代码如下: gl_Position = transform * vec4(aPos, 1.0); 这似乎是 transform =翻译*旋转,因为我们需要先应用旋转,然后进行翻译。

更新: 因此,我知道乘法需要从右到左读取,因为它是列主矩阵,但是我不明白是在构造转换矩阵时,为什么不使用修订版?

1 个答案:

答案 0 :(得分:1)

输出:

glm::mat4 trans;
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

应该翻译*旋转,我怀疑作者想模仿从左到右的阅读顺序,而不是应用顺序。您可以通过浏览source code来确认这一点:

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER mat<4, 4, T, Q> translate(mat<4, 4, T, Q> const& m, vec<3, T, Q> const& v)
{
    mat<4, 4, T, Q> Result(m);
    Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
    return Result;
}

这将计算 m * translationMat 。因为翻译矩阵的顶部3x3角是单位,而第四列是(v,1.0)