1:首先创建一个vue的基础项目
vue create demo
2:启动并打开项目
3:在生成的public文件夹下找到Index.html,然后在script标签中引入three.js

<script src="https://cdn.jsdelivr.net/npm/three@0.93.0/build/three.min.js"></script>

4:在template模块中创建一个div,并绑定一个id

<div ref="container" id="container" style="width: 100%; height: 100%"></div>

其次,需要给html,body,默认的容器#app这三类元素设定宽高(必须)
5:在data中定义全局变量

data() {return {sceneUrl: '', // 需要预览的图片绝对路径camera: null,scene: null,renderer: null,isUserInteracting: false,onPointerDownPointerX: 0,onPointerDownPointerY: 0,lon: 0,onPointerDownLon: 0,lat: 0,onPointerDownLat: 0,phi: 0,theta: 0,target: new THREE.Vector3()}}

6:在methods中写入方法

 methods: {init() {let textureLoader = new THREE.TextureLoader();textureLoader.load(this.sceneUrl, (texture) => {texture.mapping = THREE.UVMapping;this.initImg(texture);this.render();});},initImg(texture) {let container, mesh;// 容器宽度、高度let containerWidth = this.$refs.container.offsetWidth;let containerHeight = this.$refs.container.offsetHeight;container = document.getElementById('container');this.renderer = new THREE.WebGLRenderer({ antialias: true });this.renderer.setPixelRatio(window.devicePixelRatio);// this.renderer.setSize(window.innerWidth, window.innerHeight);this.renderer.setSize(containerWidth, containerHeight);let childs = container.childNodes;if (container.childNodes.length > 0) {container.removeChild(childs[0]);container.appendChild(this.renderer.domElement);} else {container.appendChild(this.renderer.domElement);}this.scene = new THREE.Scene();this.camera = new THREE.PerspectiveCamera(60, containerWidth  / containerHeight , 1, 1000);mesh = new THREE.Mesh(new THREE.SphereBufferGeometry(500, 32, 16), new THREE.MeshBasicMaterial({ map: texture }));mesh.geometry.scale(-1, 1, 1);this.scene.add(mesh);container.addEventListener('mousedown', this.onDocumentMouseDown, false);container.addEventListener('mousemove', this.onDocumentMouseMove, false);container.addEventListener('mouseup', this.onDocumentMouseUp, false);container.addEventListener('mousewheel', this.onDocumentMouseWheel, false);container.addEventListener('touchstart', this.onDocumentTouchStart, false);container.addEventListener('touchmove', this.onDocumentTouchMove, false);},onDocumentMouseDown(event) {event.preventDefault();this.isUserInteracting = true;this.onPointerDownPointerX = event.clientX;this.onPointerDownPointerY = event.clientY;this.onPointerDownLon = this.lon;this.onPointerDownLat = this.lat;},onDocumentMouseMove(event) {if (this.isUserInteracting) {this.lon = (this.onPointerDownPointerX - event.clientX) * 0.1 + this.onPointerDownLon;this.lat = (event.clientY - this.onPointerDownPointerY) * 0.1 + this.onPointerDownLat;this.render();}},onDocumentMouseUp(event) {this.isUserInteracting = false;this.render();},onDocumentMouseWheel(event) {this.camera.fov -= event.wheelDeltaY * 0.05;this.camera.updateProjectionMatrix();event = event || window.event;if (event.stopPropagation) { // 这是取消冒泡event.stopPropagation();} else {event.cancelBubble = true;};if (event.preventDefault) { // 这是取消默认行为event.preventDefault();} else {event.returnValue = false;};this.render();},onDocumentTouchStart(event) {if (event.touches.length == 1) {event.preventDefault();this.onPointerDownPointerX = event.touches[0].pageX;this.onPointerDownPointerY = event.touches[0].pageY;this.onPointerDownLon = this.lon;this.onPointerDownLat = this.lat;}},onDocumentTouchMove(event) {if (event.touches.length == 1) {event.preventDefault();this.lon = (this.onPointerDownPointerX - event.touches[0].pageX) * 0.1 + this.onPointerDownLon;this.lat = (event.touches[0].pageY - this.onPointerDownPointerY) * 0.1 + this.onPointerDownLat;this.render();}},render() {this.lon += 0.15;this.lat = Math.max(-85, Math.min(85, this.lat));this.phi = THREE.Math.degToRad(90 - this.lat);this.theta = THREE.Math.degToRad(this.lon);this.camera.position.x = 100 * Math.sin(this.phi) * Math.cos(this.theta);this.camera.position.y = 100 * Math.cos(this.phi);this.camera.position.z = 100 * Math.sin(this.phi) * Math.sin(this.theta);this.camera.lookAt(this.scene.position);this.renderer.render(this.scene, this.camera);}}

7:在mounted初始化中调用init方法

mounted() {this.init()
}

8:最重要的一点,不要忘记在data中找到sceneUrl这个全局变量,它的值就是需要展示的图片路径。如果不引入就没有图片哦。

PS:当时做这个项目的时候也是第一次,借鉴了这位大佬的文章
https://blog.csdn.net/Thurmanwang/article/details/105495000

大家写完的时候可以多看看three.js和这个思路,挺不错的~

vue实现vr看360°全景效果相关推荐

  1. Vue实现vr看房效果

    1.下载依赖: VS code终端执行两个命令 npm install three --save-devnpm install photo-sphere-viewer 2.<template&g ...

  2. android显示全景图片素材,【行业应用】360°全景-如何制作一个360度全景图

    第一步:拍摄全景图原始素材 由专业的摄影师使用专业相机.鱼眼镜头以及三脚架拍摄汽车.房间或者其他需要360全景展示的对象照片 我们来看下备用的三张原始素材 第二步:使用"PTGui Pro& ...

  3. 微信公众平台开发之360全景

     微信公众平台开发之360全景功能是商家推广自己的产品的非常有效的方法之一.现在大多数的人买东西都不喜欢去看繁杂的文字描述,而更喜欢看实物图.所有之前我们做过微信相册用于展示我们的产品,但是光靠相册的 ...

  4. 原生JS实现VR看图特效

    现在很多看车或是看房的网站都有VR看图的效果,看起来比较高端,类似于下面这样的效果: 那么这种效果是如何实现的呢?其实原理很简单,就是连续拍摄了多个角度的图片, 然后根据用户的操作加载不同角度的图片. ...

  5. Vue使用photo-sphere-viewer360°×180°全景插件模拟VR看房、房间切换和自定义标注

    Vue使用photo-sphere-viewer360°×180°全景插件模拟VR看房.房间切换和自定义标注 photo-sphere-viewer 下载插件 使用 常用参数 Markers插件 使用 ...

  6. Three.js杂记(十二)—— VR全景效果制作·中

    文章目录 序 正文开始 引入threeJs 材料收集 实现原理 实现步骤 基础的全景完成 完整Vue代码 总结 序 在web的前端发展过程中,对于视觉化的要求已经越来越高 有关于VR全景的效果也同样可 ...

  7. 微信小程序---实现VR看房效果

    1.前言 客户需求需要实现VR看房功能.使用技术为微信小程序+spring boot. 2.工具 ① 下载PtGui绘制全景图工具:https://www.jb51.net/softs/743790. ...

  8. 接触webGl(three.js)之全景(VR)看房的实现旅程总结

    文章目录 前言 实现全景(VR)看房的方式 一.纯Three.js方式 1.安装包 2.实现的业务代码 3.实现演示 二. 使用photo-sphere-viewer 1.安装包 2.实现的业务代码 ...

  9. html蒙尘效果,vr看车.html

     VR看车 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...

最新文章

  1. 基于Zabbix IPMI监控服务器硬件状况
  2. 老男孩linux运维50期
  3. python requests cookiejar,Python requests模块cookie实例解析
  4. 【Flink】Flink 控制台能消费 但是 Flink 任务不能消费 内置topic 导致问题
  5. mybatisplus代码生成连接池_SpringBoot2 高级案例(15): 配置多数据源,整合MybatisPlus增强插件...
  6. 测试工程师面试必问的十道题目!全答上来的直接免试
  7. SQL文件导入数据库【保姆级教程】
  8. VS2013 Qt Unable to find a Qt Build 及 LINK1112错误
  9. 一文看懂STM32单片机和51单片机区别
  10. java x86 x64_x86 版和x64版有什么区别?
  11. 蓝牙耳机排名前十:618性价比超高的真无线蓝牙耳机推荐!
  12. kaptcha生成自定义图片验证码
  13. MySQL基础 创建学生表实现查询基础功能
  14. 油菜出现花而不实现象,这是什么原因,该怎样防治?
  15. Office365离线安装包
  16. PHP header网页安全认证
  17. 为什么需要稀疏编码及解释
  18. 大厂面试真题解读:Tomcat的连接器是如何设计的?
  19. 掌控板+Mixly+MixIO 初试物联网-摇杆篇
  20. python读写csv文件方法总结_使用python读写CSV文件的三种方法

热门文章

  1. 网页背景设置的方法总结
  2. 使用Tensorflow搭建并训练TextCNN模型,对文本进行分类
  3. CF1630D Flipping Range
  4. 注册商标注册几个类别为好?
  5. 按照年龄划分,60及以上是老年人,40-60是中年人,20-40青年人,10-20青少年,10岁以下儿童
  6. 为什么用void*做参数
  7. PHP爬虫爬取网易云音乐热门评论
  8. spss可以关键词词频分析吗_综合词位置因素和词频因素的文本关键词权重计算方法与流程...
  9. U盘引导安装Solaris11_x86_64
  10. LAMMPS回到未来计划