Я написал простую AR-программу в XNA и сейчас пытаюсь найти относительное преобразование между моими 2 маркерами.
Я расположил свои маркеры относительно моей камеры и извлек матрицы перемещения и поворота для маркеров.
Я пытаюсь найти относительный перевод, чтобы добраться до маркера2 от маркера 1. Например, если маркер 1 и маркер 2 лежат в одной плоскости Z, компонент перевода Z будет равен 0 мм.
На рисунке ниже показано приложение, работающее для двух позиций в одной плоскости:
Я предположил, что, просто умножив матрицу 2-го маркера на инверсию 1-го маркера, я получу перевод.Однако я получаю совершенно неправильные результаты.
Код, который я запускаю, выглядит следующим образом:
posit.EstimatePose (points, out matrix, out trans);
float yaw, pitch, roll;
matrix.ExtractYawPitchRoll(out yaw, out pitch, out roll);
Matrix rotation =
Matrix.CreateFromYawPitchRoll(-yaw, -pitch, roll);
Matrix translation =
Matrix.CreateTranslation(new Vector3(trans.X, trans.Y, -trans.Z));
Matrix complete = rotation * translation;
List<Matrix> all = new List<Matrix>();
all.Add(rotation);
all.Add(translation);
all.Add(complete);
matrixes.Add(all);
}
Matrix res = Matrix.Invert(matrixes[0][2]) * matrixes[1][2];
Vector3 scaleR;
Vector3 translationR;
Quaternion rotationR;
res.Decompose(out scaleR, out rotationR, out translationR);
Результат:
TranslationR: {X: -103.4285 Y: -104.1754 Z: 104.9243}
Я наложил 3D-оси на изображение, как показано выше, с использованием XNA, поэтому я предполагаю, что поворот и перемещение относительно камеры были выполненыправильно.
Кажется, что я делаю что-то не так по пути, чтобы вычислить перевод.Я определенно не ожидал бы, что Z будет равен 104 мм.Я ожидал что-то вроде:
{X: 0 Y: 150 Z: 0}