c++ - GLM中的矩阵部门

标签 c++ linear-algebra glm-math

我目前正在使用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)
我也遇到了这个讨论:https://math.stackexchange.com/questions/228229/is-division-of-matrices-possible?newreg=c7fd79a48ae54ed694af1ee5f4646af7

最佳答案

没有矩阵除法。但是,标量除法只是乘以标量值的倒数。因此,可以(并且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)
因此,订单没有任何歧义。如果以错误的顺序执行它们,则会得到错误的答案。

关于c++ - GLM中的矩阵部门,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63045165/

相关文章:

c++ - 从 map 中释放对象时出现 Valgrind 错误(无效读取)运算符删除(无效*)

c - 重心坐标。 C 中点相对于凹多边形的谐波扭曲

fortran - 在 Fortran 95 中求解线性方程

python - 病态矩阵的对角化和计算特征向量的不可能性。 numpy/scipy 的不同结果

c++ - 在 Win32 上如何将线程移动到另一个 CPU 核心?

c++ - 如何将 Swift 与 C 或 C++ 连接?

c++ - 在 C++ 中链接代码时遇到错误

c++ - 为什么使用程序会导致我的形状消失?

c++ - 转换模型矩阵

matrix - GLM矩阵4X4(mat4)到阵列和返回