当前位置:首页 > VUE

vue实现全景图

2026-01-23 02:54:24VUE

Vue 实现全景图的方法

使用 Three.js 和 Vue 结合

安装依赖库:

npm install three

在 Vue 组件中引入 Three.js 并创建全景图场景:

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

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

export default {
  mounted() {
    this.initPanorama();
  },
  methods: {
    initPanorama() {
      const container = this.$refs.container;
      const scene = new THREE.Scene();
      const camera = new THREE.PerspectiveCamera(75, container.clientWidth / container.clientHeight, 0.1, 1000);
      const renderer = new THREE.WebGLRenderer();
      renderer.setSize(container.clientWidth, container.clientHeight);
      container.appendChild(renderer.domElement);

      const geometry = new THREE.SphereGeometry(500, 60, 40);
      geometry.scale(-1, 1, 1);
      const texture = new THREE.TextureLoader().load('path/to/panorama.jpg');
      const material = new THREE.MeshBasicMaterial({ map: texture });
      const sphere = new THREE.Mesh(geometry, material);
      scene.add(sphere);

      camera.position.set(0, 0, 0.1);

      const animate = () => {
        requestAnimationFrame(animate);
        renderer.render(scene, camera);
      };
      animate();

      let isDragging = false;
      let previousMousePosition = { x: 0, y: 0 };
      container.addEventListener('mousedown', () => { isDragging = true; });
      container.addEventListener('mouseup', () => { isDragging = false; });
      container.addEventListener('mousemove', (event) => {
        if (!isDragging) return;
        const deltaMove = {
          x: event.clientX - previousMousePosition.x,
          y: event.clientY - previousMousePosition.y
        };
        sphere.rotation.y += deltaMove.x * 0.01;
        sphere.rotation.x += deltaMove.y * 0.01;
        previousMousePosition = { x: event.clientX, y: event.clientY };
      });
    }
  }
};
</script>

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

使用现成的 Vue 全景图组件

安装 vue-panorama 组件:

npm install vue-panorama

在 Vue 项目中使用:

<template>
  <vue-panorama :src="panoramaImage" />
</template>

<script>
import VuePanorama from 'vue-panorama';

export default {
  components: {
    VuePanorama
  },
  data() {
    return {
      panoramaImage: require('@/assets/panorama.jpg')
    }
  }
}
</script>

使用 PhotoSphereViewer 库

安装 PhotoSphereViewer:

npm install photo-sphere-viewer

在 Vue 组件中使用:

<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 {
  mounted() {
    this.initViewer();
  },
  methods: {
    initViewer() {
      const viewer = new Viewer({
        container: this.$refs.viewer,
        panorama: 'path/to/panorama.jpg',
        size: {
          width: '100%',
          height: '100vh'
        }
      });
    }
  }
};
</script>

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

注意事项

确保全景图是等距柱状投影格式(equirectangular projection),这是大多数全景图查看器支持的标准格式。

对于移动设备支持,需要添加触摸事件处理,Three.js 示例中可以添加类似以下代码:

container.addEventListener('touchstart', () => { isDragging = true; });
container.addEventListener('touchend', () => { isDragging = false; });
container.addEventListener('touchmove', (event) => {
  if (!isDragging) return;
  const deltaMove = {
    x: event.touches[0].clientX - previousMousePosition.x,
    y: event.touches[0].clientY - previousMousePosition.y
  };
  sphere.rotation.y += deltaMove.x * 0.01;
  sphere.rotation.x += deltaMove.y * 0.01;
  previousMousePosition = { x: event.touches[0].clientX, y: event.touches[0].clientY };
});

考虑添加加载状态和错误处理,提升用户体验:

const textureLoader = new THREE.TextureLoader();
textureLoader.load(
  'path/to/panorama.jpg',
  (texture) => {
    const material = new THREE.MeshBasicMaterial({ map: texture });
    const sphere = new THREE.Mesh(geometry, material);
    scene.add(sphere);
  },
  undefined,
  (error) => {
    console.error('Error loading panorama:', error);
  }
);

vue实现全景图

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

相关文章

vue实现查询替换

vue实现查询替换

Vue 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue实现自定义登录

vue实现自定义登录

实现自定义登录的基本步骤 在Vue中实现自定义登录功能通常需要结合前端和后端技术。以下是一个基本的实现流程: 创建登录表单组件 使用Vue的单文件组件创建一个登录表单,包含用户名和密码输入框以及提…

vue实现右下角弹框

vue实现右下角弹框

实现右下角弹框的基本思路 在Vue中实现右下角弹框,通常需要结合CSS定位和Vue的组件化特性。弹框可以通过绝对定位固定在右下角,并通过Vue控制其显示与隐藏。 创建弹框组件 新建一个Vue组件(…

vue实现付款

vue实现付款

Vue 实现付款功能 在 Vue 中实现付款功能通常需要集成第三方支付网关(如支付宝、微信支付、Stripe 等)。以下是常见的实现方法: 集成支付宝/微信支付 安装必要的依赖(如 axios 用…

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独…

vue 实现jqslidedown

vue 实现jqslidedown

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