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-cli 创建模板项目
Nov 19 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
Vue实现小购物车功能
Dec 21 Vue.js
vue 动态添加的路由页面刷新时失效的原因及解决方案
Feb 26 Vue.js
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
Mar 01 Vue.js
使用vue-element-admin框架从后端动态获取菜单功能的实现
Apr 29 Vue.js
Vue通过懒加载提升页面响应速度
May 10 Vue.js
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 Vue.js
vue 给数组添加新对象并赋值
Apr 20 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
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
php下实现农历日历的代码
2007/03/07 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
学习js在线html(富文本,所见即所得)编辑器
2012/12/18 Javascript
JavaScript 在网页上单击鼠标的地方显示层及关闭层
2012/12/30 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
使用JavaScript实现一个小程序之99乘法表
2017/09/21 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
2018/07/26 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
python机器人行走步数问题的解决
2018/01/29 Python
python实现聚类算法原理
2018/02/12 Python
使用python生成目录树
2018/03/29 Python
基于python的图片修复程序(实现水印去除)
2018/06/04 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python全栈之列表数据类型详解
2019/10/01 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Python自动创建Excel并获取内容
2020/09/16 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
CSS3实现歌词进度文字颜色填充变化动态效果的思路详解
2020/06/02 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
个人自我剖析材料
2014/02/07 职场文书
如何写一封打动人心的求职信
2014/02/17 职场文书
求职信模板
2014/05/23 职场文书
房屋产权证明书
2015/06/19 职场文书
教师师德工作总结2015
2015/07/22 职场文书