2012-06-03 15 views
8

Tengo un sistema de detección de marcador para AR en este momento, detecta marcadores en la escena y da la matriz de transformación de la cámara para cada marcador en la escena.Obtener matriz de rotación entre dos matrices de transformación (XNA)

Digamos que he encontrado 2 marcadores. Estoy tratando de encontrar la matriz de rotación que tendré que aplicar a uno de los marcadores para que coincida con la orientación del otro marcador.

Pensé que debería ser lo mismo que calcular la matriz de transformación de un marcador a otro y descomponer la transformación para obtener la matriz de rotación x, y, z euler, pero parece que no puedo hacer que funcione. Estoy usando C# con XNA.

En código:

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

Esto anterior no parece funcionar.

Otra pregunta sería cómo extraer las rotaciones x, y, z euler de la matriz de rotación?

EDIT:

encontré una función para convertir el cuaternión de Euler siguiente x, y, orden z aquí: http://forums.create.msdn.com/forums/p/4574/23763.aspx

Aplicando esto a mi código que me dieron los siguientes resultados:

enter image description here

La rotación real debe ser: x: 0 y: 0 z: -0,52

I también notó que ésimo e y y z cambiaron mucho dependiendo de cómo coloqué la cámara.

Los dos transformar las matrices que obtener del detector de marcador contienen la orientación y la traducción de la cámara con respecto a uno de los marcadores como se explica aquí: http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm los he convertido al formato de XNA y sé que funcionen correctamente como yo puede dibujar las esquinas en la pantalla y coincide con lo que la cámara está viendo.

+0

Estoy casi seguro de que los ángulos de euler se calculan correctamente, pero se dan en el sistema de coordenadas relacionado con la cámara. Pero quieres obtener ángulos de Euler relativos al plano horizontal, ¿no? – user502144

Respuesta

7

La solución que más me gusta es usar cuaterniones. Si usted tiene uno orientación descrita por Q1, y otra descrito por Q2, se puede obtener de una orientación a la otra por

q1 = q * Q2

siendo q la rotación que estás buscando

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

Sólo tiene que convertir de rotation to quaternion y quaternion to rotation.

Solo asegúrate de normalizar los cuaterniones para que las equivalencias sean verdaderas. En las páginas que he vinculado tienes todas las fórmulas necesarias, explicaciones, incluso código en Java, C++. Realmente vale la pena agregar a favoritos.

Cuestiones relacionadas