Спасибо за ваши объяснения, я понимаю, что такое проекция, вид и матрица модели. Я отредактировал свой вопрос, чтобы лучше объяснить, что мне нужно.

тоящее время я работаю над приложением дополненной реальности. Целевым устройством является оптический видоискатель HMD. Мне нужно откалибровать его дисплей для правильной регистрации виртуальных объектов. Я использовал этореализация SPAAM для Android, чтобы сделать это, и результат достаточно точен для моей цели.

Моя проблема в том, что приложение калибровки выдает на выходе4x4проекция матрица Я мог бы использовать непосредственно с OpenGL для примера. Но используемая мной структура дополненной реальности принимает только параметры оптической калибровки в форматеПоле зрения некоторый параметр +Соотношение сторон некоторый параметр + 4x4Посмотреть матрица.

Вот что у меня есть:

Правильный результат калибровки в неправильном формате:

 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

У меня нет никакой информации о том, как эти результаты получены.

Я читаю эти параметры из двоичных файлов, и я не знаю, хранятся ли матрицы в основной форме строки или столбца. Таким образом, две матрицы, возможно, придется транспонировать.

Мой вопрос:Возможно ли, и если да, то как получить эти три параметра изпроекция первая матрица у меня есть?

 Soccertrash15 мая 2018 г., 17:41
Откуда вы знаете, что результат калибровки правильный?
 Rabbid7612 сент. 2017 г., 20:20
Матрица проекции Матрица представления - это разные вещиПреобразуйте модель Matrix, Вероятноfov = 2.0*atan(1.0/prjM[1][1])*180.0/PI; aspect = prjM[1][1]/prj[0][0] - видетьКак восстановить положение пространства вида с учетом значения глубины пространства просмотра и ndc xy
 Raoul22 мая 2018 г., 17:44
Потому что после загрузки в соответствующие структуры первый результат дает хорошую регистрацию виртуальных объектов, а второй - плохую регистрацию.
 Mr. Reddy13 сент. 2017 г., 11:59
Сумасшедший, я не могу читать. Я не заметил, что матрица представления также была там. Максимум, что вы можете извлечь из матрицы проекции - это соотношение сторон и размеров
 Mr. Reddy13 сент. 2017 г., 11:40
Можно получить эту информацию из матрицы проекции, но вам необходимо знать, какие формулы использовались для ее построения.

Ответы на вопрос(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];


Смотрите далее ответы на следующий вопрос:

Как визуализировать глубину линейно в современном OpenGL с gl_FragCoord.z ​​во фрагментном шейдере?Как восстановить положение пространства вида с учетом значения глубины пространства просмотра и ndc xyПреобразуйте модель Matrix
 Raoul14 сент. 2017 г., 14:22
Спасибо за ваши объяснения, я понимаю, что такое проекция, вид и матрица модели. Я отредактировал свой вопрос, чтобы лучше объяснить, что мне нужно.

Ваш ответ на вопрос