或许,不会一点摄影知识的切图仔不是合格的前端。
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
123Math.atan(dy / dx) * 2 * 180 / Math.PI= Math.atan(3288 / 3666) * 2 * 180 / Math.PI≈ 83.7° (与官网提供非常接近)
VFOV
123Math.atan(cy / dx) * 2 * 180 / Math.PI= Math.atan(1824 / 3666) * 2 * 180 / Math.PI≈ 53°
HFOV
123Math.atan(cx / dx) * 2 * 180 / Math.PI= Math.atan(2736 / 3666) * 2 * 180 / Math.PI≈ 73°