Tune camera and timeline controls, add globe fly-to

- Clamp binder/timeline zoom ranges and disable OrbitControls zoom,
  using custom smooth zoom instead
- Disable middle/right mouse buttons; reduce rotate speed
- Fly camera to picked marker on globe click
- Rebuild leather surfaces with a regular grid for smooth curvature
- Refine suede and kraft paper textures, punch real page holes
- Reposition axis, time labels, and detail card; speed up iris fade
This commit is contained in:
2026-09-18 22:46:26 +08:00
parent 94fde7942f
commit 9a1a3685ce
6 changed files with 286 additions and 148 deletions
+24 -1
View File
@@ -7,6 +7,9 @@ const IMAGERY_URL =
const TERRAIN_URL =
'https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer';
// 点击标记后相机飞到的目标高度(米,约 1500 km 区域尺度)
const FLY_TO_HEIGHT = 1.5e6;
export class CesiumGlobe {
constructor({ onPick } = {}) {
this.onPick = onPick;
@@ -70,6 +73,9 @@ export class CesiumGlobe {
},
];
// 阻止右键弹出浏览器菜单
scene.canvas.addEventListener('contextmenu', (e) => e.preventDefault());
// 精细化渲染:质量与性能的平衡
scene.globe.maximumScreenSpaceError = 2.0; // 默认细分,最省性能
scene.globe.tileCacheSize = 600; // 更大的瓦片缓存,减少细节刷新
@@ -146,12 +152,29 @@ export class CesiumGlobe {
handler.setInputAction((movement) => {
const picked = this.viewer.scene.pick(movement.position);
if (Cesium.defined(picked) && picked.id && picked.id.entryIndex !== undefined) {
this.onPick?.(picked.id.entryIndex);
const index = picked.id.entryIndex;
this.onPick?.(index);
this.flyToEntry(index);
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
this._handler = handler;
}
// 相机平滑飞至某个标记上空,并将其居中(正俯视,北朝上)
flyToEntry(index) {
const entry = ENTRIES[index];
if (!entry || !this.viewer) return;
this.viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(entry.lng, entry.lat, FLY_TO_HEIGHT),
orientation: {
heading: 0,
pitch: Cesium.Math.toRadians(-90),
roll: 0,
},
duration: 1.2,
});
}
setSelected(index) {
this.selected = index;
if (!this.viewer) return;