Формула:
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 °.