Поле зрения + Соотношение сторон + Матрица вида из матрицы проекции (HMD OST Calibration)
В настоящее время я работаю над приложением дополненной реальности. Целевым устройством является оптический видоискатель HMD. Мне необходимо откалибровать его дисплей для правильной регистрации виртуальных объектов. Я использовал эту реализацию SPAAM для Android, чтобы сделать это, и результат достаточно точен для моих целей.
Моя проблема в том, что приложение калибровки выдает на выходе матрицу проекции 4x4, которую я мог бы использовать непосредственно с OpenGL для примера. Но я использую платформу дополненной реальности, которая принимает только параметры оптической калибровки в формате Field of view, некоторый параметр + Aspect Ratio, некоторый параметр + 4x4 View matrix.
Вот что у меня есть:
Правильный результат калибровки в неправильном формате:
6.191399, 0.114267, -0.142429, -0.142144
-0.100027, 11.791289, 0.05604, 0.055928
0.217304,-0.486923, -0.990243, -0.988265
0.728104, 0.005347, -0.197072, 0.003122
Вы можете посмотреть на код, который генерирует этот результат здесь.
Что я понимаю, так это метод активного выравнивания по одной точке, создающий матрицу 3х4, а затем программа умножает эту матрицу на матрицу ортогональной проекции, чтобы получить приведенный выше результат. Вот параметр, используемый для получения ортогональной матрицы:
near : 0.1, far : 100.0, right : 960, left : 0, top : 540, bottom: 0
Неверный результат калибровки в правильном формате:
Param 1 : 12.465418
Param 2 : 1.535465
0.995903, -0.046072, 0.077501, 0.000000
0.050040, 0.994671, -0.047959, 0.000000
-0.075318, 0.051640, 0.992901, 0.000000
114.639359, -14.115030, -24.993097, 1.000000
У меня нет никакой информации о том, как эти результаты получены.
Я читаю эти параметры из двоичных файлов, и я не знаю, хранятся ли матрицы в основной форме строки или столбца. Таким образом, две матрицы, возможно, придется транспонировать.
Мой вопрос: возможно ли, и если да, как получить эти три параметра из первой матрицы проекции, которую я имею?
1 ответ
Возможно ли, и если да, как получить эти три параметра из матрицы проекции, которую я имею?
Матрица проекции и матрица вида описывают совершенно разные преобразования. В то время как матрица проекции описывает отображение от трехмерных точек сцены к двухмерным точкам области просмотра, матрица вида описывает направление и положение, с которого просматривается сцена. Матрица вида определяется положением камеры, а также направлением цели обзора и вектором роста камеры.
(см. Преобразование модели Matrix)
Это означает, что невозможно получить матрицу вида из матрицы проекции. Но камера определяет матрицу вида.
Если проекция является перспективной, тогда можно будет получить угол поля зрения и соотношение сторон из матрицы проекции.
Матрица перспективной проекции выглядит следующим образом:
r = right, l = left, b = bottom, t = top, n = near, f = far
2*n/(r-l) 0 0 0
0 2*n/(t-b) 0 0
(r+l)/(r-l) (t+b)/(t-b) -(f+n)/(f-n) -1
0 0 -2*f*n/(f-n) 0
следует:
aspect = w / h
tanFov = tan( fov_y * 0.5 );
p[0][0] = 2*n/(r-l) = 1.0 / (tanFov * aspect)
p[1][1] = 2*n/(t-b) = 1.0 / tanFov
Угол поля зрения вдоль оси Y в градусах:
fov = 2.0*atan( 1.0/prjMatrix[1][1] ) * 180.0 / PI;
Соотношение сторон:
aspect = prjMatrix[1][1] / prjMatrix[0][0];
Смотрите далее ответы на следующий вопрос: