В настоящее время я пытаюсь нарисовать трехмерное представление углов Эйлера в двухмерном изображении (без графических окон opengl или 3d). Вывод изображения может быть таким же, как показано ниже.
По сути, я ищу исследование или алгоритм, который может взять матрицу вращения или набор углов Эйлера и затем вывести их на 2-мерное изображение, как показано выше. Это будет реализовано в приложении C ++, которое использует OpenCV. Он будет использоваться для вывода информации аннотации в окне OpenCV в зависимости от состояния объекта.
Я думаю, что я слишком много думаю об этом, потому что я должен быть в состоянии разложить единичные векторы из матрицы вращения, а затем извлечь их компоненты x, y и нарисовать линию в декартовом пространстве из (0,0). Я прав в этом мышлении?
РЕДАКТИРОВАТЬ: Я ищу ортографическую проекцию. Вы можете предположить, что изображение выше имеет правильную камеру / угол обзора.
Любая помощь будет оценена.
Спасибо,
РЕДАКТИРОВАТЬ: Пример исходного кода теперь можно найти в моем репо.
Заголовок: https://bitbucket.org/jluzwick/tennisspindetector/src/6261524425e8d80772a58fdda76921edb53b4d18/include/projection_matrix.h?at=master
Определения класса: https://bitbucket.org/jluzwick/tennisspindetector/src/6261524425e8d80772a58fdda76921edb53b4d18/src/projection_matrix.cpp?at=master
Это не лучший код, но он работает и показывает шаги, необходимые для получения матрицы проекции, описанной в принятом ответе.
Также вот YouTube-видео с проекционной матрицей в действии (наряду с добавлением масштаба и перевода): http://www.youtube.com/watch?v=mSgTFBFb_68
Вот мои два цента. Надеюсь, поможет.
Если я правильно понимаю, вы хотите повернуть 3D система координат, а затем проецировать ее ортогонально на заданный 2D самолет (2D плоскость определяется относительно оригинала, не повернута 3D система координат).
«Вращение и проектирование 3D система координат «вращается» 3D базисные векторы и проецирование их ортогонально на 2D самолет, чтобы они стали 2D векторы по отношению к 2D Основа плоскости «. Пусть оригинал 3D векторы не загрунтованы и в результате 2D векторы должны быть загрунтованы. Позволять {e1, e2, e3} = {e1..3} быть 3D ортонормированный базис (который дан), и {e1 ‘, e2’} = {e1..2 ‘} быть 2D ортонормированный базис (который мы должны определить). По сути, нам нужно найти такой оператор PR тот PR * v = v ‘.
Хотя мы можем много говорить о линейной алгебре, операторах и матричном представлении, это было бы слишком длинно для поста. Достаточно сказать, что:
Давайте найдем п матрица проекции, такая как 3D вектор УЙ линейно превращается в 2D вектор v» на 2D плоскость с ортонормированным базисом {E1..2′ }.
2D плоскость может быть легко определена вектором, нормальным к нему. Например, из цифр в ОП, кажется, что наши 2D плоскость (плоскость бумаги) имеет нормальный единичный вектор п = 1 / SQRT (3) * (1, 1, 1). Нам нужно найти 2D основа в 2D плоскость определяется этим N. Поскольку любые два линейно независимых вектора лежат в нашем 2D Плоскость образовала бы такой базис, вот бесконечное количество таких базисов. Исходя из геометрии задачи и ради простоты, наложим два дополнительных условия: во-первых, база должна быть ортонормированной; во-вторых, должен быть визуально привлекательным (хотя это несколько субъективное условие). Как легко увидеть, такая основа формируется в грунтованной системе тривиально e1 ‘= (1, 0)’ = Икс’-ось (горизонтальная, в положительном направлении слева направо) и e2 ‘= (0, 1)’ = у»-ось (вертикальная, в положительном направлении снизу вверх).
Давайте теперь найдем это {e1 ‘, e2’} 2D основа в {} E1..3 3D основа.
2×3 матрица проекции п для 2D плоскость определяется п = 1 / SQRT (3) * (1, 1, 1) затем определяется как:
( -1/sqrt(2) 1/sqrt(2) 0 )
( -1/sqrt(6) -1/sqrt(6) 2/sqrt(6) )
где первый, второй и третий столбцы преобразуются {} E1..3 3D основа на нашем 2D основа {E1..2′ }, то есть e1 = (1, 0, 0) от 3D база имеет координаты (-1 / кв.м. (2), -1 / кв.м. (6)) в нашем 2D основа и тд.
Чтобы проверить результат, мы можем проверить несколько очевидных случаев:
Чтобы решить проблему. Теперь мы построили проекционную матрицу п от 3D в 2D для произвольно выбранного 2D самолет. Теперь мы можем проецировать любой вектор, предварительно повернутый матрицей вращения. р, на эту плоскость. Например, повернутая оригинальная основа {R * e1, R * e2, R * e3}. Более того, мы можем умножить с учетом п а также р получить матрицу преобразования вращения-проекции PR = P * R.
Постскриптум Реализация C ++ оставлена как домашнее задание;).
Матрица вращения будет легко отображаться,
Матрица вращения может быть построена с использованием нормального, бинормального и касательного.
Вы должны быть в состоянии получить их обратно следующим образом:
Bi-Normal (y') : matrix[0][0], matrix[0][1], matrix[0][2]
Normal (z') : matrix[1][0], matrix[1][1], matrix[1][2]
Tangent (x') : matrix[2][0], matrix[2][1], matrix[2][2]
С помощью преобразования перспективы вы можете добавить перспективу (x, y) = (x / z, y / z)
Чтобы получить орфографический проект, подобный показанному, вам нужно будет умножить на другую фиксированную матрицу вращения, чтобы перейти к виду «камера» (45 ° вправо и затем вверх)
Затем вы можете умножить свои конечные точки x (1,0,0), y (0,1,0), z (0,0,1) и центр (0,0,0) на конечную матрицу, используя только координаты х, у.
центр всегда должен преобразовываться в 0,0,0
Затем вы можете масштабировать эти значения, чтобы нарисовать 2D холст.