vue中利用three.js实现全景图的完整示例


Posted in Vue.js onDecember 07, 2020

粗暴一点,直接上代码:

第一步:

通过指令下载three.js

npm install three -S

第二步:

在组件中引用

import * as THREE from 'three'

第三步:

html部分

<div id="container"></div>

js部分

<script>
  import * as THREE from 'three';
  var camera;
  var renderer;
  var scene;
  export default {
    name: 'panorama',
    data() {
      return {
        bigImg: require("../../../../../images/项目案例/001.jpg"),//全景图图片路径
      }
    },
    mounted() {
      // 调用全景图函数
      this.$nextTick(() => {
        this.init();
        this.animate();
      })
    },
    methods: {
      // 全景图配置函数---------------
      init() {
        var container = document.getElementById('container');
        // 创建渲染器
        renderer = new THREE.WebGLRenderer();
        renderer.setPixelRatio(window.devicePixelRatio);
        // 设置画布的宽高
        renderer.setSize(window.innerWidth, window.innerHeight);
        // 判断容器中子元素的长度
        let childs = container.childNodes;
        if (container.childNodes.length > 0) {
          container.removeChild(childs[0]);
          container.appendChild(renderer.domElement);
        } else {
          container.appendChild(renderer.domElement);
        }
        //   container.appendChild(renderer.domElement);
        // 创建场景
        scene = new THREE.Scene();
        // 创建相机
        camera = new THREE.PerspectiveCamera(90, window.innerWidth / window.innerHeight, 0.1, 100);
        camera.position.set(0, 0, 0);
        var material = new THREE.MeshBasicMaterial();//材质
        var texture = new THREE.TextureLoader().load(this.bigImg);
        material.map = texture;
        var skyBox = new THREE.Mesh(
          new THREE.SphereBufferGeometry(100, 100, 100),
          material
        );
        skyBox.geometry.scale(1, 1, -1);
        scene.add(skyBox);
        window.addEventListener('resize', this.onWindowResize, false);
        var bMouseDown = false;
        var x = -1;
        var y = -1;
        // 添加鼠标事件
        container.onmousedown = function (event) {
          event.preventDefault();//取消默认事件
          x = event.clientX;
          y = event.clientY;
          bMouseDown = true;
        }
        container.onmouseup = function (event) {
          event.preventDefault();
          bMouseDown = false;
        }
        container.onmousemove = function (event) {
          event.preventDefault();
          if (bMouseDown) {
            skyBox.rotation.y += -0.005 * (event.clientX - x);
            skyBox.rotation.x += -0.005 * (event.clientY - y);
            if (skyBox.rotation.x > Math.PI / 2) {
              skyBox.rotation.x = Math.PI / 2
            }
            if (skyBox.rotation.x < -Math.PI / 2) {
              skyBox.rotation.x = -Math.PI / 2
            }
            x = event.clientX;
            y = event.clientY;
          }
        }
        container.onmousewheel = function (event) {
          event.preventDefault();
          if (event.wheelDelta != 0) {
            camera.fov += event.wheelDelta > 0 ? 1 : -1;
            if (camera.fov > 150) {
              camera.fov = 150;
            }
            else if (camera.fov < 30) {
              camera.fov = 30;
            }
            camera.updateProjectionMatrix();
          }
        }
      },
      onWindowResize() {
        // 窗口缩放的时候,保证场景也跟着一起缩放
        camera.aspect = window.innerWidth / window.innerHeight;
        camera.updateProjectionMatrix();
        renderer.setSize(window.innerWidth, window.innerHeight);
      },
      animate() {
        requestAnimationFrame(this.animate);
        renderer.render(scene, camera);
      }
    },
  }
</script>

到此这篇关于vue中利用three.js实现全景图的文章就介绍到这了,更多相关vue用three.js实现全景图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
用vue设计一个日历表
Dec 03 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
Vue实现简单计算器
Jan 20 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
Feb 28 Vue.js
vue实现拖拽进度条
Mar 01 Vue.js
vue引入Excel表格插件的方法
Apr 28 Vue.js
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
vue elementUI批量上传文件
Apr 26 Vue.js
Vue Element plus使用方法梳理
Dec 24 Vue.js
详解Vue中的自定义指令
Dec 07 #Vue.js
vue-router定义元信息meta操作
Dec 07 #Vue.js
Vue如何实现验证码输入交互
Dec 07 #Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
Dec 07 #Vue.js
vuex Module将 store 分割成模块的操作
Dec 07 #Vue.js
浅谈Vue使用Elementui修改默认的最快方法
Dec 05 #Vue.js
vue+element_ui上传文件,并传递额外参数操作
Dec 05 #Vue.js
You might like
一个显示天气预报的程序
2006/10/09 PHP
php绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
使用Sphinx对索引进行搜索
2013/06/25 PHP
配置php网页显示各种语法错误
2013/09/23 PHP
php while循环得到循环次数
2013/10/26 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
AngularJS中的Directive自定义一个表格
2016/01/25 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
细说Vue组件的服务器端渲染的过程
2019/05/30 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
python计算最小优先级队列代码分享
2013/12/18 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Python实现简单字典树的方法
2016/04/29 Python
python 删除非空文件夹的实例
2018/04/26 Python
python三方库之requests的快速上手
2019/03/04 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
Python各种扩展名区别点整理
2020/02/27 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
HTML5中5个简单实用的API(第二篇,含全屏、可见性、拍照、预加载、电池状态)
2014/05/07 HTML / CSS
巴西在线鞋店:Shoestock
2017/10/28 全球购物
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
操行评语大全
2014/04/30 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
先进典型发言材料
2014/12/30 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书