VUE实现photo-sphere-viewer 全景图

前言

PhotoSphereViewer框架是基于Three.js二次封装的一个显示Photo Sphere全景照片的JavaScript库。可以制作全景图,如VR看房那种。
官方文档: photo-sphere-viewer.js.org/

1、插件依赖下载

npm install photo-sphere-viewer

2、引用

import { Viewer } from 'photo-sphere-viewer'
import 'photo-sphere-viewer/dist/photo-sphere-viewer.css'

3.简单的全景图vue代码

<template>
  <div id="viewer"></div>
</template>
<script>
    import {Viewer} from 'photo-sphere-viewer'
    import 'photo-sphere-viewer/dist/photo-sphere-viewer.css'
    export default {
        data(){
            return{
                viewer:'',
                imgurl1:'https://photo-sphere-viewer-data.netlify.app/assets/sphere-cropped.jpg',
            }
        },
        mounted(){
            this.viewer = new Viewer({
                container:document.querySelector('#viewer'),
                panorama:this.imgurl1,
                size:{
                    width: '100vw',
                    height: '50vh',
                },
            });
        }
    }
</script>

全景图添加标记Markers插件

Markers插件
官方插件(在左侧菜单中列出)可在目录photo-sphere-viewer内的主软件包中找到dist/plugins。一些插件还具有其他CSS文件。

import { MarkersPlugin } from 'photo-sphere-viewer/dist/plugins/markers'
import 'photo-sphere-viewer/dist/plugins/markers.css'

完整代码

<template>
  <div class="demo-container">
    测试
    <div id="viewer"></div>
    <ul class="item-container">
      <li
        v-for="(item, index) in itemArr"
        :key="index"
        @click="setViewer(item.img)"
      >
        {{`全景图${index+1}`}}
      </li>
    </ul>
  </div>
</template>

<script>
import { Viewer } from 'photo-sphere-viewer'
import 'photo-sphere-viewer/dist/photo-sphere-viewer.css'

import { MarkersPlugin } from 'photo-sphere-viewer/dist/plugins/markers'
import 'photo-sphere-viewer/dist/plugins/markers.css'
import img1 from '@assets/photo/全景图1.jpg'
import img2 from '@assets/photo/全景图2.jpg'
import img3 from '@assets/photo/全景图3.jpg'
import img4 from '@assets/photo/全景图4.jpg'
import img5 from '@assets/photo/平面图1.png'
import img6 from '@assets/photo/cdn.btime.gif'
import img7 from '@assets/photo/jdoaj.png'

