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



我读了本教程,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));

我不知道最终的反式值是什么,它是平移*旋转还是旋转*平移

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

所以最终的变换=平移*旋转? 但是为什么它不编写这样的代码:

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);这似乎是转换 =平移 * 旋转,因为我们需要先应用旋转,然后再平移。

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

输出:

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));

应该翻译*旋转,我怀疑作者想模仿从左到右的阅读顺序,而不是它们的应用顺序。您可以通过查看源代码来确认这一点:

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)

最新更新