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如何循环提取对象数组中的值
Nov 18 Vue.js
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
vue使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
vue 实现图片懒加载功能
Dec 31 Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
Vue实现下拉加载更多
May 09 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
VUE递归树形实现多级列表
Jul 15 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 FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
PHP使用header()输出图片缓存实例
2014/12/09 PHP
php session 写入数据库
2016/02/13 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
Bootstrap基本模板的使用和理解1
2016/12/14 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
JavaScript requestAnimationFrame动画详解
2017/09/14 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
[04:39]显微镜下的DOTA2第十三期—Pis卡尔个人秀
2014/04/04 DOTA
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
python中zip和unzip数据的方法
2015/05/27 Python
深入讲解Python中的迭代器和生成器
2015/10/26 Python
python访问抓取网页常用命令总结
2017/04/11 Python
Python实现的快速排序算法详解
2017/08/01 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
django admin后台添加导出excel功能示例代码
2019/05/15 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
和平主题的演讲稿
2014/01/12 职场文书
2014全国两会大学生学习心得体会
2014/03/10 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
甜品店创业计划书
2014/08/14 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书
实现GO语言对数组切片去重
2022/04/20 Golang