【Three.js入门】纹理及其常用属性、透明纹理、环境遮挡贴图与强度

简介: 【Three.js入门】纹理及其常用属性、透明纹理、环境遮挡贴图与强度

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

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

一、纹理和材质

纹理:简单来说就是给我们创建好的实体填上一层好看的皮囊。

首先我们要导入纹理 THREE.TextureLoader()

之后我们给纹理附上我们想要的图片(纹理图片很容易百度到)

我们来创建物体 new THREE.BoxBufferGeometry()

导入材质,给 map 赋值为我们的纹理 (map —> 颜色贴图)

之后结合我们的物体和材质,添加到场景中即可

关键代码:

// 导入纹理
const textureLoader = new THREE.TextureLoader()
// 纹理加载器 添加纹理图片
const doorColorTexture = textureLoader.load('./textures/doors.png')
// 添加物体
const cubeGeometry =  new THREE.BoxBufferGeometry(1, 1, 1)
// 材质
const basicMaterial = new THREE.MeshBasicMaterial({
    // map 为颜色贴图
    map: doorColorTexture
})
// 结合物体和材质
const cube = new THREE.Mesh(cubeGeometry, basicMaterial)
// 场景中添加物体
scene.add(cube)

此处的纹理是这样的(随便百度到的):


a69305cf027a490c8c5e9deee7520ad9.png

渲染后的效果:

87f096c2068e4888a2258ba16c935497.png

二、纹理常用属性

1、偏移属性

.offset 偏移属性:即让纹理贴图在物体上做偏移

// 设置偏移(范围0-1)
doorColorTexture.offset.set(0.5, 0.5, 0)

f5030763b99e49f2bc39def74ea92a6d.png

2、旋转属性

.rotation 纹理将围绕中心点旋转多少度,单位为弧度(rad),正值为逆时针旋转,默认值问为 0

// 设置旋转 30°(以 Math.PI 180° 为基准)
doorColorTexture.rotation = Math.PI / 6

a0a0ec7a390e4084b7086446a991e780.png

3、旋转中心点

.center 旋转中心点 (0.5, 0.5) 对应纹理的中心,默认为 (0, 0)

// 设置旋转中心点 (0.5, 0.5) 对应纹理的中心,默认为 (0, 0)
doorColorTexture.center.set(0.5, 0.5)

d9237b927adf48b3ade2499081cd7ffd.png

4、纹理的重复

.repeat 让纹理在物体上重复

// 设置纹理的重复(x 轴方向重复2次,y 轴方向重复3次)
doorColorTexture.repeat.set(2, 3)
// 设置纹理重复的模式(重复到无穷大)
doorColorTexture.wrapS = THREE.MirroredRepeatWrapping
doorColorTexture.wrapT = THREE.RepeatWrapping

e57485c982cf47389b9d91323ded1289.png

三、透明纹理

1、添加透明纹理

.alphaMap: Texture

alpha 贴图是一张灰色纹理,用于控制整个表面的不透明度(黑色:完全透明;白色:完全不透明)。默认值为 null。

我们在一个面一个门的基础上,添加透明纹理,透明纹理图片如下:

42c20986d0834f128bc9559952c911d7.png

我们首先使用纹理加载器把透明纹理添加进来,之后再在基础材质中添加,注意还要设置透明属性

// 导入纹理
const textureLoader = new THREE.TextureLoader()
// 纹理加载器 添加纹理图片
const doorColorTexture = textureLoader.load('./textures/doors.png')
// 纹理加载器 添加透明纹理
const doorAplhaTexure = textureLoader.load('./textures/bwbk.png')
// 添加物体
const cubeGeometry =  new THREE.BoxBufferGeometry(1, 1, 1)
// 材质
const basicMaterial = new THREE.MeshBasicMaterial({
    // map 为颜色贴图
    map: doorColorTexture,
    // alphaMap 为透明纹理
    alphaMap: doorAplhaTexure,
    // 设置透明属性
    transparent: true
})
// 结合物体和材质
const cube = new THREE.Mesh(cubeGeometry, basicMaterial)
// 场景中添加物体
scene.add(cube)

