Rot*_*tsi 1 c++ linear-algebra glm-math
我目前正在试验 OpenGL,我遇到了一种情况,我想找到 4x4 矩阵x,其中x * mat1 = mat2(列主要顺序,我认为。wherex * 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;
Run Code Online (Sandbox Code Playgroud)
但后来,我意识到了mat1 * x != x * mat1!这有什么意义?mat2 / mat1会模棱两可!我的除法解对找到 x 是否令人满意,或者有什么注意事项吗?(同样,我的目标是拥有x * mat1 = mat2)
我也遇到了这个讨论:https : //math.stackexchange.com/questions/228229/is-division-of-matrices-possible?newreg=c7fd79a48ae54ed694af1ee5f4646af7
没有矩阵除法这样的东西。然而,标量除法只是乘以标量值的倒数。因此,人们可以(并且 GLM 确实)将“矩阵除法”定义为同一件事:乘以逆。
所以你mat2 / mat1是真的mat2 * glm::inverse(mat1)。
至于交换性,让我们看看这里的代数。你从这个开始:
x * mat1 = mat2
Run Code Online (Sandbox Code Playgroud)
而你想解决x. 因此,您将两边乘以mat1从等式左侧删除的值。即,glm::inverse(mat1)。
但是,因为矩阵乘法不是可交换的,所以您知道这样做glm::inverse(mat1) * (x * mat1)实际上并没有去掉mat1等式左边的 。因此,您必须正确乘以逆以摆脱mat1.
并且由于代数变换仅在对两边执行完全相同的操作时才有效,因此您还必须在右侧进行右乘:
(x * mat1) * glm::inverse(mat1) = mat2 * glm::inverse(mat1)
Run Code Online (Sandbox Code Playgroud)
所以顺序没有歧义;如果你以错误的顺序做它们,你会得到错误的答案。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |