VUE百度地图加载3D模型(MapVThreeGallery)-点击弹出模型信息

参考百度开发文档
补充下(里面有免费的可以拿来玩)3D模型下载网址
步骤
1: npm install mapv-three 安装插件

 npm install mapv-three

2:在index.html加载百度地图在这里插入图片描述

 <script src="https://api.map.baidu.com/api?v=1.0&type=webgl&ak=你的百度秘钥"></script>

注:加载model.glb文件需要是请求服务器来的,没有服务器资源的可以像我一样在本地用VS插件(Live Server)起了个小型服务器放3D模型数据 ----使用Visual Studio Code安装Live Server插件
在这里插入图片描述
然后右击index.html选择红框打开,就可以加载本地的3D模型数据了(这边是为了把这个小型本地服务启动起来,后面只用到了网址)
在这里插入图片描述
在这里插入图片描述

全部代码:

<template>
  <div class="hello" id="map_container" style="width: 100%;height: 100%;"></div>
</template>

<script>
import { Engine, GeoJSONDataSource, EmptySky, Polygon, ExtendMeshStandardMaterial } from 'mapv-three';
import { GLTFLoader } from 'bmap-three/examples/jsm/loaders/GLTFLoader.js';
import { PlaneGeometry, Mesh, MeshStandardMaterial, MeshBasicMaterial, Color, BoxGeometry, TextureLoader, RepeatWrapping } from 'bmap-three';

export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data() {
    return {
    };
  },
  created() { },
  mounted() {
    this.ikn()
  },
  methods: {
    ikn() {
      const center = [120.90197,31.97289];
      const map = new BMapGL.Map('map_container', {
        restrictCenter: false,
        maxZoom: 25,
        displayOptions: {
          building: false,
        },
      });

      map.centerAndZoom(new BMapGL.Point(center[0], center[1]), 17);
      map.enableScrollWheelZoom(true);
      map.enableKeyboard();
      map.enableInertialDragging();
      map.enableContinuousZoom();
      map.setTilt(40);//地图倾斜角度
      map.setHeading(10);//地图旋转角度

      const engine = new Engine(map, {});
      engine.map.setCenter(center);
      engine.rendering.useMrt = true;
      engine.rendering.shadow.enabled = true;
      engine.rendering.animationLoopFrameTime = 40;
      engine.rendering.colorAdjust.saturation = 0.25;
      engine.rendering.colorAdjust.contrast = 0.15;
      engine.rendering.colorAdjust.brightness = 0;

      const sky = engine.add(new EmptySky());
      sky.time = 3600 * 16.5;

      const position = engine.map.projectPointArr(center);

      let mxUrl='http://127.0.0.1:5501/'
      // 模型
      const models = [
        {
          position: [120.90097,31.97889, 6],
          path: mxUrl+'/src/assets/model.glb',
          rotate: true,
          info: '酒瓶',
          rotation:[6.2 / 4,10.3,6.3],
          scale:[150,150,150]
        },
        {
          position: [120.90097,31.96889, 6],
          path: mxUrl+'/src/assets/model2.glb',
          rotate: false,
          info: '房间',
          rotation:[6.2 / 4,10.3,6.3],
          scale:[50,50,50]
        },
        {
          position: [120.91097,31.97289, 6],
          path: mxUrl+'/src/assets/model3.glb',
          rotate: true,
          info: '蓝鳍金枪鱼',
          rotation:[10.2 / 4,5.3,5.3],
          scale:[300,300,300]
        }
      ];

      let changModels = [],XYdata = []
      models.forEach((item,index) => {
        XYdata = this.Mercator2LonLat({x:item.position[0],y:item.position[1]})
        item.position = [XYdata.x,XYdata.y,item.position[2]]
        changModels.push(item)
      });
      // console.log("处理",changModels)

      const loader = new GLTFLoader();
      for (let i = 0; i < changModels.length; i++) {
        loader.load(changModels[i].path, gltf => {
          
          // console.log(gltf)
          const model = gltf.scene.children[0];
          model.userData.info = changModels[i].info;
          for (let i = 0; i < model.children.length; i++) {
            model.children[i].castShadow = true;
          }
          // console.log(models[i].rotation)
          let rotaData = changModels[i].rotation;
          let scalData = changModels[i].scale;
          model.rotation.set(rotaData[0],rotaData[1],rotaData[2]);//身体旋转角度
          model.scale.set(scalData[0],scalData[1],scalData[2]);//物体缩放大小
          
          model.position.set(changModels[i].position[0], changModels[i].position[1], changModels[i].position[2]);

          if (changModels[i].rotate) {
            model.rotation.x = Math.PI / 2;
            model.rotation.y = 1.08 * Math.PI / 2;
          }
          engine.add(model);
          // 模型添加点击事件
          engine.event.markEventProxy(model);
          engine.event.bind(model, 'click', e => {
            console.log(model)
            alert('点击了 ' + model.userData.info);
          });
        });
      }

    },
    Mercator2LonLat(lonlat) {
      //墨卡托经纬度坐标转换
      var mercator = {
        x: 0,
        y: 0
      };
      var x = lonlat.x * 20037508.34 / 180;
      var y = Math.log(Math.tan((90 + lonlat.y) * Math.PI / 360)) / (Math.PI / 180);
      y = y * 19915508.34 / 180;
      mercator.x = x;
      mercator.y = y;
      // console.log("完成左边转换",lonlat,mercator)
      return mercator;
    },
  },
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  display: inline-block;
  margin: 0 10px;
}

a {
  color: #42b983;
}
</style>

目录结构如下:
在这里插入图片描述

效果图如下:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Vue加载3D模型需要使用Three.js库。首先,需要在Vue项目中安装Three.js库。然后,可以使用Three.js提供的Loader加载3D模型文件,例如OBJ、FBX、GLTF等格式。加载完成后,可以将模型添加到场景中进行渲染。具体的实现可以参考Three.js的官方文档和示例代码。 ### 回答2: 使用vue实现three.js的3D模型加载需要以下步骤: 1. 安装three.js库 在vue项目中使用three.js需要先安装three.js库。可以通过npm安装: ```npm install three --save``` 安装后,可以通过需要使用three.js的组件中引入库: ```import * as THREE from 'three'``` 2. 创建场景、相机、渲染器 在vue组件内部需要先创建基本的场景、相机和渲染器组件: ```javascript mounted() { //创建场景 this.scene = new THREE.Scene(); //创建相机 this.camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000); //创建渲染器 this.renderer = new THREE.WebGLRenderer({ antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.renderer.setClearColor('#F5F5F5', 1.0); //将渲染器添加到页面中 this.$refs.box.appendChild(this.renderer.domElement); } ``` 其中,mounted()生命周期函数是在vue组件加载完毕后需要去执行的函数。 3. 加载模型 加载模型需要借助于GLTFLoader库,可以通过npm安装依赖: ```npm install three-gltf-loader --save``` 加载gltf格式的模型需要加载器: ```javascript import { GLTFLoader } from 'three-gltf-loader'; mounted() { //创建GLTFloader对象 this.loader = new GLTFLoader(); //加载模型 this.loader.load(url, object => { this.scene.add(object.scene); this.animate(); }); } ``` 其中,url是需要加载模型地址,object是加载完成后的对象。 4. 更新场景 ```javascript methods: { animate() { this.renderer.render(this.scene, this.camera); //转动,可以忽略 window.requestAnimationFrame(this.animate); this.scene.rotation.y += 0.01; } } ``` 其中,animate()方法是更新场景的方法。在该方法中需要更新场景的内容,并进行渲染。 5. 完整代码展示 ```javascript <template> <div ref="box"></div> </template> <script> import * as THREE from 'three'; import { GLTFLoader } from 'three-gltf-loader'; export default { data() { return { scene: null, camera: null, renderer: null, loader: null } }, mounted() { //创建场景 this.scene = new THREE.Scene(); //创建相机 this.camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 1000); //创建渲染器 this.renderer = new THREE.WebGLRenderer({ antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.renderer.setClearColor('#F5F5F5', 1.0); //将渲染器添加到页面中 this.$refs.box.appendChild(this.renderer.domElement); //创建GLTFloader对象 this.loader = new GLTFLoader(); //加载模型 this.loader.load(url, object => { this.scene.add(object.scene); this.animate(); }); }, methods: { animate() { this.renderer.render(this.scene, this.camera); //转动,可以忽略 window.requestAnimationFrame(this.animate); this.scene.rotation.y += 0.01; } } } </script> ``` 这就是vue中three.js加载3D模型的完整教程,希望对你有所帮助。 ### 回答3: Vue是一种流行的JavaScript框架,而three.js是一个强大的WebGL库,用于创建和呈现3D图形。将Vue与three.js结合使用,可以在Vue应用程序中轻松加载和处理3D模型。 要在Vue加载3D模型,首先需要安装three.js库。可以使用npm或yarn等包管理工具安装它。然后在Vue应用程序中导入该库并创建一个Scene对象。场景是three.js中用于呈现所有3D对象的容器。 然后需要定义一个渲染器,将场景渲染到屏幕上。在Vue中,可以在组件的mounted钩子函数中定义渲染器。需要将渲染器的DOM元素设置为Vue组件的$el属性。 现在就可以加载3D模型了。可以使用three.js中的Loader方法加载3D模型文件。three.js支持多种3D模型格式,如OBJ、STL和GLTF。加载完成后,将3D对象添加到场景中即可。 由于Vue具有响应式数据绑定的特性,可以在Vue组件中轻松地控制3D模型的属性,比如位置、旋转和缩放。只需在Vue组件中定义数据模型,并在模板中使用数据绑定即可。 在Vue中使用three.js创建3D场景需要一些基本的知识,但很容易上手。可以使用Vue和three.js创建漂亮的3D场景和模型,从而增强Vue应用程序的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值