欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

2023-03-17------- 摄像机高度与水平仪之间的关系 ------- 屏幕空间误差

最编程 2024-03-17 15:32:46
...

一、原理

image.png

image.png

如上图所示,根据三角函数可知: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)

  }

输出结果: image.png