AMap+Three.js踩坑日记

简介: 最近有个项目要跟高德地图结合,2D功能和3D功能都要有,于是就用到`AMap.GLCustomLayer`,能让我用Three,那就可以放飞自我了,然而我头秃了!

最近有个项目要跟高德地图结合,2D功能和3D功能都要有,于是就用到AMap.GLCustomLayer,能让我用Three,那就可以放飞自我了,然而我头秃了!

官方示例:https://developer.amap.com/demo/jsapi-v2/example/selflayer/glcustom-layer

注意事项

1.three.js版本问题

我之前习惯124的,官方给出的是142,现在这两个版本没问题,不清楚其他版本行不行。

2.中心点设置

这会作为参考的原点,所有坐标相对于这个坐标的

    map.customCoords.setCenter(mapConfig.center);

3.不要在render里面搞事情

直接按照官方照搬,render就是个帧渲染,在里面搞东西会导致你不停的重复操作,卡死你,把你的requestAnimationFrame动画提到外面


     var gllayer = new AMap.GLCustomLayer({
   
              // 图层的层级
              zIndex: 10,
              // 初始化的操作,创建图层过程中执行一次。
              init: async (gl) => {
   

              },
              render: () => {
   
                //直接按照官方照搬
              }
            });
             map.add(gllayer);

             // 动画
        function animate() {
   
          if (window.threeApp?.isStats) {
   
            window.threeApp.stats.update();
          }
          if (window.TWEEN) {
   
            window.TWEEN.update();
          }
          if (window.controls) {
   
            window.controls.update();
          }
          map.render();
          requestAnimationFrame(animate);
        }
        animate();

4. 高德地图的视角控制

你能采用center,zoom,pitch,rotation进行调控视角了,通过getView来获取当前视角,然后对应赋值。地图的视角切换已经自带动画了,TWEEN可以省了,优秀!

 cameraTo(c) {
   
    this.map.setCenter(c.pos);
    this.map.setZoom(c.zoom);
    this.map.setPitch(c.pitch, true, 1000);
    this.map.setRotation(c.rotate, true, 1000);
    this.camera.position.x = c.camera.x;
    this.camera.position.y = c.camera.y;
    this.camera.position.z = c.camera.z;
  }
  getView() {
   
    console.log('center', this.map.getCenter());
    console.log('zoom', this.map.getZoom());
    console.log('pitch', this.map.getPitch());
    console.log('rotate', this.map.getRotation());
    console.log('camera', this.camera.position);
  }

5.添加模型后发现模型不见了

emmm~,打印scene,明明在的,咋就没踪没影了。

1.除了要用customCoords.lngLatToCoord转换坐标位置,还要注意高德地图的xyz跟常用THREE的xyz有点不同

  • THREE里面,z对应前后,x对应左右,y对应上下
  • 而AMAP里面,xy是对应经纬度,z对应的上下的位置,模型有可能需要转个角度Math.PI*0.5.

2.老生常谈的注意模型大小,模型大小跟地图放缩是同步的,有可能因为这样而看不清。

6.跟高德地图模型混合,但又不想清空附近的建筑模型

这个问题我也不知道,求大神来解答。目前我要不只能用人家的建筑模型,要不就把建筑给关了showBuildingBlock: false

7.包围盒计算区别

function getObjBox(object) {
   
  if (object.updateMatrixWorld) {
   
    object.updateMatrixWorld();
  }

  // 获得包围盒得min和max
  const box = new THREE.Box3().setFromObject(object);

  let objSize = box.getSize(new THREE.Vector3());
  // 返回包围盒的中心点
  const center = box.getCenter(new THREE.Vector3());
  return {
   
    size: objSize,
    center,
    box
  };
}

因为THREE与AMAP的y和z是不同的,然后就会THREE依旧遵循原来的规则,box的min,max,center,size的y和z记得要对调一下才是正确的

后续开发中遇到问题,会继续更新~

相关文章
|
2月前
|
JavaScript
JS实现简单的打地鼠小游戏源码
这是一款基于JS实现简单的打地鼠小游戏源码。画面中的九宫格中随机出现一个地鼠,玩家移动并点击鼠标控制画面中的锤子打地鼠。打中地鼠会出现卡通爆破效果。同时左上角统计打地鼠获得的分数
129 1
|
2月前
|
JavaScript
JS趣味打字金鱼小游戏特效源码
hi fish是一款打字趣味小游戏,捞出海里的鱼,捞的越多越好。这款游戏用于电脑初学者练习打字。初学者可以根据自己的水平设置游戏难度。本段代码可以在各个网页使用,有需要的朋友可以直接下载使用,本段代码兼容目前最新的各类主流浏览器,是一款非常优秀的特效源码!
38 3
|
5月前
|
Web App开发 前端开发 JavaScript
手摸手教你,从0到1开发一个Chrome浏览器插件
开发 Chrome 插件既有趣又具成就感。本教程将引导你从零开始,逐步创建一个简单的 Chrome 插件。首先了解 Chrome 插件是可增强浏览器功能的小程序。以一个基础示例开始,你将学习如何设置开发环境,包括安装 Chrome 和准备文本编辑器,并掌握 HTML、CSS 和 JavaScript 的基础知识。接着,我们将构建插件的基本结构,涉及 `manifest.json` 配置文件、`background.js` 后台脚本、`popup.html` 用户界面以及 `style.css` 样式表。
386 8
|
8月前
|
自然语言处理 JavaScript 前端开发
自己整理的vue实现生成分享海报(含二维码),看着网上的没实现
自己整理的vue实现生成分享海报(含二维码),看着网上的没实现
|
前端开发 JavaScript 算法
ThreeJS开篇
ThreeJS开篇
181 0
|
监控 前端开发 JavaScript
敢在我工位装摄像头?吃我一套JS ➕ CSS组合拳!!👊🏻
前言 大家好,我是HoMeTown 不知道大家最近有没有看到过封面上的这张图,某公司在个人工位安装监控,首先我个人认为,第一每个行业有每个行业的规定,如果公司和员工提前做好沟通,并签过合同协议的话,问题不大,比如银行职员这种岗位。第二是私人企业和员工如果签订了补偿协议?协议里明确说明工资翻3倍?4倍?5倍?或者其他的对员工有利的条件?(如果一个探头能翻3倍工资,那我觉得我可以装满)
109 0
|
前端开发
【笔记12】无缝滚动插件的使用
① 第一次工作的第一项目要求做如下图所示的【无缝滚动】效果,这把我难倒了。 ② 两个同事,一个用轮播图,一个用 CSS。虽然我不知道咋实现,但觉得这俩方法好 low(一点思路也没有的我更 low) ③ 我实在不知道如何实现,我各种网上搜索。最后,终于等到你,还好我没有放弃。
165 0
|
前端开发 JavaScript
💖CSS + JS 送学妹满屏幕小爱心
💖CSS + JS 送学妹满屏幕小爱心
154 0
|
JavaScript 前端开发 Java
原生js的笔记
java是SUN公司开发的 是强类型,基于面向对象的后端语言。 javascrip是Netsape公司,是弱类型,基于对象的客户端脚本语言。

热门文章

最新文章