我对合并变换时本征使用的顺序有点困惑。
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 )
?
答案 0 :(得分:3)
pretranslate
和translate
的区别在于它们是从右侧还是从左侧应用参数
A.pretranslate(B)
在左侧应用B
,返回B*A
,而
A.translate(B)
从右边应用它,返回A*B
。
关于顺序,A.translate(B)
返回对所得矩阵的引用,因此它将对上一个操作的结果进行迭代调用translate
/ rotate
,
t_res = (((t_res* t1) * t2) * t3 )
但是由于矩阵乘法是关联的,因此运算的顺序仅在涉及浮点表示形式的数值误差时才重要。
但是,矩阵的顺序确实会影响结果(因为乘法不是可交换的),这就是pretranslate
和translate
给出不同结果的原因。
编辑:正如ggael所指出的那样,对于t_res
作为标识,两个版本应给出相同的结果
答案 1 :(得分:2)
Kai已经回答了您的问题,但我强烈建议您避免使用这些函数并编写明确的代码:
Vector3d t1, t2;
Matrix3d mat_rot;
Affine3d t_res = Translation3f(t2) * mat_rot * Translation3f(t1);