1c4995f650fd4822a6c5b1cbc26ff516.png

2、添加平面(渲染前面)

我们在网格中添加一个二维平面,设置为基础材质。注意设置一定的距离。

// 添加平面
const plane = new THREE.Mesh(
    new THREE.PlaneBufferGeometry(1, 1),
    basicMaterial
)
// 设置一定的距离
plane.position.set(3, 0, 0)

fa43790323c3450ba776bd1cf772fddd.png

75f6d78afd32428abb26c6b849b3f3bb.png

3、平面两面 / 背面渲染

当我们想渲染两面或者只渲染背面的时候,我们只需要设置一个 side 属性即可

const basicMaterial = new THREE.MeshBasicMaterial({
    // map 为颜色贴图
    map: doorColorTexture,
    // alphaMap 为透明纹理
    alphaMap: doorAplhaTexure,
    transparent: true,
    // 渲染两面
    side: THREE.DoubleSide
    // 渲染背面
    // side: THREE.BackSide
})

a9e8bb1f5464436fa089ae10e2c677f6.png

8623ba3b10224814bb037868907692b4.png

四、环境遮挡贴图与强度

.aoMap 该纹理的红色通道用作环境遮挡贴图。默认值为 null。aoMap 需要第二组 UV。


【UV:纹理坐标通常具有U和V两个坐标轴,因此称之为UV坐标。U代表横向坐标上的分布、V代表纵向坐标上的分布。】


在此我们做一个演示,即实现我们给下面第一张图片添加上第二张图片的观感强度,从而实现第三四张图片的效果(立体逼真感)


完整代码和图片资源可以通过下方方式加入进来自行获取:

e5086d16e32a4ab39511e5b7d2878c66.png

7c1ea5d7c4fe4c72b46c125bdfcf5907.png

21de88c38f494c759b6bbcd3270ad3ed.png

5bcd8a49e7624ea9bb6afa1f8853fbd6.png

10284b7883124036b30ff01e3a0acc3e.png

在这里,我们要使用 aoMap,注意此属性需要第二组 UV,所以我们需要使用自定义属性手动添加第二组 UV,参考代码如下:

// 导入纹理
const textureLoader = new THREE.TextureLoader()
// 纹理加载器 添加纹理图片
const doorColorTexture = textureLoader.load('./textures/doors.png')
// 纹理加载器 添加透明纹理
const doorAplhaTexure = textureLoader.load('./textures/bwbk.png')
// 纹理加载器 添加增强视觉效果的图片
const doorAoTexture = textureLoader.load('./textures/demo.png')
// 添加物体
const cubeGeometry =  new THREE.BoxBufferGeometry(1, 1, 1)
// 材质
const basicMaterial = new THREE.MeshBasicMaterial({
    // map 为颜色贴图
    map: doorColorTexture,
    // alphaMap 为透明纹理
    alphaMap: doorAplhaTexure,
    transparent: true,
    aoMap: doorAoTexture
})
// 结合物体和材质
const cube = new THREE.Mesh(cubeGeometry, basicMaterial)
// 场景中添加物体
scene.add(cube)
// 给 cube 添加第二组 UV
cubeGeometry.setAttribute('uv2', new THREE.BufferAttribute(cubeGeometry.attributes.uv.array, 2))
// 添加平面
const planeGeometry = new THREE.PlaneBufferGeometry(1, 1)
const plane = new THREE.Mesh(planeGeometry, basicMaterial)
// 自带一组 UV(Object-geometry-attributes-uv)
console.log(plane)
// 设置一定的距离
plane.position.set(3, 0, 0)
// 添加到场景中
scene.add(plane)
// 给平面设置第二组 UV
planeGeometry.setAttribute('uv2', new THREE.BufferAttribute(planeGeometry.attributes.uv.array, 2))

bbfcef355b4d4c31a896ab0cf953c57a.png

五、写在最后(附源码和图片资源)

这篇文章看完是不是又收获满满呢,接下来进行一下实操练习吧。

相关资源可以通过下面方式加入进来,自行获取。

45fc82a82c6542bdb2ff4986377d8db3.png


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