Как я методически выбираю расстояние вблизи плоскости клипа для перспективной проекции?
У меня есть 3D-сцена и камера, определенная с помощью gluPerspective. У меня есть фиксированное FOV, и я знаю минимальное расстояние любой геометрии к камере (это представление от первого лица, так что это минимальное расстояние от точки обзора до громкости столкновений персонажей).
Как я могу выбрать самую дальнюю ближайшую плоскость клипа (для лучшего разрешения буфера глубины), которая будет не вызывать отсечения, независимо от того, как игрок перемещается и выглядит
Эти расстояния не просто равны, потому что углы ближней плоскости находятся дальше от начала координат, чем центр.
Ответы
Ответ 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
Как я могу выбрать самую дальнюю плоскость клипа (для лучшего разрешения буфера глубины), которая не вызовет какого-либо обрезания, независимо от того, как игрок перемещается и выглядит?
Простой: выключается рядом с отсечением. Я не могу поверить, что люди еще не слышали об этом. Вы включаете фиксацию глубины, что приводит к близким (и дальним) значениям, которые меньше, чем ближний (или больший, чем далекий), который нужно зажать, а не обрезать.
Это не будет препятствовать тому, чтобы объекты, которые на самом деле позади камеры, были обрезаны. А так как глубины зажаты, вы теряете полезность буфера глубины для тех областей, где происходит зажим. По-прежнему неплохо использовать его там, где это разумно, если вы не можете выбрать ближайший клип, который слишком далеко в противном случае.
Как правило, лучше включить зажим и вытолкнуть ближайший клип, чем выбрать абсолютный минимум рядом с клипом.