【问题标题】:Matrix Division in GLMGLM 中的矩阵除法
【发布时间】:2020-07-23 00:46:06
【问题描述】:

我目前正在试验 OpenGL,我遇到了一种情况,我想找到 4x4 矩阵 x 其中 x * mat1 = mat2 (我认为是列主要顺序。其中 x * mat1 表示应用转换mat1,然后是x。)。

自然想到解决办法可能是x = mat2 / mat1,于是用glm试了一下。它奏效了!以下 sn-p 将输出 true

glm::mat4 mat1 = glm::translate(glm::vec3{1,2,3});
glm::mat4 mat2 = glm::scale(glm::vec3{-1,-2,-3});

glm::mat4 x = mat2 / mat1;
std::cout << ((x * mat1) == mat2) << std::endl;

但后来,我意识到mat1 * x != x * mat1! 这有什么意义? mat2 / mat1 会模棱两可!我的除法解决方案对于找到 x 是否令人满意或有任何警告? (同样,我的目标是拥有x * mat1 = mat2

我也遇到过这个讨论:https://math.stackexchange.com/questions/228229/is-division-of-matrices-possible?newreg=c7fd79a48ae54ed694af1ee5f4646af7

【问题讨论】:

    标签: c++ linear-algebra glm-math


    【解决方案1】:

    没有矩阵除法之类的东西。但是,标量除法只是乘以标量值的倒数。因此,可以(和 GLM 一样)将“矩阵除法”定义为同一件事:乘以逆。

    所以你的mat2 / mat1 真的是mat2 * glm::inverse(mat1)

    至于交换性,我们看这里的代数。你从这个开始:

    x * mat1 = mat2
    

    你想解决x。因此,您将两边都乘以一个从等式左侧删除mat1 的值。即glm::inverse(mat1)

    然而,因为矩阵乘法是不可交换的,你知道做glm::inverse(mat1) * (x * mat1)实际上并没有去掉等式左边的mat1。因此,您必须-乘以倒数以摆脱mat1

    而且由于代数变换只有在对两边进行完全相同的运算时才有效,所以还必须在右侧进行右乘:

    (x * mat1) * glm::inverse(mat1) = mat2 * glm::inverse(mat1)
    

    所以顺序没有歧义;如果你按错误的顺序做,你会得到错误的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      相关资源
      最近更新 更多