百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

在Three.js中使用HDRI贴图作为3D背景和光源

suiw9 2024-10-26 14:29 25 浏览 0 评论

最令人兴奋的项目之一是在 Three js 中添加HDRI背景。 HDRI图像是从房间内部或花园、丛林或山脉等开放环境等场景中以 360 度捕获的。 你可以自己创建任何这些图像,但这不是本教程的主题。 相反,我们将从网站获取这些图像之一,并使用轨道控件,让用户能够转动物体并以 360 度查看所有内容。 我们还可以将物体添加到场景中并赋予它们颜色或增加它们的金属度并降低它们的粗糙度以成为球形镜子。

推荐:用 NSDT编辑器 快速搭建可编程3D场景

1、在Three.js中添加背景

可能性是无限的,你可以做很多事情。 例如,可以通过添加不同家具、地毯、垫子等的 3D 模型来创建空房间的室内设计。 本教程是创建虚拟世界的开始,你可以虚拟地建造自己的梦想之家,并从各个不同的方面观看它。 正如我们在其他 Three js 教程中所说,一旦开始使用 Three js,天空才是极限。

我们将从three.js 场景的简单元素开始,包括相机、渲染器、场景、对象和光源(如果需要)。 在此之前,我们使用 Vite 插件来轻松创建运行 Three.js 代码所需的所有文件夹和文件。 首先,使用以下命令在项目目录中创建一个文件夹:

mkdir BackgroundScene
cd BackgroundScene

然后,在文件夹中,运行 Vite 插件命令即可创建必要的文件和文件夹:

npm create vite@latest

然后,输入项目名称。 可以用glowingSphere作为名字。 但是,该名称是任意的,你可以选择任何想要的名称。 然后,选择 vanilla 作为框架和变体。 之后,在终端中输入以下命令:

cd BackgroundScene
npm install

接下来,你可以在 main.js 文件中输入要编写的 JavaScript 代码。 因此,我们将输入基本或模板代码,用于运行带有动画对象(例如球体)的每个项目。 另外,每次创建项目时不要忘记安装three.js包:

npm install three

在 main.js 文件中输入以下代码:

import * as THREE from 'three';
import { Mesh } from 'three';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, innerWidth / innerHeight , 0.1, 1000);
const renderer = new THREE.WebGLRenderer({
     antialias : true
})
renderer.setSize(innerWidth, innerHeight);
document.body.appendChild(renderer.domElement);
//creating a sphere
const geometry = new THREE.SphereGeometry(5, 50, 50);
const material = new THREE.MeshBasicMaterial({
     color:0x3268F8
})
const sphere = new THREE.Mesh(geometry,material);
scene.add(sphere);
camera.position.z = 15;
function animate(){
     requestAnimationFrame(animate);
     renderer.render(scene,camera);
     sphere.rotation.y += 0.003;
}
animate();

上面的代码可以作为后续项目的样板。 此代码的输出将是蓝色球体,如下图所示。 但是,为了能够显示这一点,你应该在终端中编写以下命令:

pm run dev

2、在Three.js 中使用轨道控件设置背景

现在,我们想要创建一个要添加的背景场景,但在此之前,我们需要将渲染从动画更改为轨道控件,这样我们就可以控制从动画更改场景,而不是旋转对象。 相机视角。 这样做使我们能够从各个角度查看 HDRI 图像。 首先,我们需要导入以下 2 个库:

import {OrbitControls} from "/node_modules/three/examples/jsm/controls/OrbitControls.js";
import Stats from "/node_modules/three/examples/jsm/libs/stats.module.js";

然后,我们要做的就是修改下面的渲染代码:

function animate(){
     requestAnimationFrame(animate);
     renderer.render(scene,camera);
     sphere.rotation.y += 0.003;
}
Animate();

修改后的代码如下所示:

const controls = new OrbitControls(camera, renderer.domElement);
window.addEventListener('resize', onWindowResize, false);
function onWindowResize() {
      camera.aspect = window.innerWidth / window.innerHeight;
      camera.updateProjectionMatrix();
      renderer.setSize(window.innerWidth, window.innerHeight);
      render();
}
const stats = Stats();
document.body.appendChild(stats.dom);
function animate() {
      requestAnimationFrame(animate);
      render();
      stats.update();
}
function render() {
      renderer.render(scene, camera);
}
animate();

现在我们应该能够围绕该物体运行。 接下来我们应该做的是将基础材质更改为标准材质并创建镜面效果:

const geometry = new THREE.SphereGeometry();
const material = new THREE.MeshStandardMaterial({
      color: 0xffffff,
})
material.roughness = 0;
material.metalness = 1;
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);

3、添加HDRI环境贴图

最后,我们到达最令人兴奋的部分,即将 HDRI 图像添加到背景中。

为此,我们需要首先从BimAnt HDRI等网站找到这些图像,BimAnt HDRI提供超过600张HDRI环境贴图,优点是无需登录即可直接预览和下载:

之后,我们应该创建一个名为 images 的文件夹并将 HDRI 图像粘贴到其中。 最后,添加以下代码以便能够渲染场景中的背景:

