2012-06-03 23 views
8

Ich habe ein Marker-Erkennungssystem für AR im Moment, es erkennt Marker in der Szene und gibt die Transformationsmatrix der Kamera für jeden Marker in der Szene.Get Rotationsmatrix zwischen zwei zwei Transformationsmatrizen (XNA)

Sagen wir, ich habe 2 Marker gefunden. Ich versuche die Rotationsmatrix zu finden, die ich auf einen der Marker anwenden muss, um die Ausrichtung des anderen Markers zu erreichen.

Ich dachte, es sollte das gleiche sein wie die Transformationsmatrix von einem Marker zum anderen zu berechnen und die Transformation zu zerlegen, um die x, y, z euler Rotationsmatrix zu erhalten, aber ich kann das nicht zum Laufen bringen. Ich verwende C# mit XNA.

In Code:

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); 

Die oben scheint nicht zu funktionieren.

Eine andere Frage wäre, wie man die x, y, z euler Rotationen aus der Rotationsmatrix extrahiert?

EDIT:

fand ich eine Funktion, um die quaternion zu euler folgenden x, y, z, um hier zu konvertieren: http://forums.create.msdn.com/forums/p/4574/23763.aspx

Angewandt auf meinen Code ich die folgenden Ergebnisse erhielt:

enter image description here

Die tatsächliche Rotation sollte sein: x: 0 y: 0 z: -0,52

ich habe auch bemerkt, dass th Je nachdem, wie ich die Kamera positioniert habe, haben sich die Einstellungen y und z stark geändert.

Die beiden Transformationsmatrizen ich von dem Marker Detektor erhalten enthalten, die Orientierung und die Translation der Kamera in Bezug auf eine der Markierungen wie hier erklärt: http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm Ich habe sie nach XNA-Format konvertiert und ich kenne sie, wie ich richtig arbeiten kann die Ecken auf den Bildschirm zeichnen und es entspricht, was die Kamera sieht.

+0

Ich bin mir fast sicher, dass Euler-Winkel korrekt berechnet werden, aber sie sind im Koordinatensystem der Kamera angegeben. Aber du willst euler Winkel relativ zur Horizontalen sehen, oder? – user502144

Antwort

7

Die Lösung, die ich am meisten mag, ist die Verwendung von Quaternionen. Wenn Sie eine beschriebene Orientierung von q1 und andere beschrieben durch q2, können Sie von einer Ausrichtung auf die andere erhalten, indem

q1 = q * q2

sein q die Rotation, nach der Sie suchen.

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

Sie müssen nur von rotation to quaternion und quaternion to rotation konvertieren.

Stellen Sie nur sicher, dass Sie Quaternionen normalisieren, so dass die Äquivalenzen wahr sind. In den Seiten, die ich verlinkt habe, hast du alle notwendigen Formeln, Erklärungen, sogar Code in Java, C++. Wirklich wert, zu den Lieblingen hinzugefügt zu werden.

Verwandte Themen