本征变换的优先顺序以及预翻译和翻译之间的差异

时间:2018-07-12 23:35:02

标签: c++ matrix linear-algebra eigen

我对合并变换时本征使用的顺序有点困惑。

translate()pretranslate()有什么区别?

因为在实践中我这样做会得到不同的结果:

  Eigen::Affine3d t_res = Eigen::Affine3d::Identity();
  t_res.pretranslate(t1)
      .translate(t2)
      .rotate(t3);

...这:

  Eigen::Affine3d t_res = Eigen::Affine3d::Identity();
  t_res.translate(t1)
      .translate(t2)
      .rotate(t3);

另外,对于最后的代码段,Eigen是否这样做

t_res = (t1 * ( t2 * t3 ))

或这个

t_res = ((t1 *  t2) * t3 )

2 个答案:

答案 0 :(得分:3)

pretranslatetranslate的区别在于它们是从右侧还是从左侧应用参数

A.pretranslate(B)

在左侧应用B,返回B*A,而

A.translate(B)

从右边应用它,返回A*B

关于顺序,A.translate(B)返回对所得​​矩阵的引用,因此它将对上一个操作的结果进行迭代调用translate / rotate

t_res = (((t_res* t1) *  t2) * t3 )

但是由于矩阵乘法是关联的,因此运算的顺序仅在涉及浮点表示形式的数值误差时才重要。

但是,矩阵的顺序确实会影响结果(因为乘法不是可交换的),这就是pretranslatetranslate给出不同结果的原因。


编辑:正如ggael所指出的那样,对于t_res作为标识,两个版本应给出相同的结果

答案 1 :(得分:2)

Kai已经回答了您的问题,但我强烈建议您避免使用这些函数并编写明确的代码:

Vector3d t1, t2;
Matrix3d mat_rot;
Affine3d t_res = Translation3f(t2) * mat_rot * Translation3f(t1);