Получить матрицу вращения между двумя двумя матрицами преобразования (XNA)

У меня на данный момент есть система обнаружения маркеров для AR, она определяет маркеры в сцене и выдает матрицу преобразования камеры для каждого маркера в сцене.

Допустим, я нашел 2 маркера. Я пытаюсь найти матрицу поворота, которую мне придется применить к одному из маркеров, чтобы он соответствовал ориентации другого маркера.

Я полагал, что это должно быть таким же, как вычисление матрицы преобразования одного маркера в другой и разложение преобразования для получения матрицы вращения Эйлера x, y, z, но я не могу заставить это работать. Я использую С# с 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

Я также заметил, что y и z сильно изменились в зависимости от как я расположил камеру.

Две матрицы преобразования, которые я получаю от детектора маркеров, содержат ориентацию и перемещение камеры относительно одного из маркеров, как описано здесь: http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm Я преобразовал их в формат XNA и знаю, что они работают правильно, поскольку я могу рисовать углы на экране, и это совпадает с тем, что видит камера.

8
задан Blau 4 June 2012 в 09:04
поделиться