diff --git a/src/scene/CesiumGlobe.js b/src/scene/CesiumGlobe.js index fc81765..6d7baee 100644 --- a/src/scene/CesiumGlobe.js +++ b/src/scene/CesiumGlobe.js @@ -379,7 +379,7 @@ export class CesiumGlobe { newOffset: new Cesium.Cartesian3(), newPos: new Cesium.Cartesian3(), dir: new Cesium.Cartesian3(), - upProj: new Cesium.Cartesian3(), + upRot: new Cesium.Cartesian3(), }; handler.setInputAction((movement) => { @@ -443,7 +443,7 @@ export class CesiumGlobe { this._lookHandler = handler; } - // 按累计角度(已限制)把相机绕点击点旋转;始终保持北朝上、看向点击点 + // 按累计角度(已限制)把相机绕点击点旋转;位置、朝向、up 一起做刚体旋转 _orbitCamera(s) { const camera = this.viewer.camera; const sc = this._orbitScratch; @@ -453,20 +453,16 @@ export class CesiumGlobe { Cesium.Matrix3.fromQuaternion(sc.q, sc.rotMat); Cesium.Matrix3.multiplyByVector(sc.rotMat, s.startOffset, sc.newOffset); Cesium.Cartesian3.add(s.pivot, sc.newOffset, sc.newPos); - const dir = Cesium.Cartesian3.normalize( - Cesium.Cartesian3.subtract(s.pivot, sc.newPos, sc.dir), - sc.dir, - ); - const z = dir.z; - sc.upProj.x = -dir.x * z; - sc.upProj.y = -dir.y * z; - sc.upProj.z = 1 - z * z; - Cesium.Cartesian3.normalize(sc.upProj, sc.upProj); + // up 不强制北朝上,与方向一起旋转(否则左右拽缺少 roll 分量,表现异常) + Cesium.Matrix3.multiplyByVector(sc.rotMat, s.direction, sc.dir); + Cesium.Cartesian3.normalize(sc.dir, sc.dir); + Cesium.Matrix3.multiplyByVector(sc.rotMat, s.up, sc.upRot); + Cesium.Cartesian3.normalize(sc.upRot, sc.upRot); camera.setView({ destination: Cesium.Cartesian3.clone(sc.newPos), orientation: { - direction: Cesium.Cartesian3.clone(dir), - up: Cesium.Cartesian3.clone(sc.upProj), + direction: Cesium.Cartesian3.clone(sc.dir), + up: Cesium.Cartesian3.clone(sc.upRot), }, }); }