vue2+three.js做出一个精美的3D地图——4.在地图上添加模型或者精灵sprite



前言

代码地址 : https://gitee.com/txcst/3-dmap.git 只想好好做开源。

上一期我们已经把地图构建好了,现在我们给地图添加一些模型和精灵

一、如何引入外部模型

1.three.js想要使用模型,需要使用加载器,它本身内置了很多加载器,在 ‘three/examples/jsm/loaders/’ 地址下,可以根据自己的需要去找,简单介绍几个常用的加载器,

  • TextureLoader(),纹理加载器,加载一张图片,返回的是纹理
  • GLTFLoader(),gltl模型加载器,会返回一个gltf模型对象,
  • FileLoader(),文件加载器,返回字符串

2.加载模型,打算在北京放置一个故宫的模型,在sketchfab白嫖了一个免费的模型,我们把他下载到本地,现在我们要开始处理两件事

  1. 获取北京的地图坐标
  2. 引入模型放置到北京的坐标上
先获取坐标

我们来到generateGeometry方法,再循环坐标处,增加一个筛选,添加到special数组里

 jsondata.features.forEach((elem) => {
          if (
            elem.properties.name == "陕西省" ||
            elem.properties.name == "北京市"
          ) {
            let obj = {
              name: elem.properties.name,
              arr: [projection(elem.properties.center)],
            };
           special.push(obj);
          }
引入模型
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";

注意,gltf模型的scene是我们要使用到,我们调整模型的坐标轴和角度和大小,使他贴到地图上,然后加到地图的map对象里,记住要加到地图的对象里,不要直接加在scene里,这样会使坐标对不上

  • position:模型坐标方位
  • rotation:模型的角度
  • scale:模型的大小
  //获取故宫的模型
    GetGLTFLoader(x, y, z) {
      const loader = new GLTFLoader();
      //加载模型文件,返回gltf对象
      loader.load("/data/gugong.glb", function (gltf) {
        gltf.scene.scale.set(0.02, 0.02, 0.02);
        gltf.scene.position.set(x, y, z);
        gltf.scene.rotation.x = 1.5;
        gltf.scene.rotation.y = 1.5;
        map.add(gltf.scene);
      });
    },

设置到北京坐标的位置

  getSpiritAndGltf() {
      // let spriteMaterial;
      // let bingmayong = new THREE.TextureLoader().load("/data/bingmayong.png");
     special.forEach((item, index) => {
        switch (item.name) {
          case "北京市":
            this.GetGLTFLoader(item.arr[0][0], item.arr[0][1], 8);
            break;
         
        }
      });
    },
设置光源,如果没有光源的照射 ,模型将漆黑一片
setLight() {
  ambientLight = new THREE.AmbientLight(0xffffff); // 环境光
  //平行光 用来照亮地图
  const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
  directionalLight.position.set(20, 20, 20);
  scene.add(directionalLight);
  //平行光灯光辅助器,可以看见灯光的位置
  const lightHelper = new THREE.DirectionalLightHelper(directionalLight);
  scene.add(lightHelper);
  // scene.add(ambientLight)
},

引入成功
在这里插入图片描述

二、添加sprite(精灵)

sprite的特点,他总会面对着摄像机,你往哪里移动,它朝向哪里,跟向阳花一样

 getSpiritAndGltf() {
      let spriteMaterial;
      //使用纹理加载器加载图片作为纹理使用
      let bingmayong = new THREE.TextureLoader().load("/data/bingmayong.png");
     special.forEach((item, index) => {
        switch (item.name) {
          case "北京市":
            this.GetGLTFLoader(item.arr[0][0], item.arr[0][1], 8);
            break;
            //在前面获取坐标的时候顺带获取别的坐标
          case "陕西省":
           //创建精灵贴图
            spriteMaterial = new THREE.SpriteMaterial({
              map: bingmayong,
              transparent: true,
            });
            //创建精灵,调整位置
            let sprite = new THREE.Sprite(spriteMaterial);
            sprite.position.set(item.arr[0][0], item.arr[0][1], 8);
            sprite.scale.set(8, 8, 8);
            sprite.name="bingmayong"
            map.add(sprite);
            break;
        }
      });
    },

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

总结

当前我们已经引入了模型和sprite,下期我们将使用射线,去做一些交互。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
/* *author:XudongChen *Date:2010-03-09 *QQ:233828249 81023617(不才) *Email:xznd@163.com */ 2009-8-13 1.加载分块地图 2.添加全景标记窗体 2009-8-14 1.增加控制条 2.增加全景标记、公交车标记显示层 3.解决地图定位问题 4.增加经纬度层功能 5.未修正图标层的定位 2009-8-15 1.已修正8.14地图定位错误,还存在放大缩小时定位不准 2.存在ie内存泄漏问题 2009-8-16 1.已修正8.15 ie内存泄漏问题,chrome下可能还存在内存泄漏 2.增加图标定位功能 3.增加鼠标滚轮事件(http://yongzhi.blog.hexun.com/5057947_d.html) 4.通过jquery加载json数据文件(图标显示层数据) 2009-8-17 1.增加建筑物高亮显示(还需完成鼠标mouseover和mouseout事件) 2009-8-18 1.完成建筑物高亮显示,有点小bug 2009-8-19 1.增加记录原始缩放比例的全局变量 2.解决建筑物高亮显示bug 2009-8-20 1.增加三维全景展示功能 2.浏览建筑详细功能 2009-8-21 1.引入jqueryAlert插件,美化弹出窗体 2009-8-23 1.增加搜索功能 2.清理建筑信息显示页和公交信息页多余数据 2009-10-22 1.增加小沙盘拖动类(鹰眼视图) BirdEye.js 完成小沙盘到地图的同步,同步方法:检测mouseup事件触发->修改url->request->计算坐标->同步行为 2.增加小沙盘样式表BirdEye.css 地图图片路径birdeyemap 3.完成window.parent地图->小沙盘的同步 问题:小沙盘->window.parent地图存在bug,可以尝试开启 2009-10-23 1.在小沙盘中增加浮动绿色框 2009-11-6 1.实现“鹰眼地图”不需移动,一幅可以看到见全景, 当主场景移动时,“鹰眼地图”只有小框在移动。 同时“小框” 主场景也在移动。 2009-12-17 1.测距功能事件配置 2009-12-21 1.完成测距功能 2009-12-22 1.配置搜索功能,后台改用s2sh框架 2.完成hessian+spring+hibernate整合,提供建筑信息和公司信息hessian查找服务 2009-12-23 1.配置hessian服务端缓存 2.配置hessian日志记录,输出到文件/log/wzucxd/html 3.完成建筑信息显示页,配置2级缓存 4.配置oscache 5.配置新闻信息模块 2010-1-13 1.完成chrome和ff下的搜索功能 2.搜索功能支持ie6.0+ //设置Theodolite$setPoint var cpointtmp = new CPoint(this.holder.offsetLeft + evt.clientX - this.mvl.offsetLeft, this.mvl.offsetTop + evt.clientY - this.mvl.offsetTop); Theodolite$setPoint(cpointtmp);
### 回答1: 在Vue中加载3D模型需要使用Three.js库。首先,需要在Vue项目中安装Three.js库。然后,可以使用Three.js提供的Loader加载3D模型文件,例如OBJ、FBX、GLTF等格式。加载完成后,可以将模型添加到场景中进行渲染。具体的实现可以参考Three.js的官方文档和示例代码。 ### 回答2: 使用vue实现three.js3D模型加载需要以下步骤: 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> ``` 这就是vuethree.js加载3D模型的完整教程,希望对你有所帮助。 ### 回答3: Vue是一种流行的JavaScript框架,而three.js一个强大的WebGL库,用于创建和呈现3D图形。将Vuethree.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场景需要一些基本的知识,但很容易上手。可以使用Vuethree.js创建漂亮的3D场景和模型,从而增强Vue应用程序的用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值