2012-12-19 71 views
5

使用庫將仿射變換轉換爲等軸變換(即僅包含旋轉和平移)的最簡單方法是什麼?將本徵仿射變換轉換爲本徵等角變換

這兩種轉換都是3D的。仿射矩陣對於左上象限具有普通的3×3矩陣(即旋轉,縮放和剪切),而等軸測圖對同一象限具有3×3旋轉矩陣,因此需要投影。

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b(a); 

給人的編譯錯誤:

error C2338: YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION

同時

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b(a.rotation(), a.translation()); 

(line 2) error C2661: 'Eigen::Transform<_Scalar,_Dim,_Mode>::Transform' : no overloaded function takes 2 arguments

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b; 
b.translation() = a.translation(); 
b.rotation() = a.rotation(); 

(line 4) error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const Eigen::Matrix<_Scalar,_Rows,_Cols>' (or there is no acceptable conversion)

由於旋轉()和翻譯()函數,這個問題可以被表述爲「我最好如何設置等距的旋轉和平移分量中?」

+0

您應該指定使用的庫或工具包,因爲這些不是標準的C++類型或名稱。 – abelenky

+2

我正在使用Eigen(一個衆所周知的C++數學庫),正如我在標題和文本中所述。我會添加一個鏈接,使其更清晰。 – user664303

回答

5

.rotation()提取轉換的旋轉部分。它涉及SVD,因此它是隻讀的。在左側,你必須使用.linear():

Eigen::AffineCompact3f a; 
Eigen::Isometry3f b; 
b.translation() = a.translation(); 
b.linear() = a.rotation(); 

如果你知道,「A」是一個等距,只希望將它轉換爲等距3F,你可以簡單地做:

b = a.matrix();