【threejs教程9】threejs加载360全景图(VR)的两种方法

embedded/2024/9/20 7:19:12/ 标签: 前端, web, 3d, webgl, javascript, vr

目录

前言         

1.Equirectangular映射背景

实现步骤

1.初始化TextureLoader

 2.加载Equirectangular纹理

  3.配置映射类型和颜色空间 

 4.应用背景

完整代码如下

2.立方体贴图背景 

实现步骤

1.创建CubeTextureLoader

2.加载立方体贴图 

3.应用背景 

 完整代码如下

总结


前言         

在3D应用开发中,为场景设置引人入胜的背景是提升视觉效果的关键一环。Three.js,作为一款强大的Web 3D库,提供了多种方式来加载和应用背景。本文将介绍两种实用方法:使用Equirectangular映射的纹理以及立方体贴图(Cube Texture),让你的3D场景更加生动逼真。

1.Equirectangular映射背景

素材图片地址👉点击前往 

Equirectangular映射是一种将球面图像展开成矩形的技术,广泛应用于全景图的展示。在Three.js中,利用这种映射方式加载背景,可以轻松实现360度环境映射,为你的场景营造沉浸式体验。

实现步骤

1.初始化TextureLoader

首先,需要创建一个THREE.TextureLoader实例,这是加载图像资源的工具。

javascript">const textureLoader = new THREE.TextureLoader();
 2.加载Equirectangular纹理

使用load方法加载一张Equirectangular格式的全景图像。

javascript">const textureEquirec = textureLoader.load('./img/bg1.jpg');
  3.配置映射类型和颜色空间 

        为了正确显示,我们需要指定纹理映射方式为THREE.EquirectangularReflectionMapping,并设置正确的颜色空间。

javascript">textureEquirec.mapping = THREE.EquirectangularReflectionMapping;
textureEquirec.colorSpace = THREE.SRGBColorSpace;
 4.应用背景

        最后,将此纹理设置为场景的背景。

javascript">scene.background = textureEquirec;
完整代码如下
javascript"><template></template>
<script setup>
import * as THREE from 'three'
import { onMounted } from 'vue'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
const scene = new THREE.Scene()
// 加载背景
const textureLoader = new THREE.TextureLoader()
const textureEquirec = textureLoader.load('./img/bg1.jpg')
textureEquirec.mapping = THREE.EquirectangularReflectionMapping
textureEquirec.colorSpace = THREE.SRGBColorSpace
scene.background = textureEquirec
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
const renderer = new THREE.WebGLRenderer({ antialias: true })
const controls = new OrbitControls(camera, renderer.domElement)
onMounted(() => {init()
})
function init() {camera.position.set(0, 0, 5)renderer.setSize(window.innerWidth, window.innerHeight)document.body.appendChild(renderer.domElement)controls.update()function animate() {requestAnimationFrame(animate)controls.update()renderer.render(scene, camera)}animate()
}
</script>

2.立方体贴图背景 

 

           

立方体贴图由六个面组成,分别对应立方体的正X、负X、正Y、负Y、正Z、负Z方向,能够全方位地包裹场景,提供更加细腻真实的环境反射效果。

图像素材为官网示例中获取,也可从我这里网盘下载👉点击下载

实现步骤

1.创建CubeTextureLoader

与单张图像不同,立方体贴图需要专门的加载器THREE.CubeTextureLoader

javascript">const loader = new THREE.CubeTextureLoader();
2.加载立方体贴图 
  1. 由于立方体贴图由六张图像构成,我们首先设置它们的共同基础路径。

    javascript">loader.setPath('./img/');
  2. 接下来,按顺序列出六张图像文件名,这些图像分别代表立方体的六个面。

    javascript">const textureCube = loader.load(['posx.jpg', 'negx.jpg','posy.jpg', 'negy.jpg','posz.jpg', 'negz.jpg'
    ]);
3.应用背景 

 同样地,将立方体贴图设置为场景背景。

javascript">scene.background = textureCube;
 完整代码如下
javascript"><template></template>
<script setup>
import * as THREE from 'three'
import { onMounted } from 'vue'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
const scene = new THREE.Scene()
// 加载背景
// const textureLoader = new THREE.TextureLoader()
// const textureEquirec = textureLoader.load('./img/bg1.jpg')
// textureEquirec.mapping = THREE.EquirectangularReflectionMapping
// textureEquirec.colorSpace = THREE.SRGBColorSpace
// scene.background = textureEquirec
const loader = new THREE.CubeTextureLoader()
loader.setPath('./img/')
const textureCube = loader.load(['posx.jpg','negx.jpg','posy.jpg','negy.jpg','posz.jpg','negz.jpg',
])
scene.background = textureCube
const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight,0.1,1000
)
const renderer = new THREE.WebGLRenderer({ antialias: true })
const controls = new OrbitControls(camera, renderer.domElement)
onMounted(() => {init()
})
function init() {camera.position.set(0, 0, 5)renderer.setSize(window.innerWidth, window.innerHeight)document.body.appendChild(renderer.domElement)controls.update()function animate() {requestAnimationFrame(animate)controls.update()renderer.render(scene, camera)}animate()
}
</script>

