2012-06-03 187 views
8

我現在有一個針對AR的標記檢測系統,它檢測場景中的標記併爲場景中的每個標記提供相機的變換矩陣。獲取兩個變換矩陣之間的旋轉矩陣(XNA)

比方說,我找到了2個標記。我試圖找到旋轉矩陣,我將必須將其應用於其中一個標記以使其與另一個標記的方向相匹配。

我認爲它應該與計算一個標記到另一個標記的變換矩陣和分解變換以獲得x,y,zuler旋轉矩陣相同,但我似乎無法得到它的工作。我正在使用C#和XNA。

在代碼:

Matrix marker1 = markerTransforms[0]; 
Matrix marker2 = markerTransforms[1]; 

Matrix relativeTransform = Matrix.Invert(marker1) * marker2; 

Quaternion rotation; 
Vector3 scale; 
Vector3 translation; 
relativeTransform.Decompose(out scale, out rotation, out translation); 
Matrix rotationMatrix = Matrix.CreateFromQuaternion(rotation); 

這上面似乎並沒有工作。

另一個問題是如何從旋轉矩陣中提取出x,y,z歐拉旋轉?

編輯:

我發現了一個功能到四元數歐拉轉換之後,X,Y,Z順序在這裏:http://forums.create.msdn.com/forums/p/4574/23763.aspx

將此應用於我的代碼,我得到了以下結果:

enter image description here

實際旋轉應該是:X:0 Y:0 Z:-0.52

我也注意到,日根據我如何定位相機,e和z變化很大。

兩個變換矩陣我從標記檢測獲得含有相對於相機的方向和翻譯的標誌之一,因爲這裏解釋:http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm 我讓他們轉換成XNA格式的,我知道他們爲我正常工作可以將角落畫到屏幕上,並與相機所看到的相匹配。

+0

我幾乎可以肯定,歐拉角的計算是正確的,但它們是在與相機相關的座標系中給出的。但是你想要相對於水平面獲得歐拉角度,不是嗎? – user502144

回答

7

我最喜歡的解決方案是使用四元數。如果您已經通過Q1,以及其他由Q2描述描述的一個方向,你可以通過

Q1 = Q * Q2

•從一個方向到另一個獲得你正在尋找的旋轉。

q = q1 *(q2)^ - 1; q = q1 * conj(q2);

你只需要從rotation to quaternionquaternion to rotation轉換。

只要確保四元數歸一化,所以等價就是真的。在我鏈接的頁面中,您擁有所有必需的公式,解釋,甚至是Java,C++中的代碼。真的值得添加到收藏夾。