Таким образом, pybullet обычно строит матрицу проекции ( исходный код ), используя поле зрения (FOV в радианах) как
и матрица intrinsi c определяется как
p_x и p_y являются основными точками, обычно в центре изображения. Итак, есть несколько отличий:
- Размеры. Pybullet добавляет третий ряд (не четвертый) и четвертый столбец для хранения информации о глубине.
- Игнорируя третью строку, элемент 2,2 (нулевой индекс) не равен 1.
- Pybullet использует параметр смещения 0
Во-первых, pybullet использует обозначение OpenGL, поэтому он использует порядок главных столбцов ( read more ). Значение первого элемента при индексации - это столбец, а не строка. Поэтому фактическая проекционная матрица из pybullet должна быть транспонирована.
Во-вторых, полное уравнение для преобразования FOV в фокусное расстояние f:
, поэтому pybullet умножает фокусное расстояние на 2 / ч. Причина в том, что pybullet использует нормализованные координаты устройства ( ND C), которые обрезают значение между [-1,1] (деление x на ширину обрезает его до [0,1] и умножает на 2 обрезает его между [0,2], который, если главная точка находится в средней точке изображения 1,1, обрезается до [-1,1]). Поэтому фокусное расстояние pybullet - это правильное фокусное расстояние с использованием ND C.
Ненулевые значения в третьем столбце матрицы проекции предназначены для отображения значений z в OpenGL, поэтому мы можем их игнорировать.
k, l в матрице K - это отношение мм / px, если мы используем pybullet, мы можем сказать, что k = l = 1.
Некоторые полезные ресурсы: [1] , [2] и [3] .