diff --git a/src/scene/CesiumGlobe.js b/src/scene/CesiumGlobe.js index efb1777..b0f5a65 100644 --- a/src/scene/CesiumGlobe.js +++ b/src/scene/CesiumGlobe.js @@ -386,12 +386,18 @@ export class CesiumGlobe { handler.setInputAction((movement) => { // 旋转中心 = 相机当前注视的屏幕中心点(与原生 tilt 一致), // 而不是点击点:用点击点会导致一拖动就“瞬移”到点击处。 + // 取“地形表面”点而不是椭球点:相机看到的是地形,若用椭球点做球心, + // 视觉中心(地形)会随旋转漂移,产生“两套体系”的错觉。 const canvas = scene.canvas; const center = Cesium.Cartesian2.fromElements( canvas.clientWidth / 2, canvas.clientHeight / 2, ); - const pivot = camera.pickEllipsoid(center, scene.globe.ellipsoid); + const ray = camera.getPickRay(center); + let pivot = scene.globe.pick(ray, scene); + if (!Cesium.defined(pivot)) { + pivot = camera.pickEllipsoid(center, scene.globe.ellipsoid); + } if (!Cesium.defined(pivot)) return; const sc = this._orbitScratch; const offset = Cesium.Cartesian3.subtract(camera.position, pivot, sc.offset);