0%

计算水平fov、垂直fov与对角线fov之间的转换

或许,不会一点摄影知识的切图仔不是合格的前端。


FOV的定义

首先,什么是FOV?一句话概括:通俗来说,目标物体超过这个角就不会被收到镜头里。

FOV又称视场角,分为水平FOV(HFOV)、垂直FOV(VFOV)与对角线FOV(DFOV)。以下图片展示的是对角线与水平FOV。

FOV的计算

这次需要的镜头在官网介绍页提供的FOV仅有对角线FOV,而CesiumJS需要的是水平或垂直FOV。那么已知对角线FOV,如何计算水平或垂直FOV?也就是说这三者是如何换算呢?

图形更直观,所以来画一张图:

已知对角线FOV=84°

首先,有两点注意:

  • 因为物理硬件的单位较难以计算,所以我们的计算建议以分辨率像素为单位。
  • FOV不是固定的,照片分辨率若发生变化,FOV也会随着发生变化。

其次,我们来看该镜头在设置不同照片比例进行拍摄时,经过实践获取拍出来的照片分辨率(即长和宽):

宽(w) 高(h) DFOV(计算得出) HFOV(计算得出) VFOV(计算得出)
3:2 5472 3648 84° 73° 53°
16:9 5472 3078 81° 73° 46°
4:3 4864 3648 79° 67° 53°

那么,我们以比例为 3:2 举例,开始今天的计算。

已知:dx = 3666(该镜头固定值),cx = 5472/2 = 2736, cy = 3648/2=1824,DFOV/2 = 84°/2=42°

根据勾股定理得出:

dy = Math.sqrt(Math.pow(2736, 2) + Math.pow(1824, 2)) ≈ 3288


DFOV

1
2
3
Math.atan(dy / dx) * 2 * 180 / Math.PI
= Math.atan(3288 / 3666) * 2 * 180 / Math.PI
83.7° (与官网提供非常接近)


VFOV

1
2
3
Math.atan(cy / dx) * 2 * 180 / Math.PI
= Math.atan(1824 / 3666) * 2 * 180 / Math.PI
53°


HFOV

1
2
3
Math.atan(cx / dx) * 2 * 180 / Math.PI
= Math.atan(2736 / 3666) * 2 * 180 / Math.PI
73°