2013-03-06 71 views
2

我移植的程序,以徵改變的變換矩陣。如何找到依據與本徵

現在我不得不重寫返回3D變換矩陣從一個座標系A,由它的起源和兩個軸所定義,一個第二座標系,通過原點和兩個軸仍然定義的方法。

我在想,如果有一個在本徵的方法來查找矩陣。我瀏覽的參考指南,但我沒有發現任何有用的方法還...


更詳細:

的方法,我移植到本徵接受6點(矢量)(FR0,FR1 ,fr2,to0,to1,to2)。 「FR0」是CS1的原點(座標系1)中,「FR1」是定義CS1的軸線的點,「FR2」是定義CS1的第二軸上的點; 「TO0」是CS2的起源,等等...

+1

呃,產地+兩軸不能唯一地確定一個座標系,第三軸可以去在兩個不同方向。這是如何指定的? – us2012 2013-03-06 16:42:19

+0

你說得對,我應該提到。在我們的代碼中,Z被簡單地定義爲一個單位向量x.cross(y).normalized()。 – rmbianchi 2013-03-07 16:19:29

回答

3

好吧,我找到了解決方案,我張貼在這裏以供參考。我希望它對其他人也有用。

其實ggael的回答引發了合適的解決方案,所以很多感謝他和+1他。


#include <Eigen/Geometry> 

typedef Eigen::Affine3d Transformation; 
typedef Eigen::Vector3d Point; 
typedef Eigen::Vector3d Vector; 
typedef Eigen::Translation<double,3> Translation; 

Transformation findTransformBetween2CS(Point fr0,Point fr1,Point fr2,Point to0,Point to1,Point to2) { 

    Transformation T, T2, T3 = Transformation::Identity(); 
    Vector3d x1,y1,z1, x2,y2,z2; 

    // Axes of the coordinate system "fr" 
    x1 = (fr1 - fr0).normalized(); // the versor (unitary vector) of the (fr1-fr0) axis vector 
    y1 = (fr2 - fr0).normalized(); 

    // Axes of the coordinate system "to" 
    x2 = (to1 - to0).normalized(); 
    y2 = (to2 - to0).normalized(); 

    // transform from CS1 to CS2 
    // Note: if fr0==(0,0,0) --> CS1==CS2 --> T2=Identity 
    T2.linear() << x1, y1, x1.cross(y1); 

    // transform from CS1 to CS3 
    T3.linear() << x2, y2, x2.cross(y2); 

    // T = transform to CS2 to CS3 
    // Note: if CS1==CS2 --> T = T3 
    T.linear() = T3.linear() * T2.linear().inverse(); 


    T.translation() = t0; 

    return T; 

} 

靈感也是從這個職位:

https://gamedev.stackexchange.com/questions/26084/transform-between-two-3d-cartesian-coordinate-systems

+1

見https://github.com/PointCloudLibrary/pcl/blob/master/common/include/pcl/common/impl/eigen.hpp#L944的工作代碼 – 2015-01-05 16:19:08

4

沒有必要爲一個特殊功能,只需使用逗號初始化:

Matrix4f M; 
M << X, Y, X.cross(Y), O, 
    0, 0, 0,   1; 

這個假設兩個軸X和Y幺正和正交。 O是原點。

您也可以查看幾何module以獲得更高級的空間轉換類和函數,例如轉換<>類。下面是使用Affine3f的typedef來代替原始矩陣相同爲例:

Affine3f M; 
M.linear() << X, Y, X.cross(Y); 
M.translation(O); 
+0

非常感謝您的回答Ggael。但實際上,我需要找到從一個座標系A到另一個座標系B的轉換,其中4軸和2個原點作爲參數。我的意思是:我已經有了一個用「手工」代碼來做這件事的方法;但我想知道Eigen是否有這些計算的有用功能。 – rmbianchi 2013-03-07 13:07:51

+0

我加了一些細節原來的問題 – rmbianchi 2013-03-07 16:20:30