本征变换的优先级以及预翻译和翻译之间的区别
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 )
?
pretranslate
和 translate
的区别在于它们是从右边还是从左边应用参数
A.pretranslate(B)
从左边应用 B
,返回 B*A
,而
A.translate(B)
从右边应用它,返回 A*B
。
关于顺序,A.translate(B)
returns 对结果矩阵的引用,所以它会迭代地调用 translate
/rotate
上一个操作的结果,做
t_res = (((t_res* t1) * t2) * t3 )
但是由于矩阵乘法是关联的,因此只有当涉及到浮点表示引起的数值错误时,运算的顺序才重要。
但是矩阵的顺序确实会影响结果(因为乘法不可交换),这就是为什么 pretranslate
和 translate
给出不同的结果。
编辑:正如 ggael 所指出的,对于 t_res
作为标识,两个版本应该给出相同的结果
Kai 已经回答了你的问题,但我强烈建议避免使用这些函数并编写明确的代码:
Vector3d t1, t2;
Matrix3d mat_rot;
Affine3d t_res = Translation3f(t2) * mat_rot * Translation3f(t1);
我对组合转换时 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 )
?
pretranslate
和 translate
的区别在于它们是从右边还是从左边应用参数
A.pretranslate(B)
从左边应用 B
,返回 B*A
,而
A.translate(B)
从右边应用它,返回 A*B
。
关于顺序,A.translate(B)
returns 对结果矩阵的引用,所以它会迭代地调用 translate
/rotate
上一个操作的结果,做
t_res = (((t_res* t1) * t2) * t3 )
但是由于矩阵乘法是关联的,因此只有当涉及到浮点表示引起的数值错误时,运算的顺序才重要。
但是矩阵的顺序确实会影响结果(因为乘法不可交换),这就是为什么 pretranslate
和 translate
给出不同的结果。
编辑:正如 ggael 所指出的,对于 t_res
作为标识,两个版本应该给出相同的结果
Kai 已经回答了你的问题,但我强烈建议避免使用这些函数并编写明确的代码:
Vector3d t1, t2;
Matrix3d mat_rot;
Affine3d t_res = Translation3f(t2) * mat_rot * Translation3f(t1);