Решить PnP с Unity3D

У меня есть реальная / физическая флешка с прикрепленной к ней ИК-камерой и некоторым ИК-светодиодом, который формирует рисунок, который я использую для того, чтобы виртуальная палка двигалась так же, как и физическая.

Для этого я использую OpenCV в Python и отправляю в Unity вектор вращения и перемещения, рассчитанный с помощью solvePnP.

Я изо всех сил пытаюсь понять, как я могу использовать результаты, полученные с помощью функции solvePnP, в своем трехмерном мире.

Пока что я сделал: используя функцию solvePnP, чтобы получить векторы вращения и перемещения. А затем использовать этот вектор вращения, чтобы переместить мою палку в 3D мире

transform.rotation = Quaternion.Euler(new Vector3(x, z, y));

Кажется, это работает нормально, когда моя палка расположена под определенным углом и если я двигаюсь медленно... но большую часть времени она движется везде.

Ища ответы онлайн, большинство людей делает еще несколько шагов после решенинпнп - из того, что я понимаю:

  1. Использование Rodrigues для преобразования вектора вращения в матрицу вращения

  2. Скопируйте матрицу вращения и вектор перевода в внешнюю матрицу.

  3. Обратная внешняя матрица

Я понимаю, что эти шаги необходимы, если я работал с матрицей, как в OpenGL - но как насчет Unity3D? Эти дополнительные шаги необходимы? Или я могу напрямую использовать векторы, заданные функцией solvePnP (в чем я сомневаюсь, так как результаты, которые у меня есть, пока не очень хорошие).

1 ответ

Это старый, но ответ на вопрос "как насчет Unity3D? Нужны ли эти дополнительные шаги? Или я могу напрямую использовать векторы, заданные функцией solvePnP"

является:

Нет, вы не можете использовать их напрямую. Я пытался конвертировать rvec, используя Quaternion.Euler, и, как вы написали, результаты были плохими.

-Да, вы должны использовать Rodrigues, который правильно конвертирует rvec в матрицу вращения.

О инверсии внешней матрицы: это зависит. Если ваш объект находится в точке (0,0,0) в мировом пространстве и вы хотите разместить камеру, вам нужно инвертировать преобразование, полученное из tvec и rvec, чтобы получить желаемый результат. Если, с другой стороны, ваша камера имеет фиксированное положение и вы хотите расположить объект относительно нее, вам нужно применить матрицу localToWorld камеры к преобразованию, полученному из rvec и tvec, чтобы получить желаемый результат.

Другие вопросы по тегам