c++ - 在 glm 和 OpenGL 中合成变换

标签 c++ opengl matrix glm-math

根据线性代数,如果你有一个平移矩阵:

enter image description here

和缩放矩阵:

enter image description here
我们平移和缩放的净效果由下式给出:

enter image description here

现在我只是使用 VSCode 来查看 glm 如何处理翻译以使用这些操作:

//my code
glm::mat4 modelMatrix(1.0f); 
modelMatrix = glm::translate(modelMatrix, glm::vec3(0.5, 0.5f, 0.5f));
modelMatrix = glm::scale(modelMatrix,glm::vec3(1.5, 1.5, 1.0));

glm::translate 的代码是:

//glm 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;
    }  

本质上是改变单位矩阵的第三列,并将modelMatrix转换为平移矩阵T,但令人惊讶的是,它并没有形成复合变换 矩阵,而是这样做:

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

本质上只是缩放变换矩阵的列,如下所示:
(我已将平移矩阵的值如上面的代码所示):

enter image description here

这根本不是我期望的复合变换矩阵,这是我从线性代数理论中学到的:

enter image description here

这是怎么回事?

最佳答案

矩阵乘法顺序错误。示例代码计算 T * S 而不是 S * T。Matrix multiplications are not commutative ,因此结果与您的期望不同。

以下代码应该会产生您需要的结果:

glm::mat4 modelMatrix(1.0f); 
modelMatrix = glm::scale(modelMatrix,glm::vec3(1.5, 1.5, 1.0));
modelMatrix = glm::translate(modelMatrix, glm::vec3(0.5, 0.5f, 0.5f));

关于c++ - 在 glm 和 OpenGL 中合成变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59209544/

相关文章:

c++ - 请解释这个c++语法

c++ - 如何为匿名命名空间中未引用的本地函数生成警告?

c++ - Boost Serialize 向后兼容性问题

windows - 找到零个 Opengl 3.2 像素格式匹配项?

java - 使用 PDFBox 旋转多个形状的问题

c++ - 如何对大文本文件中的数字进行排序

OpenGL:为什么远近在正交投影中是负的?

c++ - 了解 OpenGL

将三列数据框 reshape 为矩阵 ("long"到 "wide"格式)

java - 计算矩阵平方行列式