Как я методично выбираю расстояние ближней плоскости отсечения для перспективной проекции? - PullRequest
14 голосов
/ 12 ноября 2011

У меня есть 3D-сцена и камера, определенная с помощью gluPerspective . У меня фиксированный угол обзора и я знаю минимальное расстояние любой геометрии до камеры (это вид от первого лица, то есть минимальное расстояние от точки обзора до объема столкновения персонажа).

Как я могу выбрать самую дальнюю ближнюю плоскость клипа (для наилучшего разрешения буфера глубины), которая не приведет к отсечке , независимо от того, как игрок движется и выглядит? 1009 *

Эти расстояния не просто равны, потому что углы ближней плоскости находятся дальше от начала координат, чем от центра.

Ответы [ 3 ]

14 голосов
/ 12 ноября 2011

Формула:

nearPlane = nearApproachToPlayer / sqrt (1 + tan (fov / 2) 2 · (aspectRatio 2 * 1009)* + 1)))

Код JavaScript:

  var nearPlane = nearestApproachToPlayer 
                  / Math.sqrt(1 + Math.pow(Math.tan(fov/180*Math.PI/2), 2)
                                  * (Math.pow(aspectRatio, 2) + 1));

Вывод:

Геометрически рассмотрим пирамида , основание которой - ближняя плоскость обрезки, а наконечник - начало координат.Пусть nearPlane будет высотой пирамиды, а w и h ширина и высота основания пирамиды.

w = aspectRatio · h

FOV определяет наклон сторон оси высоты пирамиды:

наклон = загар ( фов / 2)

ч / ближний план = 2 загар ( фов / 2)

ч / 2 = NearPlane загар ( фов / 2)

Любая угловая точка ближней плоскости отсечения смещается от центра плоскости отсечения на ( w / 2, h / 2), поэтому расстояние равноsqrt (( w / 2) 2 + ( h / 2) 2 ).Расстояние от начала координат этой угловой точки является гипотенузой прямоугольного треугольника, образованного nearPlane и прежним расстоянием, равно квадрату (( w / 2) 2 + ( ч / 2) 2 + NearPlane 2 ).

Мы хотим, чтобы это расстояние до угловой точки было равно ближайшему подходу к любой геометрии.

nearApproachToPlayer = sqrt (( w / 2) 2 + ( ч / 2) 2 + вблизи самолета 2 )

Применение простой алгебры приводит к формуле, приведенной выше.

Я не проверял свою алгебру, но я эмпирически проверил формулу: если я умножу nearPlane на 1.1, то получится плоскость отсечения, которая находится слишком далеко, для различных соотношений сторон.Я не пробовал другие поля зрения, кроме 60 °.

7 голосов
/ 12 ноября 2011

Лучшая практика для выбора расстояний ближнего и дальнего отсечения состоит в том, чтобы они плотно охватывали сцену, то есть плоскость ближнего отсечения как можно дальше, а плоскость дальнего отсечения - максимально близко.проекция усеченного конуса, используемая большинством трехмерных приложений для перспективного преобразования, является проекцией в параллельной плоскости.Это означает определение плоского расстояния с точки зрения.На самом деле это довольно просто:

Одним из параметров, который вы будете использовать в программе 3D-рендеринга, является вектор вида, то есть направление, на которое указывает камера.Скажем, у вас есть нормализованный вектор (т.е. единичная длина), а затем скалярное (= точечное) произведение с позициями объектов даст вам плоское расстояние до начала координат.Это более прямой подход, поскольку он дает вам желаемое значение напрямую, без необходимости квадратов, квадратного корня и делений.Это только умноженная сумма, то есть инструкции MAD, которые непосредственно поддерживаются наборами команд SIMD.

5 голосов
/ 12 ноября 2011

Как я могу выбрать самую дальнюю плоскость ближнего клипа (для наилучшего разрешения буфера глубины), которая не вызовет никакого отсечения, независимо от того, как игрок движется и выглядит?

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

Это не помешает обрезанию объектов, которые на самом деле идут за камерой. А поскольку глубина ограничена, вы теряете полезность буфера глубины для тех областей, где происходит ограничение. По-прежнему целесообразно использовать его там, где это целесообразно, если вы не можете выбрать ближайший клип, который слишком далеко, в противном случае.

Обычно лучше включить зажим и вытолкнуть ближний зажим, чем выбрать абсолютный минимум вблизи зажима.

...