Przeglądaj źródła

refactor(TerrainViewer): remove auto rotate feature and adjust camera limits

1. remove the auto rotate functionality including related functions and cleanup code
2. remove the global autoRotateListener variable
3. set camera zoom distance limits to unrestricted
wenhongquan 1 miesiąc temu
rodzic
commit
012f0fd137

Plik diff jest za duży
+ 0 - 0
dist/assets/index-BAPGHJTI.js


Plik diff jest za duży
+ 0 - 0
dist/assets/index-DlQvLY-H.css


+ 2 - 2
dist/index.html

@@ -7,8 +7,8 @@
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>3D 大屏 - 倾斜摄影</title>
-    <script type="module" crossorigin src="/assets/index-C2YiRZLg.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-jcAtfv53.css">
+    <script type="module" crossorigin src="/assets/index-BAPGHJTI.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-DlQvLY-H.css">
   </head>
   <body>
     <div id="app"></div>

+ 3 - 37
src/components/TerrainViewer.vue

@@ -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()

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików