GLM 中的矩阵划分
Matrix Division in GLM
我目前正在尝试使用 OpenGL,我遇到了一种情况,我想找到 4x4 矩阵 x
,其中 x * mat1 = mat2
(我认为是列主顺序。其中 x * mat1
表示在 mat1
中应用转换,然后在 x
.).
自然而然地,我认为解决方案可能是x = mat2 / mat1
,所以我用glm尝试了一下。它奏效了!以下代码段将输出 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
)
没有矩阵除法这回事。然而,标量除法只是乘以标量值的倒数。因此,可以(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)
所以顺序没有歧义;如果你按错误的顺序做,你会得到错误的答案。
我目前正在尝试使用 OpenGL,我遇到了一种情况,我想找到 4x4 矩阵 x
,其中 x * mat1 = mat2
(我认为是列主顺序。其中 x * mat1
表示在 mat1
中应用转换,然后在 x
.).
自然而然地,我认为解决方案可能是x = mat2 / mat1
,所以我用glm尝试了一下。它奏效了!以下代码段将输出 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
)
没有矩阵除法这回事。然而,标量除法只是乘以标量值的倒数。因此,可以(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)
所以顺序没有歧义;如果你按错误的顺序做,你会得到错误的答案。