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 19 Vue.js
vue 通过base64实现图片下载功能
Dec 19 Vue.js
Vue实现小购物车功能
Dec 21 Vue.js
Vue+penlayers实现多边形绘制及展示
Dec 24 Vue.js
vue中实现点击空白区域关闭弹窗的两种方法
Dec 30 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
HTML+VUE分页实现炫酷物联网大屏功能
May 27 Vue.js
vue自定义右键菜单之全局实现
Apr 09 Vue.js
vue选项卡切换的实现案例
Apr 11 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
dvwa+xampp搭建显示乱码的问题及解决方案
2015/08/23 PHP
thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)
2016/05/20 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
浅谈js中的闭包
2015/03/16 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
基于jquery实现百度新闻导航菜单滑动动画
2016/03/15 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
2016/05/28 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
javascript中的replace函数(带注释demo)
2018/01/07 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
2018/02/13 jQuery
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
JS+HTML实现自定义上传图片按钮并显示图片功能的方法分析
2020/02/12 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
Python程序运行原理图文解析
2018/02/10 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
python异步Web框架sanic的实现
2020/04/27 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
2020/05/03 Python
运行Python编写的程序方法实例
2020/10/21 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
表彰先进的通报
2014/01/31 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
高中军训的心得体会
2014/09/01 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
2015年行政管理人员工作总结
2015/10/15 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书