或许,不会一点摄影知识的切图仔不是合格的前端。
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 | Math.atan(dy / dx) * 2 * 180 / Math.PI |
VFOV
1 | Math.atan(cy / dx) * 2 * 180 / Math.PI |
HFOV
1 | Math.atan(cx / dx) * 2 * 180 / Math.PI |