Есть результаты Google и сообщения stackoverflow, которые, кажется, отвечают на этот вопрос, но простой факт — я не могу понять их. Независимо от того, сколько я читаю, я не могу понять, что такое кватернионы, углы Эйлера, преобразования Родригеса и все такое.
Кто-нибудь может объяснить мне, как будто мне 12 лет, как получить из векторов поворота и перемещения, возвращаемых методом OpenPV solvePnP (), значения xyz Position и xyz Rotation, которые я могу подключить к приложению для трехмерной графики?
Это для приложения дополненной реальности в C ++. У меня есть часть OpenCV, запущенная, отслеживающая маркерную доску и отправляющая векторы вращения и перемещения в графическую программу, но я не знаю, как использовать эту информацию для постановки моего трехмерного объекта.
Я действительно хочу понять математику, стоящую за этим, и буду благодарен любому терпеливому объяснению теории здесь. Но я также соглашусь на указатель на некоторый код, который я могу скопировать / вставить и изучить теорию в другой день. На самом деле я, кажется, учусь таким вещам быстрее, видя конкретный код и возвращаясь к теории.
РЕДАКТИРОВАТЬ:
Как есть этот… что явно должно указывать мне правильное направление, но это могут быть также планы относительно машины времени, насколько я знаю. Мне пришло в голову, что я могу попросить исправить математику в средней школе, но это не может быть в первый раз.
РЕДАКТИРОВАТЬ:
Ниже приведен пример того, как вектор вращения и вектор перевода возвращаются из solvePnP () …, преобразованного в XML для поездки в графическое приложение. Обратите внимание, что каждый из них, который я видел, содержит три строки и один столбец.
<Tvec type_id="opencv-matrix">
<rows>3</rows>
<cols>1</cols>
<dt>f</dt>
<data>
-2.50094433e+01 -6.59909010e+00 1.07882790e+02
</data>
</Tvec>
<Rvec type_id="opencv-matrix">
<rows>3</rows>
<cols>1</cols>
<dt>f</dt>
<data>
-1.92100227e+00 -2.11300254e-01 2.80715879e-02
</data>
</Rvec>
Изначально я ничего не знал о том, какие форматы использует OpenCV. Итак, сначала немного исследований. Смотря на документация для solvePnP
, похоже, что он возвращает матрицу. (The Rodrigues2
функция упоминается в более старой версии в документации появляется быть названным Rodrigues
Эти дни.)
Описание в нем указывает, что вы можете ожидать матрицу с одной строкой или одним столбцом. Направление этого вектора указывает ось вращения, а длина (или «норма») вектора дает угол.
Таким образом, ваш вклад в представление по оси угла. Что вы можете интерпретировать как одновременный вращение о Икс, Y а также Z Оси. Так что, если под «вращением XYZ» вы подразумеваете одновременное вращение, то вы уже там. Если, однако, вы имеете в виду некоторую комбинацию, которая вращается в первую очередь о Икс ось и затем о Y ось и затем о Z Ось, вы находитесь в странной настройке, и, вероятно, должны убедиться, что вы используете правильный API.
Если это Эйлеровы углы вы после, то называть их «вращение XYZ» несколько вводит в заблуждение. Статья в википедии Формализмы вращения в трех измерениях дает список различных форматов, и как конвертировать между ними. В частности, он дает формулы для преобразования из оси и угла в матрицу и оттуда в углы Эйлера.
Убедитесь, что вы используете правильное представление, соответствующее вашему графическому устройству вывода. Или, если у вас есть выбор, попробуйте поработать непосредственно над матрица вращения представление, так как это должно быть проще для понимания и работы.
Расширьте ваши трехмерные векторы до однородных координат (4D). Это означает 4D вектор с компонентами (X, Y, Z, 1)
Создайте матрицу преобразования 4×4 на основе параметров вращения и перевода. Это называется аффинным преобразованием. Вы находитесь на правильном пути со статьей о матрицах вращения.
Умножьте свои координатные векторы на матрицу преобразования.
Проверьте этот раздел википедии: http://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations
Он имеет пример, заданный в 2d координатах, я уверен, что вам хватит идеи перейти на 3d.
Я предполагаю, что OpenCv уже возвращает XYZ вращения. Возьми левую руку (правило левой руки) и закрой кулак. Поднимите большой палец вверх (ось z), вытяните указательный палец прямо перед собой (ось x), а затем вытяните средний палец вправо (ось y).
Любой конкретный вектор ориентации может быть задан с помощью трех поворотов. Важно понимать, что вы можете получить эквивалентные вращения. Например, поверните вокруг оси z, чтобы ваш указатель указывал направо. Эквивалентное вращение будет Y, X, затем Y снова, без вовлечения оси Z.
Однако, когда вы используете полную матрицу вращения (3×3), вам не нужно беспокоиться об этих соглашениях, потому что все они объединены в матрицу. Это то, о чем вы пишете, а не о путешествии во времени, что удачно, поскольку большинство математиков могут путешествовать во времени, обрекая человечество.
Однако векторы вращения обычно относятся к тому, вокруг какого вектора в пространстве должен вращаться ваш объект.