本征变换的优先级以及预翻译和翻译之间的区别

Precedence in Eigen transformations and difference between pretranslate and translate

我对组合转换时 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 )

?

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

A.pretranslate(B)

从左边应用 B,返回 B*A,而

A.translate(B)

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

关于顺序,A.translate(B) returns 对结果矩阵的引用,所以它会迭代地调用 translate/rotate 上一个操作的结果,做

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

但是由于矩阵乘法是关联的,因此只有当涉及到浮点表示引起的数值错误时,运算的顺序才重要。

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


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

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

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