Three.js使用全景图做360°背景贴图

一、准备工作

对于一张全景图,一般都具备上下左右前后6个方向,所以准备工作就是需要准备六张图片,包含六个方位(类比正方体),最好使用【全景图】来进行裁切,得到完整且流畅过度的六张图片,这里我使用的是【PTGui】软件进行全景图裁切
官网下载地址:PTGui
(https://ptgui.com/download.html?ps=main)
具体使用流程如下:

  1. 打开一张全景图
    List item
  2. 选择顶部的Tools
    在这里插入图片描述
  3. 设置导出格式,点击【Convert】即可导出6张图片在这里插入图片描述

二、代码实现

这里我使用的是 Vue3 + vite + three.js 脚手架搭建的项目

<template>
  <div id="my-three" ref="screenDom"></div>
</template>

<script setup>
import * as THREE from 'three'
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'
import {ref, onMounted} from "vue"
import px from '../assets/环境贴图/01/px.jpg'
import nx from '../assets/环境贴图/01/nx.jpg'
import py from '../assets/环境贴图/01/py.jpg'
import ny from '../assets/环境贴图/01/ny.jpg'
import pz from '../assets/环境贴图/01/pz.jpg'
import nz from '../assets/环境贴图/01/nz.jpg'
import { DoubleSide } from 'three'
// console.log(THREE)

let screenDom = ref(null)

onMounted(() => {
  // 1. 创建场景
  const scene = new THREE.Scene()

  // 2. 创建相机
  const camera = new THREE.PerspectiveCamera(75, screenDom.value.clientWidth / screenDom.value.clientHeight, 0.1, 1000)

  // 3. 设置相机位置
  camera.position.set(5, 5, 15)
  scene.add(camera)

  // 设置cube纹理加载器
  const cubeTextureLoader = new THREE.CubeTextureLoader()
  const envMapTexture = cubeTextureLoader.load([px, nx, py, ny, pz, nz])

  // 4. 创建几何体
  const sphereGeometry = new THREE.SphereGeometry(2, 32, 32)
  const material = new THREE.MeshStandardMaterial({
    metalness: 1,
    roughness: 0.1, 
    envMap: envMapTexture
  })       // 材质
  const cube = new THREE.Mesh(sphereGeometry, material)     // 根据缓冲几何体和材质创建物体

  scene.add(cube)     // 将几何体添加到场景中

  // 给场景添加背景
  scene.background = envMapTexture
  // 给场景所有物体添加默认的环境贴图(类似于单独给材质添加环境贴图   envMap: envMapTexture  )
  // scene.environment = envMapTexture


  // 添加环境光
  // 第一个参数是环境光的【颜色】,第二个是【光照强度】
  const light = new THREE.AmbientLight(0xffffff, 0.5)
  scene.add(light)

  // 5. 初始化渲染器
  const renderer = new THREE.WebGLRenderer()

  // 设置渲染尺寸大小
  renderer.setSize(screenDom.value.clientWidth, screenDom.value.clientHeight)
  // console.log(renderer)
  // 将webgl渲染的canvas内容添加到指定位置
  screenDom.value.appendChild(renderer.domElement)

  // 创建轨道控制器
  const controls = new OrbitControls(camera, renderer.domElement)

  // 设置控制器阻尼,让控制器更有真实效果,必须在动画循环里调用 update()
  controls.enableDamping = true

  // 添加坐标轴辅助器
  // const axesHelper = new THREE.AxesHelper(6)
  // scene.add(axesHelper)

  // 双击屏幕进入或退出全屏
  window.addEventListener('dblclick', () => {
    document.fullscreenElement ? document.exitFullscreen() : renderer.domElement.requestFullscreen()
  })

  function render(time) {
    controls.update()
    // 使用渲染器,通过相机将场景渲染进来
    renderer.render(scene, camera)

    // 渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render)
  }

  render()

  // 监听画面变化,更新渲染画面
  window.addEventListener('resize', () => {
    // 更新摄像头
    camera.aspect = screenDom.value.clientWidth / screenDom.value.clientHeight

    // 更新摄像头的投影矩阵
    camera.updateProjectionMatrix()

    // 更新渲染器
    renderer.setSize(screenDom.value.clientWidth, screenDom.value.clientHeight)

    // 设置渲染器的像素比
    renderer.setPixelRatio(window.devicePixelRatio)
  })
})


</script>

<style scoped>

#my-three {
  width: 100%;
  height: 100%;
}
</style>

三、实现效果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue中使用Three.js VR全景图,你可以按照以下步骤进行: 1. 首先,确保你已经安装了Vue和Three.js的依赖包。你可以使用npm或yarn来安装它们。 2. 在Vue的组件中,导入Three.js所需的库和组件: ```javascript import * as THREE from 'three'; import { VRButton } from 'three/examples/jsm/webxr/VRButton.js'; ``` 3. 创建一个Vue组件,并在其中定义一个方法来初始化Three.js场景: ```javascript export default { mounted() { this.initScene(); }, methods: { initScene() { // 创建场景 const scene = new THREE.Scene(); // 创建相机 const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); // 创建渲染器 const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // 添加VR按钮 document.body.appendChild(VRButton.createButton(renderer)); // 创建全景图 const textureLoader = new THREE.TextureLoader(); const texture = textureLoader.load('path/to/your/panorama-image.jpg'); const sphereGeometry = new THREE.SphereGeometry(500, 60, 40); const sphereMaterial = new THREE.MeshBasicMaterial({ map: texture }); const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.position.set(0, 0, 0); scene.add(sphere); // 更新相机和场景 const animate = () => { requestAnimationFrame(animate); sphere.rotation.y += 0.01; renderer.render(scene, camera); }; animate(); }, }, }; ``` 4. 在Vue模板中使用这个组件: ```html <template> <div id="app"> <canvas id="vr-canvas"></canvas> </div> </template> ``` 这样,你就可以在Vue中使用Three.js VR全景图了。当用户点击VR按钮时,全屏显示全景图,并支持通过移动设备或VR眼镜进行交互。你可以适配不同的全景图、修改相机参数等来满足你的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值