From 27ff7f3cbd6b66f32f7b738fd4aff3f8d6320584 Mon Sep 17 00:00:00 2001 From: ZhangXianQiang <1135831638@qq.com> Date: 星期二, 02 四月 2024 14:53:16 +0800 Subject: [PATCH] feat:添加地图模型 --- src/views/screen/components/screen-map-three/experience/world/map.js | 99 ++++++++++++++++++++++++++++++------------------- 1 files changed, 60 insertions(+), 39 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 e32efc6..06e36dc 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 @@ -1,51 +1,67 @@ import * as THREE from 'three'; import * as d3 from 'd3'; -import mapData from '@/assets/map/zigong.json'; +import mapData from '@/assets/map/zigong2.json'; +import textureMap from '@/assets/map/texture/map_texture.jpg'; + +// 鍦板浘娣卞害 +const MAP_DEPTH = 0.2; const projection = d3.geoMercator().center([104.779307, 29.33924]).translate([0, 0, 0]); export default class Map { constructor(experience) { this.experience = experience; this.scene = this.experience.scene; + this.material = null; this.operationData(mapData); } operationData(jsondata) { - this.map = new THREE.Object3D(); - // geo淇℃伅 - const features = jsondata.features; - features.forEach((feature) => { - // 鍗曚釜鐪佷唤 瀵硅薄 - const province = new THREE.Object3D(); - // 鍦板潃 - province.properties = feature.properties.name; - const coordinates = feature.geometry.coordinates; - - // 澶氫釜鎯呭喌 - if (feature.geometry.type === "MultiPolygon") { - coordinates.forEach((coordinate) => { - coordinate.forEach((rows) => { - const line = this.drawBoundary(rows); - const mesh = this.drawExtrudeMesh(rows); - province.add(line); - province.add(mesh); - }); + const loader = new THREE.TextureLoader(); + loader.load(textureMap, + (texture) => { + this.material = new THREE.MeshBasicMaterial({ + map: texture }); - } - // 鍗曚釜鎯呭喌 - if (feature.geometry.type === "Polygon") { - coordinates.forEach((coordinate) => { - const line = this.drawBoundary(coordinate); - const mesh = this.drawExtrudeMesh(coordinate); - province.add(line); - province.add(mesh); + this.map = new THREE.Object3D(); + // geo淇℃伅 + const features = jsondata.features; + features.forEach((feature) => { + // 鍗曚釜鐪佷唤 瀵硅薄 + const province = new THREE.Object3D(); + // 鍦板潃 + province.properties = feature.properties.name; + // 澶氫釜鎯呭喌 + if (feature.geometry.type === "GeometryCollection") { + feature.geometry.geometries.forEach((coordinate) => { + coordinate.coordinates.forEach((rows) => { + const line = this.drawBoundary(rows); + const mesh = this.drawExtrudeMesh(rows); + province.add(line); + province.add(mesh); + }); + }); + } + + // 鍗曚釜鎯呭喌 + if (feature.geometry.type === "Polygon") { + feature.geometry.coordinates.forEach((coordinate) => { + const line = this.drawBoundary(coordinate); + const mesh = this.drawExtrudeMesh(coordinate); + province.add(line); + province.add(mesh); + }); + } + this.map.add(province); + this.map.position.set(0.001, 0, 0.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.container); + console.log(this.container); } - this.map.add(province); - this.map.position.set(0, 0, 0); - }); - this.scene.add(this.map); + ) } drawBoundary(polygon) { const points = []; @@ -57,8 +73,9 @@ const lineMaterial = new THREE.LineBasicMaterial({ color: 'yellow' }); - - return new THREE.Line(lineGeometry, lineMaterial); + const line = new THREE.Line(lineGeometry, lineMaterial); + line.translateZ(MAP_DEPTH); + return line; } drawExtrudeMesh(polygon) { @@ -75,16 +92,20 @@ } const geometry = new THREE.ExtrudeGeometry(shape, { - depth: 0, - bevelEnabled: false + depth: MAP_DEPTH, + bevelEnabled: false, }); const material = new THREE.MeshBasicMaterial({ - color: '#fff', + color: '#525288', transparent: true, - opacity: 0.2, + opacity: 1, }) - return new THREE.Mesh(geometry, material); + + console.log(geometry); + + + return new THREE.Mesh(geometry, this.material); } } \ No newline at end of file -- Gitblit v1.8.0