export default {
  name: 'demo',
  data() {
    return {
      viewer: '',
      markersPlugin: '',
      itemArr: [
        {
          // img: require('@/assets/imgs/demo/demo1.jpeg'),
          img: img1
        },
        {
          img: img2
        },
        {
          img: img3
        },
        {
          img: img4
        },
        {
          //用一张平面图来看看区别
          img: img5
        }
      ]
    }
  },
  methods: {

    //创建viewer
    setViewer(panorama) {
      // 切换场景的话 先销毁原来的场景,从页面中删除Viewer并释放three.js 使用的内存。
      // Vue项目中,切换全景图时,需要先卸载当前的全景图
      // 有时候this.viewer.destroy()执行会报错 如果报错 这里手动remove掉对应的元素
      if (this.viewer) 
      try {
        this.viewer.destroy()
      } catch (e) {
        console.log(e)
        const viewer = document.querySelector('#viewer')
        viewer.removeChild(viewer.childNodes[0])
      }
      //初始化全景图
      this.viewer = new Viewer({
        //全景图的容器,可以是DOM元素或者DOM的ID
        // container: document.querySelector('#viewer'),
        container:'viewer',
        navbar: [ // 底部导航栏,依次是自动播放、缩放、图库(gallery)、文字、全屏
                    'autorotate',
                    'zoom', 
                    'caption',
                    'fullscreen',
                ],  
                lang: { // 鼠标移到导航栏显示的文字说明
                    autorotate: '自动旋转',
                    zoom      : '缩放',
                    zoomOut   : '缩小',
                    zoomIn    : '放大',
                    fullscreen: '全屏'
                },
        //全景图适配器
        // adapter: 'equirectangular',
        //全景图地址,如果用默认的适配器,只支持传单个
        panorama: panorama,
        //全景图宽高
        size: {
          width: '1586px',
          height: '800px'
        },
        // 最小视野(对应于最大缩放),介于 1 和 179 之间。默认30,
        minFov:30,
        //最大视野(对应于最小缩放),介于 1 和 179 之间。默认90。初始越大相当于图放的越大
        maxFov:90,
        // 初始缩放级别,介于 0(对于 maxFov)和 100(对于 minfov)之间。
        defaultZoomLvl:60,
        //使用 true 启用鱼眼效果或指定效果强度 (true = 1.0)。(此模式可能会对标记渲染产生副作用)
        fisheye:false,
        //初始精度 初始经度,介于 0 和 2π 之间。
        defaultLong:0,
        //初始纬度,介于 -π/2 和 π/2 之间。
        defaultLat:0,
        //自动旋转开始后的延迟,以毫秒为单位(没试验成功)
        // autorotateDelay:10,
        //自动旋转速度 default: 2rpm
        // autorotateSpeed:0.3,
        //执行自动旋转的纬度  default: defaultLat
        // autorotateLat:0,

        //插件
        plugins: [
          [
            MarkersPlugin,
            {
              markers: [
                
              ]
            }
          ]
        ],
        //导航栏中显示的文本。如果导航栏被禁用,它无论如何都会显示,但没有按钮。允许使用 HTML
        caption:'标题2',
        //新增“i”按钮,当用户单击“i”按钮时,在侧面板中显示的文本
        description:'description'
      })

      // 等待Viewer就绪(不懂)
      this.viewer.once('ready', () => {
        console.log('ready')
           // 自动旋转
        // this.viewer.startAutorotate()
      })

      this.markersPlugin = this.viewer.getPlugin(MarkersPlugin)

      this.markersPlugin.on('select-marker', (e, marker) => {
        // 点击选中标注
        console.log('select-marker e:', e)
        console.log('marker:', marker)
        if (e.args[0].config.note) this.setViewer(this.itemArr[e.args[0].config.note].img)
      })

      //点击触发事件
      this.viewer.on('click', (e, data) => {
        console.log("data",data);
        //随机整数
        const num = 1 + Math.round(Math.random() * 3  )
        console.log('num:', num)
        // 添加标注
        this.markersPlugin.addMarker({
          id: `mark${Math.random() * 10}`,
          tooltip: `213123
              <p>点击标注跳去${num + 1}全景图</p></p>
              <img style="width:100px;height:100px;" src= ${img6} />
          `,
          html: `
            <p class="remark">点击标注跳去${num + 1}全景图</p>
            <p class="remark">这里是标记${Math.floor(data.longitude * 200) / 100} - ${Math.floor(data.latitude * 200) / 100}
            </p>
            <img  src=${img7} />
            `,
          longitude: data.longitude,
          latitude: data.latitude,
          anchor: 'center center',
          note: num
        })
        let configArr = Object.keys(this.markersPlugin.markers).map(
          (item) => this.markersPlugin.markers[item].config
        )
        localStorage.setItem('configArr', JSON.stringify(configArr))
      })
    }
  },
  mounted() {
    debugger
    this.setViewer(this.itemArr[0].img)
    debugger
    const configArr = JSON.parse(localStorage.getItem('configArr'))
    this.viewer.once('ready', () => {
      //标注的对象
      configArr.forEach((item) => {
        this.markersPlugin.addMarker(item)
      })
    })
  }
}
</script>

