vue实现vr看360°全景效果
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°全景效果相关推荐
- Vue实现vr看房效果
1.下载依赖: VS code终端执行两个命令 npm install three --save-devnpm install photo-sphere-viewer 2.<template&g ...
- android显示全景图片素材,【行业应用】360°全景-如何制作一个360度全景图
第一步:拍摄全景图原始素材 由专业的摄影师使用专业相机.鱼眼镜头以及三脚架拍摄汽车.房间或者其他需要360全景展示的对象照片 我们来看下备用的三张原始素材 第二步:使用"PTGui Pro& ...
- 微信公众平台开发之360全景
微信公众平台开发之360全景功能是商家推广自己的产品的非常有效的方法之一.现在大多数的人买东西都不喜欢去看繁杂的文字描述,而更喜欢看实物图.所有之前我们做过微信相册用于展示我们的产品,但是光靠相册的 ...
- 原生JS实现VR看图特效
现在很多看车或是看房的网站都有VR看图的效果,看起来比较高端,类似于下面这样的效果: 那么这种效果是如何实现的呢?其实原理很简单,就是连续拍摄了多个角度的图片, 然后根据用户的操作加载不同角度的图片. ...
- Vue使用photo-sphere-viewer360°×180°全景插件模拟VR看房、房间切换和自定义标注
Vue使用photo-sphere-viewer360°×180°全景插件模拟VR看房.房间切换和自定义标注 photo-sphere-viewer 下载插件 使用 常用参数 Markers插件 使用 ...
- Three.js杂记(十二)—— VR全景效果制作·中
文章目录 序 正文开始 引入threeJs 材料收集 实现原理 实现步骤 基础的全景完成 完整Vue代码 总结 序 在web的前端发展过程中,对于视觉化的要求已经越来越高 有关于VR全景的效果也同样可 ...
- 微信小程序---实现VR看房效果
1.前言 客户需求需要实现VR看房功能.使用技术为微信小程序+spring boot. 2.工具 ① 下载PtGui绘制全景图工具:https://www.jb51.net/softs/743790. ...
- 接触webGl(three.js)之全景(VR)看房的实现旅程总结
文章目录 前言 实现全景(VR)看房的方式 一.纯Three.js方式 1.安装包 2.实现的业务代码 3.实现演示 二. 使用photo-sphere-viewer 1.安装包 2.实现的业务代码 ...
- html蒙尘效果,vr看车.html
VR看车 $axure.utils.getTransparentGifPath = function() { return 'resources/images/transparent.gif'; ...
最新文章
- 基于Zabbix IPMI监控服务器硬件状况
- 老男孩linux运维50期
- python requests cookiejar,Python requests模块cookie实例解析
- 【Flink】Flink 控制台能消费 但是 Flink 任务不能消费 内置topic 导致问题
- mybatisplus代码生成连接池_SpringBoot2 高级案例(15): 配置多数据源,整合MybatisPlus增强插件...
- 测试工程师面试必问的十道题目!全答上来的直接免试
- SQL文件导入数据库【保姆级教程】
- VS2013 Qt Unable to find a Qt Build 及 LINK1112错误
- 一文看懂STM32单片机和51单片机区别
- java x86 x64_x86 版和x64版有什么区别?
- 蓝牙耳机排名前十:618性价比超高的真无线蓝牙耳机推荐!
- kaptcha生成自定义图片验证码
- MySQL基础 创建学生表实现查询基础功能
- 油菜出现花而不实现象,这是什么原因,该怎样防治?
- Office365离线安装包
- PHP header网页安全认证
- 为什么需要稀疏编码及解释
- 大厂面试真题解读:Tomcat的连接器是如何设计的?
- 掌控板+Mixly+MixIO 初试物联网-摇杆篇
- python读写csv文件方法总结_使用python读写CSV文件的三种方法
热门文章
- 网页背景设置的方法总结
- 使用Tensorflow搭建并训练TextCNN模型,对文本进行分类
- CF1630D Flipping Range
- 注册商标注册几个类别为好?
- 按照年龄划分,60及以上是老年人,40-60是中年人,20-40青年人,10-20青少年,10岁以下儿童
- 为什么用void*做参数
- PHP爬虫爬取网易云音乐热门评论
- spss可以关键词词频分析吗_综合词位置因素和词频因素的文本关键词权重计算方法与流程...
- U盘引导安装Solaris11_x86_64
- LAMMPS回到未来计划