|
|
@@ -37,7 +37,6 @@ let elevations = null
|
|
|
let markerEntities = []
|
|
|
let handler = null
|
|
|
let removePostRender = null
|
|
|
-let autoRotateListener = null
|
|
|
|
|
|
// 计算地形经纬度范围
|
|
|
function computeTerrainRectangle() {
|
|
|
@@ -278,6 +277,9 @@ async function initViewer() {
|
|
|
|
|
|
viewer.scene.globe.depthTestAgainstTerrain = true
|
|
|
viewer.scene.globe.enableLighting = false
|
|
|
+ // 解除相机缩放距离限制
|
|
|
+ viewer.scene.screenSpaceCameraController.minimumZoomDistance = 0
|
|
|
+ viewer.scene.screenSpaceCameraController.maximumZoomDistance = Number.POSITIVE_INFINITY
|
|
|
// 将背景与 globe 底色设为深蓝灰,避免瓦片缺失/加载延迟时露出纯黑
|
|
|
const fillColor = Cesium.Color.fromCssColorString('#1a2634')
|
|
|
viewer.scene.backgroundColor = fillColor
|
|
|
@@ -329,38 +331,6 @@ function resetCamera() {
|
|
|
setupCamera()
|
|
|
}
|
|
|
|
|
|
-function startAutoRotate() {
|
|
|
- if (isAutoRotating.value || !viewer || !meta) return
|
|
|
- isAutoRotating.value = true
|
|
|
-
|
|
|
- const rect = computeTerrainRectangle()
|
|
|
- const eRange = (meta.elevationMax - meta.elevationMin) * veModel.value
|
|
|
- const targetHeight = meta.elevationMin + eRange * props.cameraTargetY
|
|
|
- const center = Cesium.Cartesian3.fromDegrees(
|
|
|
- Cesium.Math.toDegrees(Cesium.Rectangle.center(rect).longitude),
|
|
|
- Cesium.Math.toDegrees(Cesium.Rectangle.center(rect).latitude),
|
|
|
- targetHeight
|
|
|
- )
|
|
|
- const distance = Math.max(meta.terrainWidthMeters, meta.terrainDepthMeters) * props.cameraDistance
|
|
|
- const pitch = Cesium.Math.toRadians(-props.cameraPitch)
|
|
|
- let heading = Cesium.Math.toRadians(props.cameraYaw)
|
|
|
-
|
|
|
- autoRotateListener = viewer.clock.onTick.addEventListener(() => {
|
|
|
- if (!isAutoRotating.value) return
|
|
|
- heading += Cesium.Math.toRadians(0.1)
|
|
|
- viewer.camera.lookAt(center, new Cesium.HeadingPitchRange(heading, pitch, distance))
|
|
|
- viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY)
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-function stopAutoRotate() {
|
|
|
- isAutoRotating.value = false
|
|
|
- if (autoRotateListener) {
|
|
|
- autoRotateListener()
|
|
|
- autoRotateListener = null
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
// 获取标记点 exaggeration 后的地表高度
|
|
|
function getMarkerSurfaceHeight(lon, lat) {
|
|
|
const lonMin = meta.dsmLonMin
|
|
|
@@ -560,9 +530,6 @@ async function loadAll() {
|
|
|
|
|
|
await initViewer()
|
|
|
loading.value = false
|
|
|
-
|
|
|
- // 加载完成后启动旋转动效
|
|
|
- startAutoRotate()
|
|
|
} catch (err) {
|
|
|
console.error('加载失败:', err)
|
|
|
error.value = '加载失败: ' + (err.message || err)
|
|
|
@@ -597,7 +564,6 @@ window.addEventListener('resize', onResize)
|
|
|
onUnmounted(() => {
|
|
|
window.removeEventListener('message', handleIframeMessage)
|
|
|
window.removeEventListener('resize', onResize)
|
|
|
- stopAutoRotate()
|
|
|
if (removePostRender) removePostRender()
|
|
|
if (handler) handler.destroy()
|
|
|
if (viewer) viewer.destroy()
|