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 Elenent实现表格相同数据列合并
Nov 30 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
vue实现图书管理系统
Dec 29 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
Vue Element UI自定义描述列表组件
May 18 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
vue项目配置sass及引入外部scss文件
Apr 14 Vue.js
vue elementUI批量上传文件
Apr 26 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
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
js文件中调用js的实现方法小结
2009/10/23 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
js分页工具实例
2015/01/28 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
bootstrap modal+gridview实现弹出框效果
2017/08/15 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
Python 的内置字符串方法小结
2016/03/15 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
python正则-re的用法详解
2019/07/28 Python
python关于变量名的基础知识点
2020/03/03 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
诚信考试倡议书
2014/04/15 职场文书
松材线虫病防治方案
2014/06/15 职场文书
旷课检讨书
2015/01/26 职场文书
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js