Определяется ли параметр fov для glm :: перспектива как половина угла поля зрения? - PullRequest
1 голос
/ 23 июня 2019

Я на этапе оптимизации рендерера, о котором я писал в OpenGL, и мой следующий шаг - отобрать все, что я не вижу. При чтении этого и других ресурсов, я вижу визуальное изображение усеченного контура как:

Frustum

Изображение из: https://www.scratchapixel.com/images/upload/perspective-matrix/camsetup1.png

И поэтому подумал, что мы передаем что-то вроде glm::radians(90.0f). Однако я столкнулся с проблемами отбраковки с помощью своего алгоритма, потому что думал, что буду идти под углом 45 градусов влево и вправо по плоскостям ... но потом я начал получать ложноположительный отбор. Как только я изменил его на использование угла fov, переданного в glm::perspective, тогда отбор начинает работать нормально.

Однако есть две вещи, в которых я не уверен:

  1. Верно ли то, что я сказал? Как в значении fov должна быть половина зеленого угла на изображении, размещенном выше?
  2. Если (1) верно, то почему коэффициент 90 не показывает мне все слева и справа?

Это важно для меня понять, потому что я хочу, чтобы мои алгоритмы отбраковки отбирались как можно больше без ложных срабатываний. Как вы можете догадаться, я получал ложноположительные отбраковки, потому что я подумал: «Мне нужно снова разделить первый аргумент, который я использую для glm::perspective(), на два, чтобы получить половину угла», что привело к более жесткому усечению, которое отбраковало бы намного больше, чем должно быть.

Способ, которым я сейчас отбираю, - это вычисление левого и правого краев усеченного контура и отбраковка любых 2D-линий, которые не видны левым или правым краем (как если бы они были отрезками), через точечные произведения. , Вот почему более узкий угол давал мне горе. Кроме того, если есть лучший способ сделать это, дайте мне знать, хотя я думаю, что два продукта с точками, вероятно, самый дешевый, который я собираюсь получить в отношении эффективности вычислений для линии, которую я должен проверить.

1 Ответ

2 голосов
/ 23 июня 2019

Параметр fov, равный glm::perspective, представляет собой угол снизу вверх (ось y ) усеченного вида.
Если порт видапрямоугольная, а ширина области просмотра больше высоты (и fov <180 °), тогда угол слева направо больше угла сверху вниз: </p>

aspect = width / height
fov_x  = atan(tan(fov_y/2) * aspect) * 2
...