From 0357bb0fb1cbd866629f16061faf6747f6f981de Mon Sep 17 00:00:00 2001 From: fukunee Date: Sat, 19 Sep 2026 14:52:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=B3=E9=94=AE=E7=8E=AF=E8=A7=86=EF=BC=9Aup?= =?UTF-8?q?=20=E9=9A=8F=E6=96=B9=E5=90=91=E4=B8=80=E8=B5=B7=E6=97=8B?= =?UTF-8?q?=E8=BD=AC=EF=BC=88=E4=BF=9D=E7=95=99=20roll=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B7=A6=E5=8F=B3=E6=8B=BD=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scene/CesiumGlobe.js | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) 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), }, }); }