2012-01-01 3 views
2

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

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

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

Изображение ниже приложение работает на 2 позиции по одной и той же плоскости:

enter image description here

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

код Я бегу следующим образом:

posit.EstimatePose (точки, из матрицы, из транс);

  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: Y -103,4285: -104,1754 Z: 104,9243}

Я накладными 3D-осей на изображение, как показано выше, с использованием XNA, так что я полагаю, поворот и трансляция относительно камеры были разработаны правильно.

Кажется, что я делаю что-то неправильно, чтобы вычислить перевод. Я бы определенно не ожидал, что Z будет равняться 104 мм. Я что-то вдоль линий ожидали:

{X: 0 Y: 150 Z: 0}

ответ

0

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

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

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

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

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


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

vt = (M14, M24, M34)T 

Что вы получаете, когда вы пытаетесь что?

0

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

Vector3 relativeTranslation = Marker2Matrix.Translation - marker1Matrix.Translation; 

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

Смежные вопросы