Решить PnP с Unity3D
У меня есть реальная / физическая флешка с прикрепленной к ней ИК-камерой и некоторым ИК-светодиодом, который формирует рисунок, который я использую для того, чтобы виртуальная палка двигалась так же, как и физическая.
Для этого я использую OpenCV в Python и отправляю в Unity вектор вращения и перемещения, рассчитанный с помощью solvePnP.
Я изо всех сил пытаюсь понять, как я могу использовать результаты, полученные с помощью функции solvePnP, в своем трехмерном мире.
Пока что я сделал: используя функцию solvePnP, чтобы получить векторы вращения и перемещения. А затем использовать этот вектор вращения, чтобы переместить мою палку в 3D мире
transform.rotation = Quaternion.Euler(new Vector3(x, z, y));
Кажется, это работает нормально, когда моя палка расположена под определенным углом и если я двигаюсь медленно... но большую часть времени она движется везде.
Ища ответы онлайн, большинство людей делает еще несколько шагов после решенинпнп - из того, что я понимаю:
Использование Rodrigues для преобразования вектора вращения в матрицу вращения
Скопируйте матрицу вращения и вектор перевода в внешнюю матрицу.
- Обратная внешняя матрица
Я понимаю, что эти шаги необходимы, если я работал с матрицей, как в OpenGL - но как насчет Unity3D? Эти дополнительные шаги необходимы? Или я могу напрямую использовать векторы, заданные функцией solvePnP (в чем я сомневаюсь, так как результаты, которые у меня есть, пока не очень хорошие).
1 ответ
Это старый, но ответ на вопрос "как насчет Unity3D? Нужны ли эти дополнительные шаги? Или я могу напрямую использовать векторы, заданные функцией solvePnP"
является:
Нет, вы не можете использовать их напрямую. Я пытался конвертировать rvec, используя Quaternion.Euler, и, как вы написали, результаты были плохими.
-Да, вы должны использовать Rodrigues, который правильно конвертирует rvec в матрицу вращения.
О инверсии внешней матрицы: это зависит. Если ваш объект находится в точке (0,0,0) в мировом пространстве и вы хотите разместить камеру, вам нужно инвертировать преобразование, полученное из tvec и rvec, чтобы получить желаемый результат. Если, с другой стороны, ваша камера имеет фиксированное положение и вы хотите расположить объект относительно нее, вам нужно применить матрицу localToWorld камеры к преобразованию, полученному из rvec и tvec, чтобы получить желаемый результат.