首页 > 解决方案 > THREE.js PerspectiveCamera focusLength 相差两倍,与 FOV 不一致

问题描述

在 THREE.js 中,我们使用以下函数构造一个摄像头

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

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

FOV = arctan(d/2f)

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

阅读有关此事的文档后,似乎d默认设置为35mm / aspectRatio.

我们可以FOV这样表达

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

作为健全性检查,我打印了以下值,以查看是否可以取回75.

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

但是..这个值是37.50000000000001

这恰好是预期焦距的一半75

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

标签: javascriptthree.jsperspectivecamera

解决方案


.fov角度是

相机平截头体垂直视野,从底部到顶部,以度为单位。

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

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

这确实是一半.fov

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

推荐阅读