总结

        通过上述两种方法,我们可以轻松地为Three.js场景添加丰富多彩的背景。Equirectangular映射适合于全景背景,营造无缝的环境体验;立方体贴图则在需要更精细环境反射的场景中大显身手。掌握这两种技术,将使你的3D项目更加出彩,为用户带来更加震撼的视觉享受。在实际开发中,根据项目需求选择最合适的背景加载方式,让创意无限延伸。


http://www.ppmy.cn/embedded/16462.html

相关文章

从国内盲盒小程序看国外市场的发展机遇与挑战

近年来&#xff0c;盲盒小程序在国内市场迅速崛起&#xff0c;凭借其独特的营销模式和消费者体验&#xff0c;赢得了大量年轻消费者的喜爱。从国内盲盒小程序的发展中&#xff0c;我们可以窥见国外市场的一些发展机遇与挑战&#xff0c;为进军国际市场提供有益的参考。 首先&a…

深入了解Eureka:微服务架构中的服务发现与注册中心

引言 微服务架构的兴起使得应用程序变得更加模块化和可扩展。在这种架构下&#xff0c;服务发现与注册中心扮演着至关重要的角色。本文将深入探讨Eureka作为服务发现与注册中心的作用、优缺点、重要性以及其服务架构。 一、Eureka的作用 Eureka是Netflix开源的一款用于构建分…

MATLAB线性函数拟合并预测

线性函数拟合&#xff0c;由线性函数很好描述的一个数集,也就是说如果我们所考虑的数据是以y(x)的形式给出&#xff0c;并且其中f(x)满足: 要求得 m 和b的值&#xff0c;我们可以使用一个称为 polyii(x,y,n)的 MATLAB 函数&#xff0c;其中n是我们要 MATLAB 求出的多项式的次数…

微软ML Copilot框架释放机器学习能力

摘要&#xff1a;大模型席卷而来&#xff0c;通过大量算法模型训练推理&#xff0c;能根据人类输入指令产生图文&#xff0c;其背后是大量深度神经网络模型在做运算&#xff0c;这一过程称之为机器学习&#xff0c;本文从微软语言大模型出发&#xff0c;详解利用大型语言模型&a…

实现自定义SpringBoot的Starter

starter机制 Spring Boot Starter机制是Spring Boot项目中的一个重要概念&#xff0c;它主要用于简化Maven或Gradle等构建工具中的依赖管理。每个Starter都包含了实现特定功能所需的库和组件&#xff0c;以及相应的配置文件。开发者只需在项目中引入相应的Starter依赖&#xf…

HTTP 网络协议请求的消息结构,具体详解(2024-04-25)

一、简介 HTTP 是基于客户端/服务端&#xff08;C/S&#xff09;的架构模型&#xff0c;通过一个可靠的链接来交换信息&#xff0c;是一个无状态的请求/响应协议。 HTTP 消息是客户端和服务器之间通信的基础&#xff0c;它们由一系列的文本行组成&#xff0c;遵循特定的格式和…

网络安全之防范钓鱼邮件

随着互联网的快速发展&#xff0c;新的网络攻击形式“网络钓鱼”呈现逐年上升的趋势&#xff0c;利用网络钓鱼进行欺骗的行为越来越猖獗&#xff0c;对互联网的安全威胁越来越大。网络钓鱼最常见的欺骗方式就是向目标群体发送钓鱼邮件&#xff0c;而邮件标题和内容&#xff0c;…

【线性代数 C++】结合逆矩阵的克拉默法则

