我阅读了本教程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 =翻译*旋转,因为我们需要先应用旋转,然后进行翻译。
更新: 因此,我知道乘法需要从右到左读取,因为它是列主矩阵,但是我不明白是在构造转换矩阵时,为什么不使用修订版?
答案 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)
。