优化导览页面面板与楼层交互
This commit is contained in:
@@ -1158,7 +1158,7 @@ const getMultiFloorVerticalGap = (items: MultiFloorModelItem[]) => {
|
||||
const maxFloorHeight = Math.max(...items.map((item) => item.size.y), 1)
|
||||
const maxFootprint = Math.max(...items.map((item) => Math.max(item.size.x, item.size.z)), 1)
|
||||
|
||||
return Math.max(maxFloorHeight * 3.2, maxFootprint * 0.2, 42)
|
||||
return Math.max(maxFloorHeight * 5.2, maxFootprint * 0.32, 68)
|
||||
}
|
||||
|
||||
const applyMultiFloorLayout = (items: MultiFloorModelItem[]) => {
|
||||
@@ -1332,6 +1332,42 @@ const setCameraPreset = (preset: CameraPreset) => {
|
||||
}
|
||||
}
|
||||
|
||||
const zoomCamera = (direction: 'in' | 'out') => {
|
||||
if (!camera || !controls) return
|
||||
|
||||
const offset = camera.position.clone().sub(controls.target)
|
||||
const currentDistance = offset.length()
|
||||
const zoomFactor = direction === 'in' ? 0.72 : 1.28
|
||||
const minDistance = controls.minDistance || 2
|
||||
const maxDistance = controls.maxDistance || 1200
|
||||
const nextDistance = Math.min(maxDistance, Math.max(minDistance, currentDistance * zoomFactor))
|
||||
|
||||
if (!Number.isFinite(nextDistance) || nextDistance <= 0) return
|
||||
|
||||
offset.setLength(nextDistance)
|
||||
camera.position.copy(controls.target).add(offset)
|
||||
controls.update()
|
||||
|
||||
if (direction === 'in' && activeView.value === 'overview' && !isLoading.value && !isAutoSwitchLocked) {
|
||||
isAutoSwitchLocked = true
|
||||
lastAutoSwitchTime = Date.now()
|
||||
|
||||
void runAutoSwitchLoad(
|
||||
{
|
||||
from: 'overview',
|
||||
to: 'floor',
|
||||
trigger: 'zoom-in',
|
||||
distance: nextDistance
|
||||
},
|
||||
() => loadFloor(currentFloor.value || props.initialFloorId || 'L1'),
|
||||
'单楼层模型加载失败'
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
handleControlChange()
|
||||
}
|
||||
|
||||
const loadOverview = async () => {
|
||||
const packageData = renderPackage.value
|
||||
if (!packageData || !scene) return
|
||||
@@ -1447,36 +1483,6 @@ const loadMultiFloor = async () => {
|
||||
activeView.value = 'multi'
|
||||
clearSceneData()
|
||||
setProgress(18, '正在加载多层展示模型...')
|
||||
const packageData = renderPackage.value
|
||||
const allFloorsShareOverview = Boolean(packageData)
|
||||
&& floorIndex.value.every((floor) => floor.sharedModelAsset && floor.modelUrl === packageData!.overviewModelUrl)
|
||||
|
||||
if (allFloorsShareOverview && packageData) {
|
||||
if (!attachCachedSharedModel(packageData.overviewModelUrl, 'GuideMultiFloorModel', loadToken)) {
|
||||
const gltf = await loadModel(packageData.overviewModelUrl, '正在加载多层展示模型', loadToken)
|
||||
assertCurrentModelLoad(loadToken, gltf.scene)
|
||||
|
||||
const targetScene = scene
|
||||
if (!targetScene) {
|
||||
disposeObject(gltf.scene)
|
||||
throw createStaleModelLoadError()
|
||||
}
|
||||
|
||||
activeModel = gltf.scene
|
||||
activeModel.name = 'GuideMultiFloorModel'
|
||||
prepareModel(activeModel)
|
||||
applyModelVisibilityForView(activeModel, 'multi')
|
||||
cachedOverviewModel = activeModel
|
||||
cachedSharedModelUrl = packageData.overviewModelUrl
|
||||
targetScene.add(activeModel)
|
||||
}
|
||||
|
||||
if (!activeModel) throw createStaleModelLoadError()
|
||||
fitCameraToObject(activeModel)
|
||||
refreshPoiVisibilityByDistance()
|
||||
renderRoutePreview()
|
||||
return
|
||||
}
|
||||
|
||||
const group = new THREE.Group()
|
||||
group.name = 'GuideMultiFloorModel'
|
||||
@@ -2310,6 +2316,7 @@ defineExpose({
|
||||
showMultiFloor,
|
||||
resetCamera,
|
||||
setCameraPreset,
|
||||
zoomCamera,
|
||||
focusTargetPoi: (request: TargetPoiFocusRequest) => {
|
||||
queueTargetFocus(request)
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user