1 原理 对于 n n n个变量、 n n n个方程的线性方程组 { a 11 x 1 a 12 x 2 ⋯ a 1 n x n b 1 a 21 x 1 a 22 x 2 ⋯ a 2 n x n b 2 ⋯ ⋯ ⋯ a n 1 x 1 a n 2 x 2 ⋯ a n n x n b n , (1) \begin{cases} a_{11}x_1a_{12}x_2\cdots a_{1n}x_nb_1 \\ a_{21}x_1a_{22}…

设计模式:迪米特法则(Law of Demeter,LoD)介绍

迪米特法则&#xff08;Law of Demeter&#xff0c;LoD&#xff09;&#xff0c;也称为最少知识原则&#xff08;Least Knowledge Principle&#xff0c;LKP&#xff09;&#xff0c;是面向对象设计原则之一&#xff0c;它强调一个对象应该对其他对象有尽可能少的了解&#xff…

汽车组装3D电子说明书更通俗易懂

激光打印机由于造价高、技术更先进&#xff0c;因此在使用和维护上需要更专业的手法&#xff0c;而对于普通客户来说并不具备专业操作激光打印机的技能&#xff0c;为了通俗易懂地让客户理解激光打印机&#xff0c;我们为企业定制了激光打印机3D产品说明书&#xff0c;将为您带…

unity中压缩文件与解压文件

今天研究了一下在unity中 把文件压缩后转二进制发送到服务器并从服务器下载后解压使用文件&#xff0c;废话不多说直接上代码&#xff0c;zip压缩插件是用的dotnetzip插件&#xff0c;网上可以搜索下载这个dll private static void GetPathMeshData_ZIP(Milling_ProjectData da…

kotlin根据文件的filePath转化为uri

方法实现 使用File类来创建一个文件对象&#xff0c;然后通过FileProvider来获取文件的URI import android.content.Context import android.net.Uri import androidx.core.content.FileProvider import java.io.Filefun getFileUri(context: Context, filePath: String): Ur…

Delta模拟器:iOS上的复古游戏天堂

Delta模拟器&#xff1a;iOS上的复古游戏天堂 在数字时代&#xff0c;我们有时会怀念起那些早期的电子游戏&#xff0c;它们简单、纯粹&#xff0c;带给我们无尽的乐趣。虽然现在的游戏在画质和玩法上都有了巨大的提升&#xff0c;但那种复古的感觉却始终无法替代。幸运的是&a…

【漏洞复现】用友政务财务系统 FileDownload 任意文件读取漏洞

0x01 产品简介 用友政务财务系统是面向政府部门、事业单位、非赢利组织的全方位业务管理信息化解决方案提供商。该系统具备一系列的功能特点,能够满足不同规模和类型企业的财务管理需求。 0x02 漏洞概述 用友政务财务系统存在任意文件读取漏洞,未授权的攻击者可以通过该漏…

算法-动态规划专题

文章目录 前言 : 动态规划简述1 . 斐波那契模型1.1 泰波那契数列1.2 最小花费爬楼梯1.3 解码方法 前言 : 动态规划简述 动态规划在当前我们的理解下,其实就是一种变相的递归,我们查看一些资料也可以知道,动态规划其实属于递归的一个分支,通过把递归问题开辟的栈帧通过一定的手…

Qt : 禁用控件默认的鼠标滚轮事件

最近在写一个模拟器&#xff0c;在item中添加了很多的控件&#xff0c;这些控件默认是支持鼠标滚动事件的。在数据量特别大的时候&#xff0c;及容易不小心就把数据给修改了而不自知。所有&#xff0c;我们这里需要禁用掉这些控件的鼠标滚轮事件。 实现的思想很简单&#xff0c…

先进制造aps专题三 为什么java语言不适合作为aps算法的开发语言

为什么java语言不适合作为aps算法的开发语言 主要两个原因 1 java的list在特定位置插入&#xff0c;其实是重新生成一个新list,而不像c就是指针操作 2 数据量大&#xff0c;运行时间长&#xff0c;会跑崩 所以商业aps产品&#xff0c;都是清一色的用c写aps算法 先进制造…

物联网鸿蒙实训解决方案

一、建设背景 在数字化浪潮汹涌的时代&#xff0c;华为鸿蒙系统以其前瞻的技术视野和创新的开发理念&#xff0c;成为了引领行业发展的风向标。 据华为开发者大会2023&#xff08;HDC. Together&#xff09;公布的数据&#xff0c;鸿蒙生态系统展现出了强劲的发展动力&#x…

mybatis-plus 动态表名简易使用

场景&#xff1a;由于有些表是分表的&#xff0c;需要给表名添加后缀才能正确地访问表&#xff0c;如sys_user_2024_01 代码 依赖版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><ve…

mysql机试题笔记425

题目 Sql题&#xff0c;有一个学生信息表&#xff0c; stu_info_table(stu_id, name, class) 和一张学生成绩表 stu_score_table(stu_id, course_id, score) 和一张课程表 stu_course(course_id, course_name)因为有可能存在挂科&#xff0c;所以在学生成绩表中&#xff0c; 一…