From 130458e97e1d50a38dfd984675986b9f7aad245a Mon Sep 17 00:00:00 2001 From: lyf <2514544224@qq.com> Date: Fri, 10 Jul 2026 14:31:21 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=A6=86=E5=86=85=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E5=88=9D=E5=A7=8B=E5=8C=96=E8=A7=86=E8=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/map/ThreeMap.vue | 34 +++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/components/map/ThreeMap.vue b/src/components/map/ThreeMap.vue index d8ce738..abc0a4c 100644 --- a/src/components/map/ThreeMap.vue +++ b/src/components/map/ThreeMap.vue @@ -134,11 +134,29 @@ const SGS_VISUAL_RENDER_CONFIG = { } as const const OVERVIEW_INITIAL_CAMERA_PARAMS = { - position: new THREE.Vector3(496.3356, 708.6058, 137.501), + position: new THREE.Vector3(305.4812, 441.3596, 205.0497), target: new THREE.Vector3(-4.1432, -31.3659, 3.3982), zoom: 1 } as const +const getIndoorInitialCameraDirection = () => ( + OVERVIEW_INITIAL_CAMERA_PARAMS.position + .clone() + .sub(OVERVIEW_INITIAL_CAMERA_PARAMS.target) + .normalize() +) + +const INDOOR_INITIAL_MODEL_PARAMS = { + position: new THREE.Vector3(0, 0, 0), + rotation: new THREE.Euler( + THREE.MathUtils.degToRad(0), + THREE.MathUtils.degToRad(0), + THREE.MathUtils.degToRad(0), + 'XYZ' + ), + scale: new THREE.Vector3(1, 1, 1) +} as const + const MODEL_ADJUST_IDLE_REPORT_DELAY_MS = 800 const degToRad = (degrees: number) => THREE.MathUtils.degToRad(degrees) @@ -3430,7 +3448,7 @@ const fitCameraToObject = (object: THREE.Object3D, preset: CameraPreset = 'obliq ? new THREE.Vector3(0.02, 1, 0.02) : activeView.value === 'overview' ? new THREE.Vector3(0.76, 0.48, 1) - : new THREE.Vector3(0.85, 0.62, 1) + : getIndoorInitialCameraDirection() const overviewFitOptions: CameraFitOptions = activeView.value === 'overview' ? { distanceFactor: 0.9, @@ -3448,6 +3466,13 @@ const fitCameraToObject = (object: THREE.Object3D, preset: CameraPreset = 'obliq setCameraView(center, maxDim, direction, overviewFitOptions) } +const applyIndoorInitialModelTransform = (model: THREE.Object3D) => { + model.position.copy(INDOOR_INITIAL_MODEL_PARAMS.position) + model.rotation.copy(INDOOR_INITIAL_MODEL_PARAMS.rotation) + model.scale.copy(INDOOR_INITIAL_MODEL_PARAMS.scale) + model.updateMatrixWorld(true) +} + const applyOverviewInitialCamera = () => { if (!camera || !controls) return @@ -3576,7 +3601,9 @@ const loadOverview = async () => { if (!targetScene) throw createStaleModelLoadError() activeModel = cachedOverviewModel + activeModel.name = 'GuideOverviewModel' activeModel.visible = true + applyIndoorInitialModelTransform(activeModel) applyModelVisibilityForView(activeModel, 'overview') cacheAutoSwitchOverviewMaxDim(activeModel) targetScene.add(activeModel) @@ -3606,6 +3633,7 @@ const loadOverview = async () => { activeModel = gltf.scene activeModel.name = 'GuideOverviewModel' prepareModel(activeModel) + applyIndoorInitialModelTransform(activeModel) applyModelVisibilityForView(activeModel, 'overview') cacheAutoSwitchOverviewMaxDim(activeModel) cachedOverviewModel = activeModel @@ -3644,6 +3672,7 @@ const prepareFloorScene = async ( model.name = `GuideFloorModel_${requestedFloorId}` model.userData.floorId = requestedFloorId model.visible = true + applyIndoorInitialModelTransform(model) applyModelVisibilityForView(model, 'floor', requestedFloorId) } else { if (!options.suppressProgress) { @@ -3668,6 +3697,7 @@ const prepareFloorScene = async ( model.name = `GuideFloorModel_${requestedFloorId}` model.userData.floorId = requestedFloorId prepareModel(model) + applyIndoorInitialModelTransform(model) applyModelVisibilityForView(model, 'floor', requestedFloorId) cacheAsSharedModel = Boolean(floor.sharedModelAsset)