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