2012-06-03 13 views
8

Ho un sistema di rilevamento marker per AR al momento, rileva i marker nella scena e fornisce la matrice di trasformazione della telecamera per ciascun marker nella scena.Ottieni matrice di rotazione tra due due matrici di trasformazione (XNA)

Diciamo che ho trovato 2 marcatori. Sto cercando di trovare la matrice di rotazione che dovrò applicare a uno dei marker per farla coincidere con l'orientamento dell'altro marker.

Ho pensato che dovrebbe essere lo stesso del calcolo della matrice di trasformazione di un marcatore a un altro e la decomposizione della trasformazione per ottenere la matrice di rotazione di eulero x, y, z ma non riesco a farlo funzionare. Sto usando C# con XNA.

in codice:

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

Ciò di cui sopra non sembra funzionare.

Un'altra domanda sarebbe come estrarre le rotazioni x, y, z euler dalla matrice di rotazione?

EDIT:

ho trovato una funzione per convertire il quaternione per euler seguente x, y, z ordine qui: http://forums.create.msdn.com/forums/p/4574/23763.aspx

Applicando questo al mio codice ho ottenuto i seguenti risultati:

enter image description here

La rotazione reale dovrebbe essere: x: y 0: 0 z: -0.52

ho anche notato che th e y e z sono cambiati molto a seconda di come ho posizionato la fotocamera.

I due trasformare matrici ottengo dal rivelatore marcatore contengono l'orientamento e la traduzione della camera rispetto ad uno dei marcatori come spiegato qui: http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm averli convertiti in formato XNA e so loro di lavorare correttamente come può disegnare gli angoli sullo schermo e si abbina a ciò che vede la telecamera.

+0

Sono quasi sicuro che gli angoli di eulero sono calcolati correttamente, ma sono dati nel sistema di coordinate relativo alla telecamera. Ma tu vuoi ottenere angoli euler rispetto al piano orizzontale, vero? – user502144

risposta

7

La soluzione che mi piace di più è l'utilizzo di quaternioni. Se avete un orientamento descritto da q1, e altre descritto da q2, si può ottenere da un orientamento verso l'altro da

q1 = q * q2

essendo q la rotazione che stai cercando.

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

Devi solo convertire da rotation to quaternion e quaternion to rotation.

Assicurati solo di normalizzare i quaternioni in modo che le equivalenze siano vere. Nelle pagine che ho linkato hai tutte le formule, le spiegazioni necessarie, persino il codice in Java, C++. Vale davvero la pena aggiungere ai preferiti.

Problemi correlati