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 相关文章推荐
如何正确解决VuePress本地访问出现资源报错404的问题
Dec 03 Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
vue+vant 上传图片需要注意的地方
Jan 03 Vue.js
vscode自定义vue模板的实现
Jan 27 Vue.js
vue 动态添加的路由页面刷新时失效的原因及解决方案
Feb 26 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
vue项目两种方式实现竖向表格的思路分析
Apr 28 Vue.js
vue完美实现el-table列宽自适应
May 08 Vue.js
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
vue实现滑动解锁功能
Mar 03 Vue.js
vue特效之翻牌动画
Apr 20 Vue.js
vue动态绑定style样式
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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
javascript Demo模态窗口
2009/12/06 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
基于jQuery的图片左右无缝滚动插件
2012/05/23 Javascript
jQuery检测滚动条是否到达底部
2015/12/15 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
Bootstrap下拉菜单效果实例代码分享
2016/06/30 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
ES6中的Javascript解构的实现
2020/10/30 Javascript
利用Python如何生成便签图片详解
2018/07/09 Python
在python中安装basemap的教程
2018/09/20 Python
Python二维码生成识别实例详解
2019/07/16 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
Booking.com美国:全球酒店预订网站
2017/04/18 全球购物
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
信息部岗位职责
2013/11/12 职场文书
城市创卫标语
2014/06/17 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
2016计划生育先进个人事迹材料
2016/02/29 职场文书
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