<style lang="scss" scoped>
.demo-container {
  position: relative;
  min-width: 1439px;
  margin: 0 auto;

  #viewer {
    margin: 0 auto;

    ::v-deep .psv-container {

      .psv-marker {
        border: 1px solid  white;
        padding: 10px;

        .remark {
          padding: 10px 15px;
          color: white;
        }
        //标注弹框的小图片大小
        img {
          width: 50px;
          height: 40px;
          margin: 0 auto;
          display: block;
        }
      }

      .psv-tooltip {
        .psv-tooltip-content {
          img {
            width: 100px;
            height: 100px;
            margin: 0 auto;
            display: block;
          }
        }
      }
    }
  }

  .item-container {
    text-align: center;
    margin-top: 20px;
    li {
      cursor: pointer;
      display: inline-block;
      padding: 10px 20px;
      &:hover {
        background-color: blue;
        color: white;
      }
    }
  }
}
</style>


注释代码里面也有可以复制过去更换参数自己试一试

panorama:必填参数,全景图的路径。
container:必填参数,放置全景图的div元素。
autoload:可选,默认值为truetrue为自动调用全景图,false为在后面加载全景图(通过.load()方法)。
us empdata:可选,默认值为true,如果Photo Sphere Viewer必须读入XMP数据则为true。
default_position:可选,默认值为{},定义默认的位置,及用户看见的第一个点,例如:{long: Math.PI, lat: Math.PI/2}。
min_fov:可选,默认值为30,观察的最小区域,单位degrees,在1-179之间。
max_fov:可选,默认值为90,观察的最大区域,单位degrees,在1-179之间。
allow_user_interactions:可选,默认值为true,设置为false则禁止用户和全景图交互(导航条不可用)。
tilt_up_max:可选,默认值为Math.PI/2,向上倾斜的最大角度,单位radians。
tilt_down_max:可选,默认值为Math.PI/2,向下倾斜的最大角度,单位radians。
zoom_level:可选,默认值为0,默认的缩放级别,值在0-100之间。
long_offset:可选,默认值为 Math.PI/360,mouse/touch移动时每像素经过的经度值。
lat_offset:可选,默认值为 Math.PI/180,mouse/touch移动时每像素经过的纬度值。
time_anim:可选,默认值为2000,全景图在time_anim毫秒后会自动进行动画。(设置为false禁用它)
theta_offset:过时的选项,可选,默认值为1440,自动动画时水平方向的速度。
anim_speed:可选,默认值为2rpm,动画的速度,每秒/分钟多少radians/degrees/revolutions。
navbar:可选值,默认为false。显示导航条。
navbar_style:可选值,默认为{}。导航条的自定义样式。下面是可用的样式列表:
backgroundColor:导航条的背景颜色,默认值为rgba(61, 61, 61, 0.5)。
buttonsColor:按钮的前景颜色,默认值为transparent。
activeButtonsBackgroundColor:按钮激活状态的背景颜色,默认值为rgba(255, 255, 255, 0.1)。
buttonsHeight:按钮的高度,单位像素,默认值为20。
autorotateThickness:autorotate图标的厚度,单位像素,默认值为1。
zoomRangeWidth:缩放的范围,单位显示,默认值50。
zoomRangeThickness:缩放的范围的厚度,单位像素,默认值1。
zoomRangeDisk:缩放范围的圆盘直径,单位像素,默认值为7。
fullscreenRatio:全屏图标的比例,默认值为3/4。
fullscreenThickness:全屏图标的厚度,单位像素,默认值为2。
loading_msg:可选,默认值为Loading…,图片加载时的提示文字。
loading_img:可选,默认值为null,在加载时显示的图片的路径。
size:可选,默认值null,全景图容器的最终尺寸。例如:{width: 500, height: 300}。
onready:可选值,默认值为null。当全景图准备就绪并且第一张图片显示时的回调函数。

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值