HDRI贴图下载及Three.js利用

news2024/11/15 8:43:05

最令人兴奋的项目之一是在 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环境贴图,优点是无需登录即可直接预览和下载:

在这里插入图片描述

http://hdri.bimant.com

之后,我们应该创建一个名为 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 图像并将其添加到我们的目录中。 最终,我们编写了与添加背景场景相关的脚本,结果令人惊讶!

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


原文链接:Three.js添加HDRI背景 — BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1152751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(免费领源码)小程序+spring boot+mysql疫起买菜平台99212-计算机毕业设计项目选题推荐

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,疫起买菜平台小程序被用户普遍使用,为方便用户…

Transformer.js简明教程【Web AI】

Transformers.js 可在你的 Web 浏览器中实现最先进的机器学习,无需服务器。 它提供预训练模型和熟悉的 API,支持自然语言处理、计算机视觉、音频和多模态领域的任务。 借助 Transformers.js,开发人员可以直接在浏览器中运行文本分类、图像分类…

一文详解Docker与虚拟机的不同

Docker概述 Docker 是基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初…

SurfaceFliger与Vsync信号如何建立链接?

Vsync信号上报流程 Vsync的注册函数,来临时会回调HWComposer的hook_VSYNC方法,接着调用到vsync方法中 大致流程梳理: 该方法会通知给SurfaceFliger的onVsyncReceived方法,接着调用DispSync的addResyncSample方法。 DispSyncThr…

Vue.js中的双向数据绑定(two-way data binding)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

如何在外SSH远程连接Ubuntu系统【无公网IP】

如何在外SSH远程连接Ubuntu系统【无公网IP】 文章目录 如何在外SSH远程连接Ubuntu系统【无公网IP】前言1. 在Ubuntu系统下安装cpolar软件2. 完成安装后打开cpolar客户端web—UI界面3. 创建隧道取得连接Ubuntu系统公网地址4. 打开Windows的命令界面并输入命令 前言 随着科技和经…

Java访问直接内存

一、背景 上一篇文章 类目体系设计总结,讲了Forest缓存数据是放在直接内存的,今天我们就来了解一下Java的直接内存是个啥玩意,它该怎么使用。 二、直接内存介绍 直接内存是在Java堆外的,直接向系统申请内存空间,它不…

哈希映射题·缺失的第一个正数

记录一道题解~ 题目链接:缺失的第一个正数 解题思路: 理想情况下每个元素都在自己的位置上,如下: 现在将元素对应位置打乱,并且缺失了一个元素,如下: 题目就是要求我们找到这个缺失…

【论文阅读】End-to-End Spatio-Temporal Action Localisation with Video Transformers

文章目录 摘要和结论引言模型框架Vision EncoderTubelet Decoder(factorise Queries CA MHSA)Training objectiveMatching 摘要和结论 e2e,纯基于Transformer的模型,输入视频输出tubelets。无论是 对单个帧的稀疏边界框监督 还是 完整的小管注释。在这两…

【设计模式】第7节:创建型模式之“建造者模式”

Builder模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式。 在创建对象时,一般可以通过构造函数、set()方法等设置初始化参数,但当参数比较多,或者参数之间有依赖关系,需要进行复杂校验时&a…

安装终端 ·Terminator

安装终端 在 ROS 中,需要频繁的使用到终端,且可能需要同时开启多个窗口,推荐一款较为好用的终端:**Terminator。**效果如下: 1.安装 sudo apt install terminator2.添加到收藏夹 显示应用程序 —> 搜索 terminator —> 右击 选择 添…

Qt显示中文

中文: unicode:\u4e2d\u6587 utf8:0xE4,0xB8,0xAD,0xE6,0x96,0x87 str 是UI上直接写中文,在这里获取得出的是unicode; str1是得到unicode,相当于fromUtf8() 是将utf8转成unicode; str2是得到…

Linux MeterSphere测试平台远程访问你不会?来试试这篇文章

🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网…

《向心城市:迈向未来的活力、宜居与和谐》语录摘录

>> 规律背后,是普遍的人性。 >> 城市一直在两种力量的角逐之下生长。一种是向心力,它让你怀揣梦想;另一种是离心力,它让你肉身疲惫。 >> 有一点是肯定的,市场经济之所以重要,就在于承认人…

Linux命令之网络命令route

一、route命令简介 route命令是Linux系统中的一个网络管理工具,用于显示和操作IP路由表。它可以用来查看当前系统的路由表信息,添加、删除或修改路由表项,以及显示路由表中的详细信息。route命令可以帮助用户诊断和解决网络连接问题&#xff…

连铸生产线液压系统比例伺服阀放大器

连铸生产线液压系统是连铸机的关键组成部分,它由液压站组成,包括高压泵站、剪切机泵站、滑动水口站、塞棒液压站、中间罐车液压站和倾翻台液压站。这些站点通过管道连接,共同实现连铸机的各类动作,如升降、横移、定位、锁紧及辊缝…

2023香港秋灯展丨移远通信闪耀亮相,开启Matter生态互联新篇章

10月27日,2023香港国际秋季灯饰展于香港会议展览中心正式开幕。 移远通信携最新一站式Matter解决方案、Wi-Fi模组,以及多款代表前沿技术的智能灯具、插座等终端重磅亮相。同时,公司产品总监丁子文围绕“Matter生态互联新篇章”主题发表演讲&a…

什么是Vue.js中的指令(directive)?举例说明一些常见的指令。

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

目标检测:Proposal-Contrastive Pretraining for Object Detection from Fewer Data

论文作者:Quentin Bouniot,Romaric Audigier,Anglique Loesch,Amaury Habrard 作者单位:Universit Paris-Saclay; Universit Jean Monnet Saint-Etienne; Universitaire de France (IUF) 论文链接:http://arxiv.org/abs/2310.16835v1 内容…

JAVA深化篇_25—— IO流章节全网最全总结(附详细思维导图)

IO流章节全网最全总结(附详细思维导图) 本篇开始,先奉上思维导图:(下载下来为超高清图,不愁小伙伴看不清!) 按流的方向分类: 输入流:数据源到程序(InputStr…