簡體   English   中英

本征變換的優先順序以及預翻譯和翻譯之間的差異

[英]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 translatetranslate區別在於它們是從右側還是左側應用參數

A.pretranslate(B)

在左邊應用B ,返回B*A ,而

A.translate(B)

從右邊應用它,返回A*B

關於順序, A.translate(B)返回對所得​​矩陣的引用,因此它將迭代調用上一個操作的結果的translate / rotate

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

但是由於矩陣乘法是關聯的,因此運算的順序僅在涉及浮點表示形式的數值誤差時才重要。

但是,矩陣的順序確實會影響結果(因為乘法不是可交換的),這就是為什么pretranslate translatetranslate給出不同結果的原因。


編輯:正如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM