У меня есть система обнаружения маркеров для 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
Применив это мой код, который я получил следующие результаты:
фактическое вращение должно быть: х: 0 у: 0 г: -0,52
Я также заметил, что е e y и z сильно изменились в зависимости от того, как я позиционировал камеру.
Два преобразования матрицы я получаю от детектора маркеров содержит ориентацию и перемещение камеры по отношению к одному из маркеров, как описано здесь: http://www.hitl.washington.edu/artoolkit/documentation/tutorialcamera.htm Я преобразовал их в формат XNA, и я знаю их правильно работать, как я может нарисовать углы на экране, и это соответствует тому, что видит камера.
Я почти уверен, что углы Эйлера рассчитаны правильно, но они заданы в системе координат, связанной с камерой. Но вы хотите получить углы Эйлера относительно горизонтальной плоскости, не так ли? – user502144