当前位置:首页 > VUE

vue实现全景图

2026-02-23 17:33:38VUE

使用Three.js实现全景图

在Vue项目中集成Three.js可以高效实现全景图展示。需要安装Three.js依赖:

npm install three

创建全景图组件:

<template>
  <div ref="container" class="panorama-container"></div>
</template>

<script>
import * as THREE from 'three';

export default {
  mounted() {
    this.initScene();
    this.loadPanorama();
    window.addEventListener('resize', this.onWindowResize);
  },
  methods: {
    initScene() {
      this.scene = new THREE.Scene();
      this.camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
      this.renderer = new THREE.WebGLRenderer();
      this.renderer.setSize(window.innerWidth, window.innerHeight);
      this.$refs.container.appendChild(this.renderer.domElement);
    },
    loadPanorama() {
      const textureLoader = new THREE.TextureLoader();
      textureLoader.load('panorama.jpg', texture => {
        const geometry = new THREE.SphereGeometry(500, 60, 40);
        geometry.scale(-1, 1, 1);
        const material = new THREE.MeshBasicMaterial({ map: texture });
        const sphere = new THREE.Mesh(geometry, material);
        this.scene.add(sphere);
        this.animate();
      });
    },
    animate() {
      requestAnimationFrame(this.animate);
      this.renderer.render(this.scene, this.camera);
    },
    onWindowResize() {
      this.camera.aspect = window.innerWidth / window.innerHeight;
      this.camera.updateProjectionMatrix();
      this.renderer.setSize(window.innerWidth, window.innerHeight);
    }
  },
  beforeDestroy() {
    window.removeEventListener('resize', this.onWindowResize);
  }
}
</script>

<style>
.panorama-container {
  width: 100%;
  height: 100vh;
}
</style>

使用Photo Sphere Viewer库

Photo Sphere Viewer是专门用于全景图展示的库,使用更简单:

安装依赖:

npm install photo-sphere-viewer

组件实现:

<template>
  <div ref="viewer" class="panorama-viewer"></div>
</template>

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

export default {
  props: {
    src: {
      type: String,
      required: true
    }
  },
  mounted() {
    this.viewer = new Viewer({
      container: this.$refs.viewer,
      panorama: this.src,
      size: {
        width: '100%',
        height: '100vh'
      }
    });
  },
  beforeDestroy() {
    if (this.viewer) {
      this.viewer.destroy();
    }
  }
}
</script>

移动端适配方案

针对移动设备需要添加陀螺仪控制:

import DeviceOrientationControls from 'three-device-orientation';

// 在initScene方法中添加
this.controls = new DeviceOrientationControls(this.camera);
this.controls.connect();

// 在animate方法中更新
this.controls.update();

性能优化技巧

使用低分辨率预览图快速加载:

textureLoader.load('panorama-lowres.jpg', lowResTexture => {
  const material = new THREE.MeshBasicMaterial({ map: lowResTexture });

  // 加载高清图后替换
  textureLoader.load('panorama-hires.jpg', hiResTexture => {
    material.map = hiResTexture;
    material.needsUpdate = true;
  });
});

添加加载进度指示器:

const manager = new THREE.LoadingManager();
manager.onProgress = (url, loaded, total) => {
  console.log(`加载进度: ${loaded}/${total}`);
};

const textureLoader = new THREE.TextureLoader(manager);

热点标记实现

在全景图中添加交互热点:

const hotspotGeometry = new THREE.SphereGeometry(1, 16, 16);
const hotspotMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const hotspot = new THREE.Mesh(hotspotGeometry, hotspotMaterial);
hotspot.position.set(0, 0, -10);
this.scene.add(hotspot);

// 添加射线检测
this.raycaster = new THREE.Raycaster();
this.mouse = new THREE.Vector2();

window.addEventListener('click', event => {
  this.mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
  this.mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;

  this.raycaster.setFromCamera(this.mouse, this.camera);
  const intersects = this.raycaster.intersectObjects([hotspot]);

  if (intersects.length > 0) {
    console.log('热点被点击');
  }
});

vue实现全景图

标签: 全景图vue
分享给朋友:

相关文章

vue实现列表显示

vue实现列表显示

Vue 实现列表显示的方法 在 Vue 中实现列表显示通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式。 基本列表渲染 通过 v-for 指令遍历数组,动态生成…

vue实现生成二维码

vue实现生成二维码

使用qrcode.vue库生成二维码 安装qrcode.vue库: npm install qrcode.vue --save 在Vue组件中使用: <template> &l…

vue 实现jqslidedown

vue 实现jqslidedown

在 Vue 中实现类似 jQuery 的 slideDown 效果,可以通过 Vue 的过渡系统或 CSS 动画结合动态样式绑定来实现。以下是几种实现方式: 使用 Vue Transition…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue 实现打印

vue 实现打印

Vue 实现打印功能的方法 在Vue项目中实现打印功能,可以通过以下几种方式实现: 使用window.print()方法 通过调用浏览器的原生打印API实现基础打印功能,适用于简单内容打印。 //…

vue 实现搜索

vue 实现搜索

实现 Vue 搜索功能 在 Vue 中实现搜索功能通常涉及以下几个关键步骤: 数据绑定与输入监听 使用 v-model 双向绑定搜索输入框的值,监听用户输入: <template>…