THREE.js PerspectiveCamera focalLength 偏离两倍,与 FOV 不一致

THREE.js PerspectiveCamera focalLength off by a factor of two, inconsistent with FOV

在THREE.js中我们使用下面的函数构造一个相机

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

我们从光学中知道,相机的视场角与焦距的关系如下式

FOV = arctan(d/2f)

其中 FOV 是以度为单位的垂直 FOV,d 是以毫米为单位的图像平面高度,f 是以毫米为单位的相机焦距。

阅读 the documentation 后,似乎 d 默认设置为 35mm / aspectRatio

我们可以这样表达FOV

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

作为健全性检查,我打印了以下值,看看我是否能取回 75 的输入 FOV。

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

但是..这个值是37.50000000000001

正好是75预期焦距的一半。

所以,我想知道我是否在某处做错了数学运算,或者我是否误解了 THREE.js 的报告值。

.fov 角度是

Camera frustum vertical field of view, from bottom to top of view, in degrees.

但是你计算的是,视图中心到顶部的角度:

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

这确实是.fov的一半:

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