THREE.js PerspectiveCamera focalLength отключен в два раза, несовместимо с FOV - PullRequest
0 голосов
/ 21 декабря 2018

В THREE.js мы строим камеру, используя следующую функцию

const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);

Мы знаем из оптики, что поле зрения камеры связано с фокусным расстоянием следующим уравнением

FOV = arctan(d/2f)

, где FOV - вертикальное поле обзора в градусах, d - высота плоскости изображения в мм, а f - фокусное расстояние камеры в мм.

Послечитая документацию по данному вопросу, кажется, что d по умолчанию установлено в 35mm / aspectRatio.

Мы можем выразить FOV следующим образом

FOV = arctan((35/(width/height))/2f) = arctan(filmHeight / 2f)

В качестве проверки работоспособности я напечатал следующее значение, чтобы посмотреть, получу ли я возвращенное значение FOV 75.

Math.atan(camera.getFilmHeight()/(2 * camera.getFocalLength())) * 180 / Math.PI;

Но ... это значение получается 37.50000000000001

, что составляет ровно половину ожидаемого фокусного расстояния 75.

Итак, мне было интересно, если я где-то ошибся в математике, или я неверно интерпретирую сообщенные значения THREE.js.

1 Ответ

0 голосов
/ 21 декабря 2018

Угол .fov равен

Вертикальное поле обзора камеры, снизу вверх, в градусах.

Но то, что вы рассчитываете, это угол центра обзора к вершине:

Math.atan( (camera.getFilmHeight()/2) / camera.getFocalLength())) * 180 / Math.PI;

это действительно половина .fov:

fov = 2 * Math.atan( (camera.getFilmHeight()/2) / camera.getFocalLength())) * 180 / Math.PI;
...