区块链技术博客
www.b2bchain.cn

3dTiles 几何误差详解求职学习资料

本文介绍了3dTiles 几何误差详解求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

1. 瓦片的调度

查阅 tileset.json 的规范,有一个属性是 refine,它有两个值:"ADD""REPLACE"

还有另一个属性,叫 geometricError,是一个数字。

"ADD" 的含义是,当这一级瓦片显示不够精细时,渲染下一级瓦片,这一级的瓦片保留继续显示(增加下一级的内容)。

"REPLACE" 的含义是,当这一级瓦片显示不够精细时,渲染下一级瓦片,这一级的瓦片被销毁(被下一级“替换”)。

如何衡量这个“不够精细”?

一个很简单的思路是利用观察点(也就是相机)到观察瓦片的距离来判断。这个相机与瓦片的距离超过我指定的某个阈值的时候,就要渲染下一级瓦片,而这一级瓦片则根据 refine 的值进行保留或销毁。

所谓的 “指定的某个阈值”,在这里有一个专有名词:最大屏幕空间误差(maximumScreenSpaceError)。

这个值是 Cesium3DTileset 类中的实例属性,默认值是16.

暂且不说这个16的具体含义,先回顾刚才的思路:计算相机到瓦片的距离,设为distance,就能与这个值进行比较了吗?不是的。

1.1 屏幕空间误差(ScreenSpaceError, sse)

计算当前瓦片的屏幕空间误差值,才能与 maximumScreenSpaceError 进行比较,因为这两个才是同一种东西嘛。

先说结论:屏幕空间误差(ScreenSpaceError, sse)由几何误差、相机状态有关的各项参数计算而来。

也就是说,只要 Cesium 在跑,这个 sse 就是一帧一帧实时计算的,每时每刻都在计算。

查阅 Cesium3DTile 的源码,不难得知它的计算方法被定义在 Cesium3DTile 中(可以跳过代码不看):

