Подтвердить что ты не робот

Как я методически выбираю расстояние вблизи плоскости клипа для перспективной проекции?

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

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

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

4b9b3361

Ответ 1

формула:

nearPlane = ближайшийApproachToPlayer/sqrt (1 + tan (fov/2) 2 · (aspectRatio 2 + 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 определяет наклон сторон оси высоты пирамиды:

slope = tan (fov/2)

h/nearPlane = 2 tan (fov/2)

h/2 = nearPlane tan (fov/2)

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

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

ближайшийApproachToPlayer = sqrt ((w/2) 2 + (h/2) 2 + nearPlane 2)

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

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

Ответ 2

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

Стандартная проекция усеченного конуса, используемая большинством 3D-приложений для перспективного преобразования, представляет собой параллельную плоскость. Это означает определение планарного расстояния с точки зрения. Это довольно просто:

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

Ответ 3

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

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

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

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