在glm中合成转换-OpenGL

问题描述 投票:2回答:1

[如果有转换矩阵,则来自线性代数:

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

[如果有人可以解释一下这里发生的事情,我将非常感谢。预先感谢。

c++ opengl matrix glm-math
1个回答
3
投票
矩阵乘法顺序错误。示例代码将计算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));

© www.soinside.com 2019 - 2024. All rights reserved.