“` JS
// Cesium3DTile.js >> Cesium3DTile.prototype.getScreenSpaceError()
Cesium3DTile.prototype.getScreenSpaceError = function (
frameState,
useParentGeometricError,
progressiveResolutionHeightFraction
) {
var tileset = this._tileset;
var heightFraction = defaultValue(progressiveResolutionHeightFraction, 1.0);
var parentGeometricError = defined(this.parent)
? this.parent.geometricError
: tileset._geometricError;
var geometricError = useParentGeometricError
? parentGeometricError
: this.geometricError;
if (geometricError === 0.0) {
// Leaf tiles do not have any error so save the computation
return 0.0;
}
var camera = frameState.camera;
var frustum = camera.frustum;
var context = frameState.context;
var width = context.drawingBufferWidth;
var height = context.drawingBufferHeight * heightFraction;
var error;
if (
frameState.mode === SceneMode.SCENE2D ||
frustum instanceof OrthographicFrustum
) {
if (defined(frustum._offCenterFrustum)) {
frustum = frustum._offCenterFrustum;
}
var pixelSize =
Math.max(frustum.top – frustum.bottom, frustum.right – frustum.left) /
Math.max(width, height);
error = geometricError / pixelSize;
} else {
// 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);
if (tileset.dynamicScreenSpaceError) {
var density = tileset._dynamicScreenSpaceErrorComputedDensity;
var factor = tileset.dynamicScreenSpaceErrorFactor;
var dynamicError = CesiumMath.fog(distance, density) * factor;
error -= dynamicError;
}
}

error /= frameState.pixelRatio;

return error;

1. 瓦片的调度

查阅 tileset.json 的规范,有一个属性是 refine,它有两个值:"ADD""REPLACE"

还有另一个属性,叫 geometricError,是一个数字。

"ADD" 的含义是,当这一级瓦片显示不够精细时,渲染下一级瓦片,这一级的瓦片保留继续显示(增加下一级的内容)。

"REPLACE" 的含义是,当这一级瓦片显示不够精细时,渲染下一级瓦片,这一级的瓦片被销毁(被下一级“替换”)。

如何衡量这个“不够精细”?

一个很简单的思路是利用观察点(也就是相机)到观察瓦片的距离来判断。这个相机与瓦片的距离超过我指定的某个阈值的时候,就要渲染下一级瓦片,而这一级瓦片则根据 refine 的值进行保留或销毁。

所谓的 “指定的某个阈值”,在这里有一个专有名词:最大屏幕空间误差(maximumScreenSpaceError)。

这个值是 Cesium3DTileset 类中的实例属性,默认值是16.

暂且不说这个16的具体含义,先回顾刚才的思路:计算相机到瓦片的距离,设为distance,就能与这个值进行比较了吗?不是的。

1.1 屏幕空间误差(ScreenSpaceError, sse)

计算当前瓦片的屏幕空间误差值,才能与 maximumScreenSpaceError 进行比较,因为这两个才是同一种东西嘛。

先说结论:屏幕空间误差(ScreenSpaceError, sse)由几何误差、相机状态有关的各项参数计算而来。

也就是说,只要 Cesium 在跑,这个 sse 就是一帧一帧实时计算的,每时每刻都在计算。

查阅 Cesium3DTile 的源码,不难得知它的计算方法被定义在 Cesium3DTile 中(可以跳过代码不看):

“` JS
// Cesium3DTile.js >> Cesium3DTile.prototype.getScreenSpaceError()
Cesium3DTile.prototype.getScreenSpaceError = function (
frameState,
useParentGeometricError,
progressiveResolutionHeightFraction
) {
var tileset = this._tileset;
var heightFraction = defaultValue(progressiveResolutionHeightFraction, 1.0);
var parentGeometricError = defined(this.parent)
? this.parent.geometricError
: tileset._geometricError;
var geometricError = useParentGeometricError
? parentGeometricError
: this.geometricError;
if (geometricError === 0.0) {
// Leaf tiles do not have any error so save the computation
return 0.0;
}
var camera = frameState.camera;
var frustum = camera.frustum;
var context = frameState.context;
var width = context.drawingBufferWidth;
var height = context.drawingBufferHeight * heightFraction;
var error;
if (
frameState.mode === SceneMode.SCENE2D ||
frustum instanceof OrthographicFrustum
) {
if (defined(frustum._offCenterFrustum)) {
frustum = frustum._offCenterFrustum;
}
var pixelSize =
Math.max(frustum.top – frustum.bottom, frustum.right – frustum.left) /
Math.max(width, height);
error = geometricError / pixelSize;
} else {
// 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);
if (tileset.dynamicScreenSpaceError) {
var density = tileset._dynamicScreenSpaceErrorComputedDensity;
var factor = tileset.dynamicScreenSpaceErrorFactor;
var dynamicError = CesiumMath.fog(distance, density) * factor;
error -= dynamicError;
}
}

error /= frameState.pixelRatio;

return error;

1. 瓦片的调度

查阅 tileset.json 的规范,有一个属性是 refine,它有两个值:"ADD""REPLACE"

还有另一个属性,叫 geometricError,是一个数字。

"ADD" 的含义是,当这一级瓦片显示不够精细时,渲染下一级瓦片,这一级的瓦片保留继续显示(增加下一级的内容)。

"REPLACE" 的含义是,当这一级瓦片显示不够精细时,渲染下一级瓦片,这一级的瓦片被销毁(被下一级“替换”)。

如何衡量这个“不够精细”?

一个很简单的思路是利用观察点(也就是相机)到观察瓦片的距离来判断。这个相机与瓦片的距离超过我指定的某个阈值的时候,就要渲染下一级瓦片,而这一级瓦片则根据 refine 的值进行保留或销毁。

所谓的 “指定的某个阈值”,在这里有一个专有名词:最大屏幕空间误差(maximumScreenSpaceError)。

这个值是 Cesium3DTileset 类中的实例属性,默认值是16.

暂且不说这个16的具体含义,先回顾刚才的思路:计算相机到瓦片的距离,设为distance,就能与这个值进行比较了吗?不是的。

1.1 屏幕空间误差(ScreenSpaceError, sse)

计算当前瓦片的屏幕空间误差值,才能与 maximumScreenSpaceError 进行比较,因为这两个才是同一种东西嘛。

先说结论:屏幕空间误差(ScreenSpaceError, sse)由几何误差、相机状态有关的各项参数计算而来。

也就是说,只要 Cesium 在跑,这个 sse 就是一帧一帧实时计算的,每时每刻都在计算。

查阅 Cesium3DTile 的源码,不难得知它的计算方法被定义在 Cesium3DTile 中(可以跳过代码不看):

“` JS
// Cesium3DTile.js >> Cesium3DTile.prototype.getScreenSpaceError()
Cesium3DTile.prototype.getScreenSpaceError = function (
frameState,
useParentGeometricError,
progressiveResolutionHeightFraction
) {
var tileset = this._tileset;
var heightFraction = defaultValue(progressiveResolutionHeightFraction, 1.0);
var parentGeometricError = defined(this.parent)
? this.parent.geometricError
: tileset._geometricError;
var geometricError = useParentGeometricError
? parentGeometricError
: this.geometricError;
if (geometricError === 0.0) {
// Leaf tiles do not have any error so save the computation
return 0.0;
}
var camera = frameState.camera;
var frustum = camera.frustum;
var context = frameState.context;
var width = context.drawingBufferWidth;
var height = context.drawingBufferHeight * heightFraction;
var error;
if (
frameState.mode === SceneMode.SCENE2D ||
frustum instanceof OrthographicFrustum
) {
if (defined(frustum._offCenterFrustum)) {
frustum = frustum._offCenterFrustum;
}
var pixelSize =
Math.max(frustum.top – frustum.bottom, frustum.right – frustum.left) /
Math.max(width, height);
error = geometricError / pixelSize;
} else {
// 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);
if (tileset.dynamicScreenSpaceError) {
var density = tileset._dynamicScreenSpaceErrorComputedDensity;
var factor = tileset.dynamicScreenSpaceErrorFactor;
var dynamicError = CesiumMath.fog(distance, density) * factor;
error -= dynamicError;
}
}

error /= frameState.pixelRatio;

return error;

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 3dTiles 几何误差详解求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们