2012-06-03 2 views
8

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

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

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

EDIT:

Я нашел функцию, чтобы преобразовать кватернион Эйлеру следующий х, у, г порядка здесь: http://forums.create.msdn.com/forums/p/4574/23763.aspx

Применив это мой код, который я получил следующие результаты:

enter image description here

фактическое вращение должно быть: х: 0 у: 0 г: -0,52

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

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

+0

Я почти уверен, что углы Эйлера рассчитаны правильно, но они заданы в системе координат, связанной с камерой. Но вы хотите получить углы Эйлера относительно горизонтальной плоскости, не так ли? – user502144

ответ

7

Решение, которое мне больше всего нравится, - это использование кватернионов. Если одна ориентация описывается q1, и другие описываемого q2, вы можете получить от одной ориентации на другую

q1 = д * q2

будучи д вращение, которое вы ищете.

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

Вам просто нужно преобразовать из rotation to quaternion и quaternion to rotation.

Просто убедитесь, что вы нормализуете кватернионы, чтобы эквивалентность верна. На связанных страницах вы имеете все необходимые формулы, объяснения, даже код в Java, C++. На самом деле стоит добавить в избранное.