[英]Precedence in Eigen transformations and difference between pretranslate and translate
我對合並變換時本征使用的順序有些困惑。
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
和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
和translate
給出不同結果的原因。
編輯:正如ggael所指出的,對於t_res
為標識,兩個版本應給出相同的結果
Kai已經回答了您的問題,但是我強烈建議您避免使用這些函數並編寫明確的代碼:
Vector3d t1, t2;
Matrix3d mat_rot;
Affine3d t_res = Translation3f(t2) * mat_rot * Translation3f(t1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.