Правильный расчет для первого элемента матрицы проекции OpenGL?

Почти во всех теоретических материалах, которые я читал о проекционных матрицах, первый элемент равен 2n/(r-l), но в большинстве реализаций с открытым исходным кодом, которые я видел, он имеет значение 2n/((t-b)*a), что поначалу кажется мне логичным, поскольку (r-l) должно быть ((t-b)*a), но когда Я на самом деле прогоняю цифры, что-то не так.

Если у нас есть вертикальное поле зрения 65 градусов, ближняя плоскость 0,1 и соотношение сторон 4: 3, то я, кажется, получаю:

2n/(r-l) = .2 / (tan(65*(4/3)*.5) * .2) = 1.0599

но

2n((t-b)*a) = .2 / (tan(65*.5) * (4/3) * .2) = 1.1773

Почему существует разница между всем, что я читаю, и тем, что я вижу в реализации? Я не замечал, пока не начал реализовывать ту же аналитическую инверсию, которую я вижу, первый элемент которой равен (r-l)/2n, что не является инверсией этих других реализаций.


person Chad Mourning    schedule 28.12.2013    source источник


Ответы (1)


Вы не можете умножить соотношение сторон на угол. Тангенс не является линейной функцией. Поле зрения по вертикали 65 градусов не означает, что угол обзора по горизонтали составляет 86,67 градуса с соотношением сторон 4:3, а ~80,69 градуса.

person derhass    schedule 28.12.2013
comment
Ага! Что объясняет его; благодаря. Я бы подумал, что это вызовет у меня больше проблем к настоящему времени. - person Chad Mourning; 29.12.2013