一、说明
之前接触过3DTile 的格式说明,一直对geometricError(单位是米)没有透彻了解,从表面意思“几何误差”简直是让人一头雾水,今天就透过代码看本质,geometricError 表达到底是什么意思。
二、 核心代码算法
在 Cesium3DTile中的getScreenSpaceError 的方法,下面列出了核心代码。
var camera = frameState.camera;
var frustum = camera.frustum;
var context = frameState.context;
var width = context.drawingBufferWidth;
var height = context.drawingBufferHeight;
var error;
// Avoid divide by zero when viewer is inside the tile
var distance = Math.max(this._distanceToCamera, CesiumMath.EPSILON7);
var sseDenominator = camera.frustum.sseDenominator;
error = (geometricError * height) / (distance * sseDenominator);
error = (geometricError *屏幕高度)/(到相机距离 * 比例分母)
啊! 比例分母是什么的东东,看下面代码。
frustum._sseDenominator = 2.0 * Math.tan(0.5 * frustum._fovy);
在这里先说一个结论:geometricError 就是一个对象外包球的直径,会根据相机位置计算投影屏幕所站的像素大小。下面就分析这个算法过程。
三、 算法分析
先看下面这个图:

首先要指定fov角的一半对应也是屏幕高的一半
tan(a)的值约等于,当距离比geometricError大很多倍的时候。
tan(α)≈geometricError(2∗distance) tan(\alpha) \approx \frac {geometricError} {(2*distance)} tan(α)≈(2∗distance)geometricError</

本文深入解析3DTile格式中的geometricError概念,通过代码分析揭示其为对象外包球直径,随相机位置变化计算屏幕投影像素大小。geometricError在3D场景中扮演关键角色,用于评估细节级别。
最低0.47元/天 解锁文章
2521





