【Three.js入门】纹理加载进度、环境贴图、经纬线映射贴图与高动态范围成像HDR

简介: 【Three.js入门】纹理加载进度、环境贴图、经纬线映射贴图与高动态范围成像HDR

https://www.bilibili.com/video/BV1hD4y1h7pi?t=1.8

【使用 Three.js 实现的效果】

一、设置纹理加载进度

1、加载单张纹理

设置 onLoad(),onProgress(),onError(),并在纹理加载器中添加进来

......
let event = {}
// 单张纹理图的加载
event.onLoad = function() {
    console.log('图片加载完成')
}
// 加载进度
event.onProgress = function(e) {
    console.log('图片加载进度', e)
}
// 加载错误
event.onError = function(e) {
    console.log('图片加载出错', e)
}
......
// 纹理加载器 添加纹理图片
const doorColorTexture = textureLoader.load('./textures/color.jpg', event.onLoad, event.onProgress, event.onError)

6540d98a72be41e89c6c52dbfb85a347.png

2、加载多张纹理

LoadingManager():处理并跟踪已加载和待处理的数据。如果未手动设置加强管理器,则会为加载器创建和使用默认全局实例加载器管理器。

设置纹理加载器,把纹理加载器作为 new THREE.TextureLoader() 的参数

// 设置 div 用来显示进度
let div = document.createElement("div")
div.style.width = "200px"
div.style.height = "200px"
div.style.position = "fixed"
div.style.right = "0"
div.style.top = "0"
div.style.color = "#fff"
document.body.appendChild(div)
// 纹理图的加载
event.onLoad = function(e) {
    console.log('图片加载完成')
}
// 加载进度
event.onProgress = function(url, num, total) {
    console.log('图片加载完成', url)
    console.log('图片加载进度', (num / total * 100).toFixed(2) + '%')
    console.log('图片总数', total)
    let value = (num / total * 100).toFixed(2) + '%'
    div.innerHTML = value
}
// 加载错误
event.onError = function(e) {
    console.log('图片加载出错', e)
}
// 设置加载管理器
const loadingManager = new THREE.LoadingManager(
   event.onLoad,
   event.onProgress,
   event.onError 
)
// 导入纹理(参数为加载管理器,可以为所有的纹理加载)
const textureLoader = new THREE.TextureLoader(loadingManager)

image.png

二、环境贴图

环境贴图 (Environment Mapping) 又叫反射贴图 (Reflection Mapping)

在曲面上对反射效果进行很好的的近似。

f2ded55c147e4296ad17576e1b810153.png

下面我们来进行环境贴图,把图片贴到球体上,注意:px:x轴正向,nx:x轴负向,以此类推…

// 设置 cube 纹理加载器
const cubeTextureLoader = new THREE.CubeTextureLoader()
// 导入环境图(px:x轴正向,nx:x轴负向...)
const envMapTexture = cubeTextureLoader.load([
    'textures/environmentMaps/1/px.jpg',
    'textures/environmentMaps/1/nx.jpg',
    'textures/environmentMaps/1/py.jpg',
    'textures/environmentMaps/1/ny.jpg',
    'textures/environmentMaps/1/pz.jpg',
    'textures/environmentMaps/1/nz.jpg',
])
// 创建一个球
const sphereGeometry = new THREE.SphereBufferGeometry(1, 20, 20)
// 设置材质
const material = new THREE.MeshStandardMaterial({
    // 金属度
    metalness: 0.9,
    // 粗糙度
    roughness: 0.1,
    // 设置环境贴图
    envMap: envMapTexture
})
// 结合实体和材质
const sphere = new THREE.Mesh(sphereGeometry, material)
// 添加到场景中
scene.add(sphere)
// 环境光:均匀的照亮场景中的所有物体
const light = new THREE.AmbientLight(0xffffff, 0.9)
scene.add(light)
// 平行光:方向从一个平行光位置 position 到 target 位置
const directionLight = new THREE.DirectionalLight(0xffffff, 0.95)
// 设置光的位置
directionLight.position.set(10, 10, 10)
scene.add(directionLight)

不同角度的效果不一样,详细如下所示:

2a9f088205614f9db3a1830065988f62.png

ecf105744f584999b6eace1cccbad040.png

渲染周围的环境,把 xyz 正负轴的图片显示出来

// 给场景添加背景
scene.background = envMapTexture
// 给场景所有的物体添加默认的环境贴图
scene.environment = envMapTexture

不同角度的成像效果如下:

image.png

image.png三、经纬线映射贴图与HDR

高动态范围成像(英语:High Dynamic Range Imaging,简称HDRI或HDR),在计算机图形学与电影摄影术中,是用来实现比普通数位图像技术更大曝光动态范围(即更大的明暗差别)的一组技术。高动态范围成像的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度。


DataTextureLoader 用于加载二进制文件格式的(rgbe,hdr,…)抽象类。内部使用 FileLoader 来加载文件,和创建一个新的 DataTexture


mapping 图像将如何应用到物体(对象)上。


下面我们来加载 HDR 环境图(类似于一张全景图,但并不一定是全景图)

d44ccc9f0b9b4ca0a3946ef95c64e180.png

// 导入 RGBE 加载器
import {RGBELoader} from 'three/examples/jsm/loaders/RGBELoader'
// 创建加载器实例
const rgbeLoader = new RGBELoader()
// 异步加载
rgbeLoader.loadAsync("textures/hdr/002.hdr").then((texture) => {
    // 等距圆柱投影的环境贴图,也被叫做经纬线映射贴图
    texture.mapping = THREE.EquirectangularReflectionMapping
    // 设置背景图
    scene.background = texture
    // 设置默认环境
    scene.environment = texture
})
......

不同角度的成像效果如下:

e17dc238e2c0487ba3d2c11f5625c01c.png

818c6bb6d2e3466fa83ea085c22b9c55.png

45fc82a82c6542bdb2ff4986377d8db3.png

相关文章
|
2月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
563 2
|
1月前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
19天前
|
机器学习/深度学习 JavaScript Cloud Native
Node.js作为一种快速、可扩展的服务器端运行时环境
Node.js作为一种快速、可扩展的服务器端运行时环境
31 8
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
114 1
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
41 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
1月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
87 10
|
1月前
|
Web App开发 JavaScript 前端开发
探索Deno:新一代JavaScript/TypeScript运行时环境
【10月更文挑战第25天】Deno 是一个新兴的 JavaScript/TypeScript 运行时环境,由 Node.js 创始人 Ryan Dahl 发起。本文介绍了 Deno 的核心特性,如安全性、现代化、性能和 TypeScript 支持,以及开发技巧和实用工具。Deno 通过解决 Node.js 的设计问题,提供了更好的开发体验,未来有望进一步集成 WebAssembly,拓展其生态系统。
|
1月前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
2月前
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战
|
2月前
|
自然语言处理 JavaScript 前端开发
JavaScript高级——ES6基础入门
JavaScript高级——ES6基础入门
31 1