diff --git a/src/scene/CesiumGlobe.js b/src/scene/CesiumGlobe.js index da6e5ed..763a1cf 100644 --- a/src/scene/CesiumGlobe.js +++ b/src/scene/CesiumGlobe.js @@ -271,17 +271,21 @@ export class CesiumGlobe { _updateMarkerLayer() { const scene = this.viewer.scene; const camera = scene.camera; - const toPos = new Cesium.Cartesian3(); + const outOfRange = camera.positionCartographic.height > 1e7; // 最远 1 万 km 内显示 + for (const m of this.markers) { const el = m.el; if (!el) continue; + if (outOfRange) { el.style.display = 'none'; continue; } + const win = Cesium.SceneTransforms.worldToWindowCoordinates(scene, m.position); if (!win) { el.style.display = 'none'; continue; } - Cesium.Cartesian3.subtract(m.position, camera.positionWC, toPos); - if (Cesium.Cartesian3.dot(toPos, camera.directionWC) < 0) { - el.style.display = 'none'; // 背对相机不显示 - continue; - } + + // 背面(远半球)隐藏:dot(P, C) <= |P|² 时为背对地球 + const dotPC = Cesium.Cartesian3.dot(m.position, camera.positionWC); + const r2 = Cesium.Cartesian3.magnitudeSquared(m.position); + if (dotPC <= r2) { el.style.display = 'none'; continue; } + el.style.display = 'block'; el.style.left = `${win.x}px`; el.style.top = `${win.y}px`;