Three.js点击地图动态标注

本文介绍了一种基于Three.js的三维地图交互技术实现方法,通过动态添加光圈、棱柱及标签来增强用户体验。该方法利用射线追踪技术定位点击位置,并根据地图数据实时更新视觉元素。

首先来看看效果 

效果目前就是这样。实现这种效果也借用了很多别人的代码,这里我就只说动态添加怎么来的。

首先肯定是创建射线,获得你点击的那个区域,同时在生成地图本身的时候就给mesh对象添加上相应的mesh和center,这里我用的都是各个行政区划的省会。

var loader = new THREE.FileLoader()
        loader.setResponseType('json');
        loader.load("http://26.26.26.1:8099/china.json", (data) => {
            data.features.forEach((middle) => {
                var height1 = 2
                var height2 = -0.2
                var name = middle.properties.name
                var center = middle.properties.center
...
                meshGroup.add(ExtrudeMesh(middle.geometry.coordinates, height1, name, center))
            })
        })
    var mesh = new THREE.Mesh(geometry, material);
    mesh.name = name
    mesh.center = center
    return mesh;

然后就是当点击的时候给对应的位置添加上光圈和棱柱还有标签

        var label;
        var mesh;
        var lengzhu;
        var chooseMesh = null;//标记鼠标拾取到的mesh
        function choose(event) {
            scene.remove(mesh)
            scene.remove(lengzhu)
            scene.remove(label)
...
            var pos;
            // 光圈
            pos = intersects[0].object.center
            var size = 1.2;//大小根据地图尺寸范围设置或者说相机渲染范围
            mesh = cityPointMesh(size, pos[0], pos[1]);
            mesh.position.z = 2 + 2 * 0.01;

            // 棱锥
            lengzhu = ConeMesh(size, pos[0], pos[1])
            lengzhu.position.z = 2 + 2 * 0.01;

            // 标注
            label = CreateDivByCSS2(intersects[0].object.name, pos[0], pos[1], 2.1)
           
            scene.add(mesh)
            scene.add(lengzhu)
            scene.add(label)
        }
        addEventListener('click', choose); // 监听窗口鼠标单击事件

在每一次点击的时候都对上一次点击的相应对象进行移除,保证在整个画面中都只有一个棱柱、标签和光圈。

### 如何在 Three.js 中使用高德地图 API 实现 3D 地图效果 要在 Three.js 中集成高德地图并实现 3D 效果,可以按照以下方法操作: #### 初始化高德地图Three.js 的结合 通过高德地图的 `AMap.Map` 方法创建一个基础的地图实例,并将其嵌入到 HTML 容器中。为了支持 3D 功能,需设置参数 `viewMode: '3D'` 和自定义样式[^3]。 ```javascript // 初始化高德地图 this.map = new AMap.Map('mapContainer', { zoom: 10, center: [116.397428, 39.90923], viewMode: '3D', mapStyle: 'amap://styles/dark' }); ``` #### 使用 Three.js 渲染场景 Three.js 是用于渲染复杂 3D 图形的强大工具。可以通过监听高德地图的事件获取当前视角矩阵和投影矩阵,并传递给 Three.js 进行渲染[^2]。 ```javascript const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.getElementById('threejsCanvas').appendChild(renderer.domElement); function render() { requestAnimationFrame(render); // 获取高德地图的相机信息 const matrix = this.map.getScene().camera.viewMatrix; const projectionMatrix = this.map.getScene().camera.projectionMatrix; // 更新 Three.js 相机 camera.matrixWorldInverse.fromArray(matrix); camera.projectionMatrix.fromArray(projectionMatrix); renderer.render(scene, camera); } render(); ``` #### 添加飞线动画 利用 Three.js 的几何体对象(如 Line 或 TubeGeometry),可以在两点之间绘制动态路径。配合 Tween.js 或 GSAP 库可轻松实现平滑过渡效果。 ```javascript // 创建一条飞线 const material = new THREE.LineBasicMaterial({ color: 0xffffff }); const points = []; points.push(new THREE.Vector3(-10, 0, -10)); points.push(new THREE.Vector3(0, 10, 0)); points.push(new THREE.Vector3(10, 0, 10)); const geometry = new THREE.BufferGeometry().setFromPoints(points); const line = new THREE.Line(geometry, material); scene.add(line); ``` #### 设置炫酷标牌 对于地标标注,可通过加载外部模型文件(如 glTF 格式)或者直接构建简单的三维形状作为标记物。 ```javascript // 加载 GLTF 模型作为标志 const loader = new THREE.GLTFLoader(); loader.load('/path/to/model.gltf', (gltf) => { const model = gltf.scene; model.scale.set(0.1, 0.1, 0.1); // 缩放比例调整 model.position.set(x, y, z); // 设定坐标位置 scene.add(model); }); ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值