|
@@ -1,4 +1,4 @@
|
|
|
-import { Vector2, Raycaster } from 'three'
|
|
|
+import { Vector2, Raycaster, Clock } from 'three'
|
|
|
import isAlpha from '../utils/isAlpha'
|
|
|
import { Easing, Tween } from '@tweenjs/tween.js'
|
|
|
import { getGeoJson } from '../utils/apis.js'
|
|
@@ -8,8 +8,12 @@ import { useOutsideHomeStore } from '@/stores/modules/home'
|
|
|
import { $mitt } from '@/utils'
|
|
|
import { router } from '@/router'
|
|
|
|
|
|
+let spriteArr = null
|
|
|
+
|
|
|
function createLoop(scene, camera, renderer, controls, labelRenderer, mapGroup, mapRef) {
|
|
|
const useHomeStore = useOutsideHomeStore()
|
|
|
+ console.log(mapGroup.children[0])
|
|
|
+ spriteArr = mapGroup.children[0].children.filter((item) => item.type === 'Sprite')
|
|
|
|
|
|
// 创建动画进场3d 视角转化特效
|
|
|
const tween = new Tween({ x: 0, y: 0, z: 100 }) // 起始位置
|
|
@@ -17,17 +21,35 @@ function createLoop(scene, camera, renderer, controls, labelRenderer, mapGroup,
|
|
|
.easing(Easing.Quadratic.Out) // 过度动画
|
|
|
.onUpdate((object) => {
|
|
|
// 改变摄像机位置
|
|
|
- camera.position.x = object.x
|
|
|
- camera.position.y = object.y
|
|
|
- camera.position.z = object.z
|
|
|
+ camera.position.set(object.x, object.y, object.z)
|
|
|
})
|
|
|
.start()
|
|
|
+ const tween2 = new Tween(camera.position)
|
|
|
+ .to({ x: camera.position.x, y: camera.position.y - 50, z: camera.position.z - 50 }, 1000)
|
|
|
+ .easing(Easing.Quadratic.Out)
|
|
|
+ .onUpdate((object) => {
|
|
|
+ camera.position.set(object.x, object.y, object.z)
|
|
|
+ })
|
|
|
+
|
|
|
+ function updateSprites(camera, sprites) {
|
|
|
+ const cameraPosition = camera.position
|
|
|
+ sprites.forEach((sprite) => {
|
|
|
+ const distance = cameraPosition.distanceTo(sprite.position)
|
|
|
+ // 根据距离调整 scale,这里假设一个简单的比例关系
|
|
|
+ const scaleFactor = 1 / distance
|
|
|
+ sprite.scale.set(scaleFactor, scaleFactor, 1)
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ const clock = new Clock()
|
|
|
const animate = () => {
|
|
|
- // map.rotation.y += 0.01
|
|
|
- renderer.setAnimationLoop(animate)
|
|
|
+ const elapsedTime = clock.getElapsedTime()
|
|
|
+ tween.update() // Convert to milliseconds
|
|
|
+ tween2.update() // Convert to milliseconds
|
|
|
+ updateSprites(camera, spriteArr)
|
|
|
controls.update()
|
|
|
- tween.update()
|
|
|
renderer.render(scene, camera)
|
|
|
+ renderer.setAnimationLoop(animate)
|
|
|
labelRenderer.render(scene, camera)
|
|
|
}
|
|
|
|
|
@@ -74,21 +96,25 @@ function createLoop(scene, camera, renderer, controls, labelRenderer, mapGroup,
|
|
|
const reRender = (adcode) => {
|
|
|
// 清除三维地图组 下钻
|
|
|
getGeoJson(adcode).then((geojson) => {
|
|
|
- console.log(geojson)
|
|
|
- console.log(mapGroup)
|
|
|
+ // console.log(geojson)
|
|
|
+ // console.log(mapGroup)
|
|
|
mapGroup.remove(...mapGroup.children)
|
|
|
mapRef.removeChild(labelRenderer.domElement)
|
|
|
const map = createMap(geojson, mapGroup)
|
|
|
labelRenderer = createLabelRenderer(mapRef)
|
|
|
mapGroup.add(map)
|
|
|
+ console.log(camera.position)
|
|
|
+ tween2.start()
|
|
|
+ // camera.position.set(0, mapGroup.position.y + 6, mapGroup.position.z + 6)
|
|
|
+
|
|
|
controls.update()
|
|
|
- tween.update()
|
|
|
renderer.render(scene, camera)
|
|
|
labelRenderer.render(scene, camera)
|
|
|
})
|
|
|
}
|
|
|
|
|
|
$mitt.on('onPreLevel', (item) => {
|
|
|
+ if (useHomeStore.codes.length === 1) return
|
|
|
useHomeStore.codes = useHomeStore.codes.slice(
|
|
|
0,
|
|
|
useHomeStore.codes.findIndex((code) => code.code === item.code) + 1
|
|
@@ -99,7 +125,6 @@ function createLoop(scene, camera, renderer, controls, labelRenderer, mapGroup,
|
|
|
window.addEventListener('dblclick', (event) => {
|
|
|
const intersect = getIntersect(event.clientX, event.clientY)
|
|
|
if (intersect) {
|
|
|
- console.log(intersect)
|
|
|
const { level, adcode, name } = intersect.properties
|
|
|
if (level === 'district') {
|
|
|
return
|