【问题标题】:Does it really inverse a transform matrix? [closed]它真的是变换矩阵的逆吗? [关闭]
【发布时间】:2012-06-10 07:15:43
【问题描述】:
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];
}

这个函数有什么作用?

MTX3_t 是 3*3 矩阵的定义。 MTX4_mtx3 得到一个子矩阵。 MTX3_vec_multiply_t 将一个向量和一个矩阵相乘。

【问题讨论】:

  • 你知道你可以自己检查,对吧?
  • 如果没有数学背景,我认为检查这一点并不容易。我的意思是您可以查看它是否适用于单个案例,甚至很多案例,但这并不能真正证明它是一种有效的方法..

标签: c++ math matrix transform


【解决方案1】:

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

【讨论】:

  • 我认为在那种情况下,第一个 3x3 子矩阵不应该是正交矩阵。所以这种方式肯定是错误的。
  • 只有那些其 3x3 子矩阵是正交的并且其第四行是 [0 0 0 1] 的变换矩阵将被您的函数正确反转 - 其他变换矩阵不会。
【解决方案2】:

是的。请参阅this link 来计算变换矩阵的逆矩阵。基本思想是变换矩阵(第一个 3x3 子矩阵)的缩放/旋转组合是一个正交矩阵,正交矩阵的逆矩阵等于转置。所以,第一部分是转置计算。第二部分(从 trans[0] = matrix[3] 行开始)是平移部分(矩阵的最后一列)的逆计算。

【讨论】:

  • 非常感谢。我会花更多的时间来研究它。
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 2021-11-17
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 2012-04-21
  • 2016-11-13
相关资源
最近更新 更多