右键环视:up 随方向一起旋转(保留 roll),修复左右拽异常

This commit is contained in:
2026-09-19 14:52:45 +08:00
parent ccd3efde17
commit 0357bb0fb1
+9 -13
View File
@@ -379,7 +379,7 @@ export class CesiumGlobe {
newOffset: new Cesium.Cartesian3(), newOffset: new Cesium.Cartesian3(),
newPos: new Cesium.Cartesian3(), newPos: new Cesium.Cartesian3(),
dir: new Cesium.Cartesian3(), dir: new Cesium.Cartesian3(),
upProj: new Cesium.Cartesian3(), upRot: new Cesium.Cartesian3(),
}; };
handler.setInputAction((movement) => { handler.setInputAction((movement) => {
@@ -443,7 +443,7 @@ export class CesiumGlobe {
this._lookHandler = handler; this._lookHandler = handler;
} }
// 按累计角度(已限制)把相机绕点击点旋转;始终保持北朝上、看向点击点 // 按累计角度(已限制)把相机绕点击点旋转;位置、朝向、up 一起做刚体旋转
_orbitCamera(s) { _orbitCamera(s) {
const camera = this.viewer.camera; const camera = this.viewer.camera;
const sc = this._orbitScratch; const sc = this._orbitScratch;
@@ -453,20 +453,16 @@ export class CesiumGlobe {
Cesium.Matrix3.fromQuaternion(sc.q, sc.rotMat); Cesium.Matrix3.fromQuaternion(sc.q, sc.rotMat);
Cesium.Matrix3.multiplyByVector(sc.rotMat, s.startOffset, sc.newOffset); Cesium.Matrix3.multiplyByVector(sc.rotMat, s.startOffset, sc.newOffset);
Cesium.Cartesian3.add(s.pivot, sc.newOffset, sc.newPos); Cesium.Cartesian3.add(s.pivot, sc.newOffset, sc.newPos);
const dir = Cesium.Cartesian3.normalize( // up 不强制北朝上,与方向一起旋转(否则左右拽缺少 roll 分量,表现异常)
Cesium.Cartesian3.subtract(s.pivot, sc.newPos, sc.dir), Cesium.Matrix3.multiplyByVector(sc.rotMat, s.direction, sc.dir);
sc.dir, Cesium.Cartesian3.normalize(sc.dir, sc.dir);
); Cesium.Matrix3.multiplyByVector(sc.rotMat, s.up, sc.upRot);
const z = dir.z; Cesium.Cartesian3.normalize(sc.upRot, sc.upRot);
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);
camera.setView({ camera.setView({
destination: Cesium.Cartesian3.clone(sc.newPos), destination: Cesium.Cartesian3.clone(sc.newPos),
orientation: { orientation: {
direction: Cesium.Cartesian3.clone(dir), direction: Cesium.Cartesian3.clone(sc.dir),
up: Cesium.Cartesian3.clone(sc.upProj), up: Cesium.Cartesian3.clone(sc.upRot),
}, },
}); });
} }