没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
一、项目介绍: Vue3+ts+threejs实现360度VR全景功能如下: 1. 360度自由视角:用户可以拖拽观看房内全景和自由旋转视角,查看房间的每个角落。 2. 场景切换:用户可以通过点击房间名称热点标注,实现不同房间之间的切换,体验整个房屋的布局。 3.楼层之间上下:用户点击一楼的热点标注可以上到二楼的房间和上到三楼的房间观察全景。 二、项目架构与使用: 1、介绍如何基于Vue3+ts+threejs搭建三维场景。 2、介绍实现全景图的两种方案:立方体和球体两种形式全景图制作。 3、实现房间切换功能,文字说明,代码实现以及效果图展示都写在文档中。 4、介绍如何创建精灵文字 5、实现多个房间切换功能。
资源推荐
资源详情
资源评论
Vue3+ts+threejs 实现 360 度 VR 全景
一、基本场景搭建
<template>
<div class="container" ref="container"></div>
</template>
<script setup>
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";
import { ref, onMounted } from "vue";
// 初始化场景
const scene = new THREE.Scene();
// 初始化相机
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
// 设置相机位置
camera.position.set(0, 0, 0);
// 初始化渲染器
const renderer = new THREE.WebGLRenderer({
antialias: true,
alpha: true,
logarithmicDepthBuffer: true,
});
renderer.setSize(window.innerWidth, window.innerHeight);
const container = ref(null);
const render = () => {
renderer.render(scene, camera);
requestAnimationFrame(render);
};
onMounted(() => {
container.value.appendChild(renderer.domElement);
render();
});
</script>
<style>
* {
margin: 0;
padding: 0;
}
.container {
height: 100vh;
width: 100vw;
background-color: #f0f0f0;
}
.map {
width: 300px;
height: 260px;
position: absolute;
left: 0;
bottom: 0;
overflow: hidden;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
}
.map > img {
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
}
.map > .tag {
position: absolute;
top: 0;
left: 0;
width: 30px;
height: 30px;
/* background-image: url(./assets/location.png); */
background-size: cover;
z-index: 1;
}
.loading {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
/* background-image: url(./assets/loading.png); */
background-size: cover;
filter: blur(50px);
z-index: 100;
}
.progress {
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 101;
display: flex;
justify-content: center;
align-items: center;
font-size: 20px;
color: #fff;
}
.progress > img {
padding: 0 15px;
}
.title {
width: 180px;
height: 40px;
position: fixed;
right: 100px;
top: 50px;
background-color: rgba(0, 0, 0, 0.5);
line-height: 40px;
text-align: center;
color: #fff;
border-radius: 5px;
z-index: 110;
}
</style>
二、创建立方体盒子(在 onMounted 里面)
小知识:获取鼠标当前位置
let mouseX = (event.clientX / window.innerWidth) * 2 -1;
let mouseY = (event.clientY / window.innerHeight) * 2 -1;
console.log(mouseX,mouseY);
cube.rotation.y = mouseX * Math.PI;
cube.rotation.x = mouseY * Math.PI;
三、简单的全景图做好了
1、基于立方体的
<template>
<div class="container" ref="container"></div>
</template>
<script setup>
import * as THREE from "three";
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";
import { ref, onMounted } from "vue";
// 初始化场景
const scene = new THREE.Scene();
// 初始化相机
const camera = new THREE.PerspectiveCamera(
75,
window.innerWidth / window.innerHeight,
0.1,
1000
);
// 设置相机位置
camera.position.set(0, 0, 0);
// 初始化渲染器
const renderer = new THREE.WebGLRenderer({
antialias: true,
alpha: true,
logarithmicDepthBuffer: true,
});
renderer.setSize(window.innerWidth, window.innerHeight);
const container = ref(null);
const render = () => {
renderer.render(scene, camera);
requestAnimationFrame(render);
};
onMounted(() => {
// 创建立方体
const geometry = new THREE.BoxGeometry(10, 10, 10);
geometry.scale(1, 1, -1); //-1 代表反向,1 代表正面朝向我们的
let textureUrl = "./img/livingroom/"; //给立方体添加纹理
let roomIndex = 0; //房间的索引
var arr = [
`${roomIndex}_l`, //左 ,默认这个顺序
`${roomIndex}_r`, //右
`${roomIndex}_u`, //上
`${roomIndex}_d`, //下
`${roomIndex}_b`, //后
`${roomIndex}_f`, //前
];
let boxMaterials = []; // 设置一个盒子材质的数组
arr.forEach((item) => { //循环遍历取出每一张图片纹理
// 纹理加载
const texture = new THREE.TextureLoader().load(
textureUrl + item + ".png"
);
boxMaterials.push(new THREE.MeshBasicMaterial({ map: texture, })); //
把每一次取出的纹理图片放入盒子数组
剩余21页未读,继续阅读
资源评论
qq_35430208
- 粉丝: 1436
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 车辆下层控制器设计,发动机模型及逆模型,主要是将车辆加速度信号转化为对于的节气门与制动压力信号,matlab与carsim联合仿
- comsol电缆温度场仿真,电缆载流量仿真 单芯电力电缆 海底电缆载流量COMSOL仿真,电缆 海缆温度瞬态仿真模型 电磁热,电
- 三相维也纳整流器的仿真模型 控制算法采用电压和电流双闭环控制 外部电压环路为PI控制器,内部电流环路为bang bang
- 数据分析工作流程源码 MATLAB
- Python 数学计算与温度换算程序详解
- C# 中事件与委托应用示例,一个很简单的入门demo
- C++串口通信与数据移位实现方法详解.txt
- 通过GPIO控制LED灯 python语言和树莓派
- 问题汇总_C语言、数据结构.docx
- 2023-04-06-项目笔记 - 第二百七十七阶段 - 4.4.2.275全局变量的作用域-275 -2025.10.05
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功