2012-06-25 36 views
2

我知道一條線(不對稱物體的頂部和底部)中的兩個3D點,並且想要找到歐拉角(沿着x ,y和z軸)。從頂部和底部兩個三維點/一個不對稱物體矢量中提取三個歐拉角

示例:需要對OpenGL的以下代碼進行反向工程,以下是示例場景的示例。

//Translation 
glTranslated(p1.x, p1.y, p1.z); 

//Rotation 
glRotatef(rot.x, 1.0f, 0.0f, 0.0f); 
glRotatef(rot.y, 0.0f, 1.0f, 0.0f); 
glRotatef(rot.z, 0.0f, 0.0f, 1.0f); 

// Draw the object ALONG Y-AXIS 
p2 = DrawMyObject(); //p2 is top of my object 

現在,在某些情況下,我只拿到了P1和P2,我需要知道歐拉角(沿X,Y和Z軸輪替])。怎麼樣?

這是我嘗試和答案應該是器(Rx,RY,RZ):(4,-3,-11),

cv::Point3d p1, p2; 
p1.x = 0.0525498; 
p1.y = 0.0798909; 
p1.z = -1.20806; 

p2.x = 0.0586557; 
p2.y = 0.111226; 
p2.z = -1.20587; 

double dx, dy, dz; 
double angle; 

dx = p2.x - p1.x; 
dy = p2.y - p1.y; 
dz = p2.z - p1.z; 

angle = std::atan2(dy, dz); angle = RAD2DEG(angle); 
std::cout<<"\n atan2(dy, dz): "<<int(90 - angle); 

angle = std::atan2(dx, dz); angle = RAD2DEG(angle); 
std::cout<<"\n atan2(dz, dx): "<<angle; 

angle = std::atan2(dy, dx); angle = RAD2DEG(angle); 
std::cout<<"\n atan2(dy, dx): "<<int(angle -90); 

std::cout<<std::endl; 

我沒有得到確切的正確答案,尤其是旋轉沿着Y是不正確的。我認爲p1和p2都位於y軸,而沿着y軸旋轉,所以問題是。那麼什麼是最好的解決方案?

+0

一個問題是,一個單一的載體是沒有足夠的信息來確定三個角度。矢量仍然有任意的旋轉。 –

+0

嗨@VaughnCato意味着我必須得3分?任何不錯的參考? – Rudi

+0

您不一定需要三點,但您需要一些附加約束,例如總旋轉應該最小化,或三個角度之一爲零。儘管有第三點肯定是可能的。 –

回答

1
  1. 正如評論中所述,您將需要對象的第三個點或恆定的世界空間向量。請注意,使用恆定矢量可能會引入萬向節問題,具體取決於您的具體應用和線條相對於該矢量的方向,因此如果您擁有它,第三點可能更可取。
  2. 構造一個正交歸一的3×3旋轉矩陣:
    1. 使用Grahm-Schmit method到orthonormalize的前兩行,其中:
      • U1 = P2 - P1
      • U2 = P3 - P1(或恆定向量)
      • 應用Grahm-Schmit後,這些矢量將成爲3x3矩陣的前2行。
    2. 矩陣的第三行只是前兩行的交叉乘積。
  3. Decompose the resulting matrix into euler angles.
+1

我接受了你的答案,因爲這是背後的確切理論。但是,我已經使用了Eigen lib的新增功能:Eigen :: Vector3f euler_angles = Eigen :: Isometry3f(T).rotation()。eulerAngles(0,1,2);其中T是Eigen :: Matrix4f變換矩陣。 – Rudi

相關問題