ソースを参照

build: 打包更新产物并新增自动旋转相机功能

1. 更新dist目录下的静态资源文件和类型定义
2. 为地形查看器添加自动旋转视角功能
3. 在组件卸载时自动停止自动旋转
wenhongquan 1 ヶ月 前
コミット
bc5ab8d6fb

ファイルの差分が大きいため隠しています
+ 0 - 0
dist/assets/index-C2YiRZLg.js


ファイルの差分が大きいため隠しています
+ 0 - 0
dist/assets/index-jcAtfv53.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-CwpEe-KM.js"></script>
-    <link rel="stylesheet" crossorigin href="/assets/index-EadNHUMY.css">
+    <script type="module" crossorigin src="/assets/index-C2YiRZLg.js"></script>
+    <link rel="stylesheet" crossorigin href="/assets/index-jcAtfv53.css">
   </head>
   <body>
     <div id="app"></div>

ファイルの差分が大きいため隠しています
+ 0 - 0
dist/jessibuca/decoder.js


BIN
dist/jessibuca/decoder.wasm


+ 88 - 0
dist/jessibuca/jessibuca.d.ts

@@ -0,0 +1,88 @@
+declare namespace Jessibuca {
+
+    interface Config {
+        container: HTMLMediaElement | string
+
+        videoBuffer?: number,
+        decoder?: string,
+        forceNoOffscreen?: boolean,
+        hiddenAutoPause?: boolean,
+        hasAudio?: boolean,
+        rotate?: boolean,
+        isResize?: boolean,
+        isFullSize?: boolean,
+        isFlv?: boolean,
+        debug?: boolean,
+        timeout?: number,
+        supportDblclickFullscreen?: boolean,
+        showBandwidth?: boolean,
+        operateBtns?: {
+            fullscreen?: boolean,
+            screenshot?: boolean,
+            play?: boolean,
+            audio?: boolean
+            record?: boolean
+        }
+        keepScreenOn?: boolean,
+        isNotMute?: boolean,
+        loadingText?: boolean,
+        background?: string,
+        useWCS?: boolean,
+        useMSE?: boolean
+    }
+
+    interface JessibucaConstructor {
+        new(config?: Config): Jessibuca
+    }
+
+    interface Jessibuca {
+        constructor: JessibucaConstructor,
+
+        setDebug(flag: boolean): void,
+
+        mute(): void,
+
+        cancelMute(): void,
+
+        audioResume(): void,
+
+        setTimeout(): void,
+
+        setScaleMode(mode: number): void,
+
+        pause(): Promise<void>,
+
+        close(): void,
+
+        destroy(): void,
+
+        clearView(): void,
+
+        play(url?: string): Promise<void>,
+
+        resize(): void,
+
+        setBufferTime(time: number): void,
+
+        setRotate(deg: number): void,
+
+        setVolume(volume: number): void,
+
+        hasLoaded(): boolean,
+
+        setKeepScreenOn(): boolean,
+
+        setFullscreen(flag: boolean): void,
+
+        screenshot(filename?: string, format?: string, quality?: number, type?: string)
+
+        isPlaying(): boolean,
+
+        isMute(): boolean,
+
+        isRecording(): boolean,
+
+        on(event: string, callback: Function): void
+
+    }
+}

ファイルの差分が大きいため隠しています
+ 0 - 0
dist/jessibuca/jessibuca.js


ファイルの差分が大きいため隠しています
+ 0 - 0
dist/jessibuca/jessibuca.js.map


+ 36 - 0
src/components/TerrainViewer.vue

@@ -24,6 +24,8 @@ const error = ref(null)
 const veModel = ref(props.verticalExaggeration)
 const infoText = ref('')
 const isAutoRotating = ref(false)
+const realtimeMetrics = ref([])
+const loadingMetrics = ref(false)
 
 const activeMarker = ref(null)
 const markerPopupPosition = ref({ x: 0, y: 0 })
@@ -36,6 +38,7 @@ let elevations = null
 let markerEntities = []
 let handler = null
 let removePostRender = null
+let autoRotateListener = null
 
 // 计算地形经纬度范围
 function computeTerrainRectangle() {
@@ -327,6 +330,38 @@ 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
@@ -563,6 +598,7 @@ 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()

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません