From 427c876d16ba2e310b90092ab65af40f96c672f4 Mon Sep 17 00:00:00 2001
From: 龚焕茏 <2842157468@qq.com>
Date: 星期五, 19 四月 2024 10:47:45 +0800
Subject: [PATCH] 接口权限精确到按钮补充
---
src/views/screen/components/screen-map-three/experience/world/map.js | 92 ++++++++++++++++++++++++++++++++++------------
1 files changed, 68 insertions(+), 24 deletions(-)
diff --git a/src/views/screen/components/screen-map-three/experience/world/map.js b/src/views/screen/components/screen-map-three/experience/world/map.js
index 00cc026..2d2a299 100644
--- a/src/views/screen/components/screen-map-three/experience/world/map.js
+++ b/src/views/screen/components/screen-map-three/experience/world/map.js
@@ -4,9 +4,9 @@
import textureMapImage from '@/assets/map/texture/gz-map.jpg';
import textureMapFxImage from '@/assets/map/texture/gz-map-fx.jpg';
-import { BufferGeometryUtils } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
import gsap from 'gsap';
+
// 鍦板浘娣卞害
const MAP_DEPTH = 0.2;
@@ -19,10 +19,13 @@
this.experience = experience;
this.scene = this.experience.scene;
this.camera = this.experience.camera;
- this.material = null;
+ this.provinceMeshList = [];
this.textureLoader = new THREE.TextureLoader();
this.setTexture();
this.operationData(mapData);
+ setTimeout(() => {
+ this.enterAnimation();
+ }, 500);
}
setTexture() {
const textureMap = this.textureLoader.load(textureMapImage);
@@ -54,8 +57,8 @@
* @param {*} jsondata 鍦板浘鏁版嵁
*/
operationData(jsondata) {
+ this.map = new THREE.Group();
- this.map = new THREE.Object3D();
// geo淇℃伅
const features = jsondata.features;
features.forEach((feature) => {
@@ -72,6 +75,7 @@
const mesh = this.drawExtrudeMesh(rows);
province.add(line);
province.add(mesh);
+ this.provinceMeshList.push(mesh);
});
});
}
@@ -83,20 +87,17 @@
const mesh = this.drawExtrudeMesh(coordinate);
province.add(line);
province.add(mesh);
+ this.provinceMeshList.push(mesh);
});
}
- // 鍚堝苟鎴愪竴涓猰esh
- // const mergedGeometry = BufferGeometryUtils.mergeGeometries(province.children);
-
+ province.isHover = false;
this.map.add(province);
});
this.map.position.set(1, 1, -1.5);
- this.map.scale.set(10, 10, 10);
+ this.map.scale.set(10, 10, 1);
this.map.rotation.set(THREE.MathUtils.degToRad(-90), 0, THREE.MathUtils.degToRad(20));
- // this.container = new THREE.Object3D();
- // this.container.add(this.map);
this.scene.add(this.map);
- console.log(this.map);
+
this.setMouseEvent();
}
@@ -151,7 +152,6 @@
setMouseEvent() {
this.mouseEvent = this.handleEvent.bind(this);
- // this.experience.canvas.addEventListener("mousemove", this.throttle(this.mouseEvent,100));
this.experience.canvas.addEventListener("mousemove", this.mouseEvent);
}
@@ -163,19 +163,22 @@
// console.log(this);
// return;
if (this.map) {
- const mouse = new THREE.Vector2();
- mouse.x = (e.clientX / window.innerWidth) * 2 - 1;
- mouse.y = -(e.clientY / window.innerHeight) * 2 + 1;
+ let mouse = new THREE.Vector2();
+ let getBoundingClientRect = this.experience.canvas.getBoundingClientRect();
+ let x = ((e.clientX - getBoundingClientRect.left) / getBoundingClientRect.width) * 2 - 1;
+ let y = -((e.clientY - getBoundingClientRect.top) / getBoundingClientRect.height) * 2 + 1;
+ mouse.x = x;
+ mouse.y = y;
+
raycaster.setFromCamera(mouse, this.camera.instance);
- const intersects = raycaster.intersectObjects(this.map.children, true);
+
+ let intersects = raycaster.intersectObjects(this.provinceMeshList, false);
+
if (intersects.length) {
- intersects.forEach((item) => {
- if (item.object)
- if (item.object.meshName === 'province') {
- console.log(item.object);
- this.animation(item.object);
- }
- });
+ let temp = intersects[0].object;
+ this.animation(temp.parent);
+ } else {
+ this.animation();
}
}
}
@@ -191,7 +194,48 @@
};
}
- animation(mesh) {
- console.log(mesh);
+ animation(province) {
+ if (province) {
+ if (!province.isHover) {
+ province.isHover = true;
+ this.map.children.forEach((item) => {
+ if (item.properties === province.properties) {
+ gsap.to(province.position, {
+ z: 0.12,
+ duration: 0.6
+ })
+ } else {
+ this.resetAnimation(item);
+ }
+ })
+ }
+ } else {
+ this.resetAllAnimation();
+ }
+
+ }
+
+ resetAnimation(province) {
+ gsap.to(province.position, {
+ z: 0,
+ duration: 0.6,
+ onComplete: () => {
+ province.isHover = false;
+ }
+ })
+ }
+
+ resetAllAnimation() {
+ this.map.children.forEach((item) => {
+ this.resetAnimation(item);
+ })
+ }
+
+ enterAnimation() {
+ gsap.to(this.map.scale, {
+ z: 10,
+ duration: 0.6,
+ ease: 'power1.out'
+ })
}
}
\ No newline at end of file
--
Gitblit v1.8.0