Попытка найти относительную трансформацию между двумя позициями - XNA - PullRequest
2 голосов
/ 01 января 2012

Я написал простую AR-программу в XNA и сейчас пытаюсь найти относительное преобразование между моими 2 маркерами.

Я расположил свои маркеры относительно моей камеры и извлек матрицы перемещения и поворота для маркеров.

Я пытаюсь найти относительный перевод, чтобы добраться до маркера2 от маркера 1. Например, если маркер 1 и маркер 2 лежат в одной плоскости Z, компонент перевода Z будет равен 0 мм.

На рисунке ниже показано приложение, работающее для двух позиций в одной плоскости:

enter image description here

Я предположил, что, просто умножив матрицу 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}

Ответы [ 2 ]

0 голосов
/ 02 января 2012

То, что я пытаюсь сделать, это выяснить относительный перевод, чтобы получить на маркер 2 от маркера 1.

Vector3 relativeTranslation = Marker2Matrix.Translation - marker1Matrix.Translation;

Мой ответ кажется слишком упрощенным, поэтому, возможно, я не совсем понял ваш вопрос, но он создаст вектор, который при добавлении в местоположение (перевод) Marker1 приведет вас к местоположению Marker 2.

0 голосов
/ 01 января 2012

Я уже делал нечто похожее на это раньше, однако он использовал матрицы 3х3 в 2D-среде (с X, Y Translate, Rotate, Skew). Матрицы в вопросе 4х4?

Да, вы правы, чтобы найти матрицу для преобразования объекта A с матрицей M1 в объект B с матрицей M2, вы можете вычислить M1 '* M2 (где M1' - обратное).

Проблема, с которой вы можете столкнуться, состоит в том, что матрица состоит из поворота, перемещения, масштабирования и других преобразований (например, перекоса / перспективы). Разложение матрицы на составные части часто дает недетерминированный ответ. Это как квадратные уравнения, есть более одного решения.

Другая проблема может заключаться в том, что матричные операции не являются коммутативными, и вы просто выполняете их неправильно. Если вы выполните M1 '* M2 и M2 * M1', вы получите разные результаты.

Пожалуйста, попробуйте (переключение порядка матрицы). Также я бы посмотрел используемую вами функцию декомпозиции матрицы - какое значение Rotation & Scaling вы получаете на выходе? Ваши объекты вращаются или масштабируются? Если нет, то вы должны получить ноль. Обратите внимание, что для получения одного и того же конечного результата можно использовать несколько решений ротации + сдвига, а функция декомпозиции не знает, что именно вы ищете.


Чтобы извлечь только компонент перевода, вы можете использовать методы эта страница :

vt = (M14, M24, M34)T

Что вы получите, когда попробуете это?

...