import {RGBELoader} from "/node_modules/three/examples/jsm/loaders/RGBELoader.js";
renderer.toneMapping = THREE.ACESFilmicToneMapping;
renderer.toneMappingExposure = 0.6;
renderer.outputEncoding = THREE.sRGBEncoding;
new RGBELoader().load("/images/solitude_4k.hdr", function(texture){
      texture.mapping = THREE.EquirectangularReflectionMapping;
      scene.background = texture;
      scene.environment = texture;
})

现在,如果我们保存代码,结果将如下所示:

用鼠标左键单击页面并将其向左、向右、向上或向下移动时,你会发现可以从所有不同的角度看到场景。 另外,由于我们将球体材质的金属度定义为 1,粗糙度定义为 0,我们可以看到球体上的镜面效果,以真实的方式反映背景场景。

可以说我们不需要任何光源,但请注意,如果物体靠近地面或在任何其他需要看到球的阴影的情况下,那么必须向场景添加光源并将其放置在光源光线与太阳光线方向相同的位置。

4、结束语

在本教程中,我们已成功将HDRI环境贴图添加到场景中。

我们首先使用 Vite 插件和我们在大多数 Three js 项目中使用的样板代码。 然后,我们删除旋转动画,取而代之的是轨道控件,以便用户能够使用鼠标查看他们想要的场景的任何角度。

接下来我们要做的是将物体的材质从基本材质更改为标准材质,以便我们可以在球体表面添加镜面效果。为了实现这一点,我们将金属度设置为 1,粗糙度设置为 0

然后我们从BimAnt HDRI下载 HDRI 图像并将其添加到我们的目录中。 最终,我们编写了与添加背景场景相关的脚本,结果令人惊讶!

当然,你可以对房间的室内设计进行相同的过程,并在房间背景场景中添加一些逼真的家具和其他元素,并创建自己的虚拟现实版本。


原文链接:http://www.bimant.com/blog/threejs-hdri-envmap-tutorial/

相关推荐

俄罗斯的 HTTPS 也要被废了?(俄罗斯网站关闭)

发布该推文的ScottHelme是一名黑客,SecurityHeaders和ReportUri的创始人、Pluralsight作者、BBC常驻黑客。他表示,CAs现在似乎正在停止为俄罗斯域名颁发...

如何强制所有流量使用 HTTPS一网上用户

如何强制所有流量使用HTTPS一网上用户使用.htaccess强制流量到https的最常见方法可能是使用.htaccess重定向请求。.htaccess是一个简单的文本文件,简称为“.h...

https和http的区别(https和http有何区别)

“HTTPS和HTTP都是数据传输的应用层协议,区别在于HTTPS比HTTP安全”。区别在哪里,我们接着往下看:...

快码住!带你十分钟搞懂HTTP与HTTPS协议及请求的区别

什么是协议?网络协议是计算机之间为了实现网络通信从而达成的一种“约定”或“规则”,正是因为这个“规则”的存在,不同厂商的生产设备、及不同操作系统组成的计算机之间,才可以实现通信。简单来说,计算机与网络...

简述HTTPS工作原理(简述https原理,以及与http的区别)

https是在http协议的基础上加了一层SSL(由网景公司开发),加密由ssl实现,它的目的是为用户提供对网站服务器的身份认证(需要CA),以至于保护交换数据的隐私和完整性,原理如图示。1、客户端发...

21、HTTPS 有几次握手和挥手?HTTPS 的原理什么是(高薪 常问)

HTTPS是3次握手和4次挥手,和HTTP是一样的。HTTPS的原理...

一次安全可靠的通信——HTTPS原理

为什么HTTPS协议就比HTTP安全呢?一次安全可靠的通信应该包含什么东西呢,这篇文章我会尝试讲清楚这些细节。Alice与Bob的通信...

为什么有的网站没有使用https(为什么有的网站点不开)

有的网站没有使用HTTPS的原因可能涉及多个方面,以下是.com、.top域名的一些见解:服务器性能限制:HTTPS使用公钥加密和私钥解密技术,这要求服务器具备足够的计算能力来处理加解密操作。如果服务...

HTTPS是什么?加密原理和证书。SSL/TLS握手过程

秘钥的产生过程非对称加密...

图解HTTPS「转」(图解http 完整版 彩色版 pdf)

我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。...

HTTP 和 HTTPS 有何不同?一文带你全面了解

随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...

HTTP与HTTPS的区别,详细介绍(http与https有什么区别)

HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的...

一文让你轻松掌握 HTTPS(https详解)

一文让你轻松掌握HTTPS原文作者:UC国际研发泽原写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。...

如何在Spring Boot应用程序上启用HTTPS?

HTTPS是HTTP的安全版本,旨在提供传输层安全性(TLS)[安全套接字层(SSL)的后继产品],这是地址栏中的挂锁图标,用于在Web服务器和浏览器之间建立加密连接。HTTPS加密每个数据包以安全方...

一文彻底搞明白Http以及Https(http0)

早期以信息发布为主的Web1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要...

取消回复欢迎 发表评论: