2023-03-17------- 摄像机高度与水平仪之间的关系 ------- 屏幕空间误差
最编程
2024-03-17 15:32:46
...
一、原理
如上图所示,根据三角函数可知:tan(fov/2) == (height/2) / far
;
而height/sseDenominator = (height/2) / tan(fov/2) = far
;也就是相机距离屏幕中心的像素距离。
而maxGeometricError是地球赤道的周长/像素数,也就是分辨率,可以认为是在Tile不拉伸的情况下(比如一个256的Tile就是按照256的像素显示,而不是被拉伸成300的像素)一个像素代表多少米。(maxGeometricError * height) / sseDenominator = maxGeometricError * (height/sseDenominator)
,也就是理想情况下,相机距离屏幕中心的米单位距离,我们记作L。
而distance是当前状态下,相机距离该Tile的真实距离,于是L / distance就是一个粗略的拉伸比,如果distance值小于L,说明当前观看的位置distance比真实的位置L要近,则需要更精细的层级效果,而distance是分母,分母越小,该值就越大。换句话说,就是该值越小,说明当前的拉伸越小。
二、具体关系 算法
const PI = 3.141592653
const girth = 2 * PI * 6378137
console.log('周长', girth)
/**
* 根据级别计算分辨率
*/
function getResolution(zoom) {
//计算所需切片数
const tileTotal = Math.pow(2, zoom)
console.log('级别:' + zoom, '瓦片数', tileTotal)
//计算分辨率
return girth / (tileTotal * 256)
}
for (let i = 1; i <= 18; i++) {
const resolution = getResolution(i)
const cameraHeight = resolution * 1080 / Math.tan(Math.PI / 6)
console.log('分辨率:' + resolution, '相机高度:' + cameraHeight)
}
输出结果:
上一篇: 地图比例尺、分辨率和 dpi 之间的关系
下一篇: 肯德尔距离和图像超分辨率技术的创新实践