Merge branch 'dev-threejs'
| | |
| | | "pixels", |
| | | "pixels" |
| | | ], |
| | | "center": [ |
| | | 104.681471408, |
| | | 29.41058885 |
| | | ], |
| | | "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png", |
| | | "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:黑体,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)" |
| | | }, |
| | |
| | | "styleUrl": "#msn_ylw-pushpin0", |
| | | "fill-opacity": "0.5", |
| | | "fill": "#000000", |
| | | "stroke-opacity": "1" |
| | | "stroke-opacity": "1", |
| | | "center": [ |
| | | 104.805193, |
| | | 29.348033 |
| | | ] |
| | | }, |
| | | "geometry": { |
| | | "coordinates": [ |
| | |
| | | "icon-offset-units": [ |
| | | "pixels", |
| | | "pixels" |
| | | ], |
| | | "center": [ |
| | | 104.968050, |
| | | 29.285946 |
| | | ], |
| | | "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png", |
| | | "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:黑体,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)" |
| | |
| | | "pixels", |
| | | "pixels" |
| | | ], |
| | | "center": [ |
| | | 104.81804, |
| | | 29.440594 |
| | | ], |
| | | "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png", |
| | | "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:黑体,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)" |
| | | }, |
| | |
| | | "pixels", |
| | | "pixels" |
| | | ], |
| | | "center": [ |
| | | 104.599106, |
| | | 29.341427 |
| | | ], |
| | | "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png", |
| | | "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:黑体,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)" |
| | | }, |
| | |
| | | "icon-offset-units": [ |
| | | "pixels", |
| | | "pixels" |
| | | ], |
| | | "center": [ |
| | | 104.3334, |
| | | 29.2938 |
| | | ], |
| | | "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png", |
| | | "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:黑体,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)" |
| | |
| | | "pixels", |
| | | "pixels" |
| | | ], |
| | | "center": [ |
| | | 105.104762, |
| | | 29.518852 |
| | | ], |
| | | "icon": "http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png", |
| | | "Style": "BRUSH(id:ogr-brush-1);PEN(c:#4d90feff,w:1.000000px,id:ogr-pen-0);LABEL(f:黑体,s:11.000000pt,c:#ffffffff,w:100.000000,o:#000000ff)" |
| | | }, |
New file |
| | |
| | | import * as THREE from 'three'; |
| | | import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer'; |
| | | export default class CSSRenderer { |
| | | constructor(experience) { |
| | | this.experience = experience; |
| | | this.container = experience.container; |
| | | this.canvas = experience.canvas; |
| | | this.sizes = experience.sizes; |
| | | this.scene = experience.scene; |
| | | this.camera = experience.camera; |
| | | |
| | | this.setInstance(); |
| | | } |
| | | setInstance() { |
| | | this.instance = new CSS2DRenderer(); |
| | | this.instance.setSize(this.sizes.width, this.sizes.height); |
| | | this.instance.domElement.style.position = 'absolute'; |
| | | this.instance.domElement.style.top = '0px'; |
| | | this.instance.domElement.style.left = '0px'; |
| | | this.instance.domElement.style.pointerEvents = 'none'; |
| | | this.container.appendChild(this.instance.domElement); |
| | | |
| | | } |
| | | resize() { |
| | | this.instance.setSize(this.sizes.width, this.sizes.height); |
| | | this.instance.setPixelRatio(this.sizes.pixelRatio); |
| | | } |
| | | update() { |
| | | this.instance.render(this.scene, this.camera.instance); |
| | | } |
| | | } |
| | |
| | | import World from "./world/world"; |
| | | import Camera from "./camera"; |
| | | import Renderer from "./renderer"; |
| | | import CSSRenderer from './cssRenderer'; |
| | | |
| | | // 工具类 |
| | | import Sizes from "./utils/sizes"; |
| | |
| | | export default class Experience { |
| | | constructor(canvas) { |
| | | this.canvas = canvas; |
| | | this.container = canvas.parentElement; |
| | | this.sizes = new Sizes(this.canvas); |
| | | this.time = new Time(); |
| | | this.scene = new Scene(); |
| | | this.camera = new Camera(this); |
| | | this.renderer = new Renderer(this); |
| | | this.cssRenderer = new CSSRenderer(this); |
| | | this.world = new World(this); |
| | | |
| | | // const size = 100; |
| | |
| | | this.camera.update(); |
| | | this.world.update(); |
| | | this.renderer.update(); |
| | | this.cssRenderer.update(); |
| | | this.stats.update(); |
| | | } |
| | | } |
| | |
| | | import * as THREE from 'three'; |
| | | import * as d3 from 'd3'; |
| | | import mapData from '@/assets/map/zigong2.json'; |
| | | import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer'; |
| | | |
| | | import textureMapImage from '@/assets/map/texture/gz-map.jpg'; |
| | | import textureMapFxImage from '@/assets/map/texture/gz-map-fx.jpg'; |
| | |
| | | export default class Map { |
| | | constructor(experience) { |
| | | this.experience = experience; |
| | | this.scene = this.experience.scene; |
| | | this.camera = this.experience.camera; |
| | | this.scene = experience.scene; |
| | | this.camera = experience.camera; |
| | | |
| | | this.provinceMeshList = []; |
| | | this.labelList = []; |
| | | this.textureLoader = new THREE.TextureLoader(); |
| | | this.setTexture(); |
| | | this.operationData(mapData); |
| | |
| | | const province = new THREE.Object3D(); |
| | | // 地址 |
| | | province.properties = feature.properties.name; |
| | | province.isHover = false; |
| | | // 多个情况 |
| | | // console.log(feature.geometry.type); |
| | | if (feature.geometry.type === "MultiPolygon") { |
| | |
| | | this.provinceMeshList.push(mesh); |
| | | }); |
| | | } |
| | | province.isHover = false; |
| | | const label = this.drawLabelText(feature); |
| | | this.labelList.push({ name: feature.properties.name, label }); |
| | | province.add(label); |
| | | this.map.add(province); |
| | | }); |
| | | this.map.position.set(1, 1, -1.5); |
| | |
| | | ]); |
| | | } |
| | | |
| | | drawLabelText(province) { |
| | | const [x, y] = projection(province.properties.center); |
| | | const div = document.createElement('div'); |
| | | div.innerHTML = province.properties.name; |
| | | div.style.padding = '4px 10px'; |
| | | div.style.color = '#fff'; |
| | | div.style.fontSize = '16px'; |
| | | div.style.position = 'absolute'; |
| | | div.style.backgroundColor = 'rgba(25,25,25,0.5)'; |
| | | div.style.borderRadius = '5px'; |
| | | const label = new CSS2DObject(div); |
| | | div.style.pointerEvents = 'none'; |
| | | label.position.set(x, y, MAP_DEPTH + 0.05); |
| | | return label; |
| | | } |
| | | |
| | | |
| | | setMouseEvent() { |
| | | this.mouseEvent = this.handleEvent.bind(this); |
| | |
| | | if (intersects.length) { |
| | | let temp = intersects[0].object; |
| | | this.animation(temp.parent); |
| | | this.showLabel(temp.parent); |
| | | } else { |
| | | this.animation(); |
| | | } |
| | |
| | | }) |
| | | } |
| | | |
| | | showLabel(province) { |
| | | this.labelList.forEach((item) => { |
| | | // if (item.name === province.properties) { |
| | | // item.label.element.style.visibility = 'visible'; |
| | | // } else { |
| | | // item.label.element.style.visibility = 'hidden'; |
| | | // } |
| | | }) |
| | | } |
| | | |
| | | enterAnimation() { |
| | | gsap.to(this.map.scale, { |
| | | z: 10, |