C++ 它真的是反变换矩阵吗?

C++ 它真的是反变换矩阵吗?,c++,math,matrix,transform,C++,Math,Matrix,Transform,这个函数做什么 MTX3_t是3*3矩阵的定义。MTX4_mtx3获取子矩阵。MTX3_vec_multiply_t将向量和矩阵相乘。是。请参见计算变换矩阵的逆。其基本思想是变换矩阵(第一个3x3子矩阵)的缩放/旋转组合是正交矩阵,且正交矩阵上的逆矩阵等于转置。因此,第一部分是转置计算。第二部分(从trans[0]=矩阵[3]的直线开始)是平移部分的逆运算(矩阵的最后一列。只有当变换矩阵是旋转和平移的组合时,它才会反转。如果变换矩阵还包括缩放或透视投影,它将无法正常工作。你知道你可以自己检查这一

这个函数做什么


MTX3_t是3*3矩阵的定义。MTX4_mtx3获取子矩阵。MTX3_vec_multiply_t将向量和矩阵相乘。

是。请参见计算变换矩阵的逆。其基本思想是变换矩阵(第一个3x3子矩阵)的缩放/旋转组合是正交矩阵,且正交矩阵上的逆矩阵等于转置。因此,第一部分是转置计算。第二部分(从trans[0]=矩阵[3]的直线开始)是平移部分的逆运算(矩阵的最后一列。

只有当变换矩阵是旋转和平移的组合时,它才会反转。如果变换矩阵还包括缩放或透视投影,它将无法正常工作。

你知道你可以自己检查这一点,对吗?没有一些数学背景,我认为检查这一点并不容易s、 我的意思是你可以看看它是否“有效”对于一种情况,甚至是相当多的情况,但这并不能证明它是一种有效的方法。非常感谢。我会花更多的时间来研究它。我认为在这种情况下,第一个3x3子矩阵不应该是正交矩阵。所以这种方法肯定是错误的。只有那些3x3子矩阵是正交的,第四行是正交的变换矩阵<代码>[0 0 1]将由函数正确反转,其他变换矩阵则不会。
void inverse44(
double *inverse,
double *matrix
)
{
double trans[3], trans_xf[3];
MTX3_t matrix3;

inverse[0] = matrix[0];
inverse[1] = matrix[4];
inverse[2] = matrix[8];
inverse[4] = matrix[1];
inverse[5] = matrix[5];
inverse[6] = matrix[9];
inverse[8] = matrix[2];
inverse[9] = matrix[6];
inverse[10] = matrix[10];
inverse[15] = 1.0;
inverse[12] = inverse[13] = inverse[14] = 0.0;

trans[0] = matrix[3];
trans[1] = matrix[7];
trans[2] = matrix[11];

MTX4_mtx3(MTX4_cast_pc(matrix),&matrix3);
MTX3_vec_multiply_t(VEC3_cast_pc(trans),&matrix3,VEC3_cast(trans_xf));
inverse[3] = -trans_xf[0];
inverse[7] = -trans_xf[1];
inverse[11] = -trans_xf[2];
}