【问题标题】:Compositing a transformation in glm and OpenGL在 glm 和 OpenGL 中合成一个转换
【发布时间】:2020-03-31 05:38:02
【问题描述】:

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

和一个缩放矩阵:


我们翻译和缩放的净效果由下式给出:

现在我只是使用 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;
    }  

本质上只是像这样缩放变换矩阵的列:
(我把翻译矩阵的值放在上面的我的代码中):

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

这是怎么回事?

【问题讨论】:

  • 倒数第二个矩阵真的是你得到的结果吗?由于您在代码中使用 (1.5, 1.5, 1) 作为比例因子,所以第三行/第三列中不应该有 1.0 吗?对于其他一切:您的乘法顺序错误。您的代码计算的是 T * S,而不是 S * T。
  • @BDL,看来我打错了。
  • 这是先缩放后平移,还是先平移后缩放的区别。

标签: c++ opengl matrix glm-math


【解决方案1】:

矩阵乘法顺序错误。示例代码计算的是 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));

【讨论】:

  • 这是真的,但是,这似乎是 GLM 处理事情的方式,因为人们会期望连续的矩阵调用会将矩阵定位到左侧而不是右侧。
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多