GLM 中的矩阵除法
Posted
技术标签:
【中文标题】GLM 中的矩阵除法【英文标题】:Matrix Division in GLM 【发布时间】: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::vec31,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
【问题讨论】:
【参考方案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)
所以顺序没有歧义;如果你按错误的顺序做,你会得到错误的答案。
【讨论】:
以上是关于GLM 中的矩阵除法的主要内容,如果未能解决你的问题,请参考以下文章