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 相关文章推荐
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
vue-drawer-layout实现手势滑出菜单栏
Nov 19 Vue.js
vue祖孙组件之间的数据传递案例
Dec 07 Vue.js
Vue使用Ref跨层级获取组件的步骤
Jan 25 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
vue-router路由懒加载及实现的3种方式
Feb 28 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
Vue和Flask通信的实现
May 19 Vue.js
idea编译器vue缩进报错问题场景分析
Jul 04 Vue.js
详解Vue项目的打包方式(生成dist文件)
Jan 18 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 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
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
php常用数组函数实例小结
2016/12/29 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
windows 2008r2+php5.6.28环境搭建详细过程
2019/06/18 PHP
IE8 原生JSON支持
2009/04/13 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
JavaScript实现的数字与字符串转换功能示例
2017/08/23 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
原生JS实现自定义下拉单选选择框功能
2018/10/12 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
在Python程序中操作MySQL的基本方法
2015/07/29 Python
python创建学生管理系统
2019/11/22 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
在tensorflow中设置使用某一块GPU、多GPU、CPU的操作
2020/02/07 Python
django中cookiecutter的使用教程
2020/12/03 Python
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
PHP面试题及答案一
2012/06/18 面试题
如何将字串String转换成整数int
2015/02/21 面试题
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
主题酒店策划书
2014/01/28 职场文书
动员大会主持词
2014/03/20 职场文书
单位在职证明书
2014/09/11 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
2014年共青团工作总结
2014/12/10 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
SQLServer中exists和except用法介绍
2021/12/04 SQL Server
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android