【Three.js入门】标准网格材质、置换贴图、粗糙度贴图、金属贴图、法线贴图

news/2024/12/28 15:53:50/

个人简介

👀个人主页: 前端杂货铺
🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端
📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招)
🚀未来打算: 为中国的工业软件事业效力n年
🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2&Vue3项目实战 🥝Node.js 🍒Three.js
🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享&商务合作,快加入进来吧

Three.js 系列文章目录

Three.js 专栏参考链接
Three.js 入门案例程序人生——与足球共舞的火柴人
Three.js 入门(一)创建第一个场景和物体(轨道控制器、坐标轴辅助器…)
Three.js 入门(二)处理动画、尺寸自适应、双击进入/退出全屏
Three.js 入门(三)图形用户界面GUI、BufferGeometry创建矩形、随机生成三角形
Three.js 入门(四)纹理及其常用属性、透明纹理、环境遮挡贴图与强度

文章目录

  • Three.js 系列文章目录
    • 一、标准网格材质与光照物理效果
    • 二、置换贴图和顶点细分设置
    • 三、粗糙度与粗糙度贴图
      • 1、粗糙度
      • 2、粗糙度贴图
    • 四、金属度与金属贴图
    • 五、法线贴图
    • 六、写在最后(附源码和图片资源)


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

一、标准网格材质与光照物理效果

PBR 相关概念详解

MeshStandardMaterial:一种基于物理的(PBR)标准材质。

不是在特定照明下调整材质使其看起来很好,而是可以创建一种材质,能够正确的地应对所有光照场景。

修改基础材质为标准网格材质

const basicMaterial = new THREE.MeshBasicMaterial()
// 修改上一行代码为下一行代码,基础材质 ——> 标准网格材质
const material = new THREE.MeshStandardMaterial()

在这里插入图片描述


环境光:均匀的照亮场景中的所有物体。

接下来,我们来给物体添加环境光

// 第一个参数是颜色,第二个参数是明亮程度(0-1)
const light = new THREE.AmbientLight(0xffffff, 0.9)
// 向场景中添加环境光
scene.add(light)

在这里插入图片描述


平行光:方向从一个平行光位置 position 到 target 位置

接下来,我们来给物体在环境光的基础上添加平行光

const directionLight = new THREE.DirectionalLight(0xffffff, 0.95)
// 设置光的位置
directionLight.position.set(0, 10, 10)
// 向场景中添加平行光
scene.add(directionLight)

在这里插入图片描述

二、置换贴图和顶点细分设置

.displacementMap 位移贴图会影响网格顶点的位置,与仅影响材质的光照和阴影的其他贴图不同,移位的顶点可以投射阴影,阻挡其他对象,以及充当真实的几何体。

.displacementScale 位移贴图对网格的影响程度(黑色是无位移,白色是最大位移)

接下来我们来给平面置换贴图,来增强其立体感

在这里插入图片描述

// 导入置换贴图
const doorHeightTexture = textureLoader.load('./textures/height.jpg')
......
// 材质(给材质添加置换贴图和影响程度)
const material = new THREE.MeshStandardMaterial({// map 为颜色贴图map: doorColorTexture,// alphaMap 为透明纹理alphaMap: doorAplhaTexure,// 透明transparent: true,// 渲染两面side: THREE.DoubleSide,// 增强视图效果aoMap: doorAoTexture,// 置换贴图displacementMap: doorHeightTexture,// 影响程度(5cm)displacementScale: 0.05
})
......
// 添加第三和第四个参数(平面的宽度分段数,平面高度分段数)
const planeGeometry = new THREE.PlaneBufferGeometry(1, 1, 200, 200)
......
// 稍微更改一下距离,更合适
plane.position.set(1.5, 0, 0)

在这里插入图片描述
在这里插入图片描述


接下来我们来给物体 cube 置换贴图,来增强其立体感

// 我们只需要给物体增加三个参数即可(长宽高的宽度分段数)
const cubeGeometry =  new THREE.BoxBufferGeometry(1, 1, 1, 100, 100, 100)

在这里插入图片描述


三、粗糙度与粗糙度贴图

1、粗糙度

.roughness 材质的粗糙程度。0.0 表示平滑的镜面反射,1.0 表示完全漫反射。默认值为 1.0。如果还提供 roughnessMap,则两个值相乘。

.roughnessMap 该纹理的绿色通道用于改变材质的粗糙度。

设置粗糙度,通过反射间接地观察面的光滑程度

const material = new THREE.MeshStandardMaterial({......// 设置粗糙度roughness: 0
})

在这里插入图片描述


2、粗糙度贴图

粗糙度贴图,改变门上合页的粗糙度

在这里插入图片描述

// 导入粗糙度贴图
const roughnessTexture = textureLoader.load('./textures/roughness.jpg')
......
const material = new THREE.MeshStandardMaterial({......// 设置粗糙度roughness: 1,// 改变材质的粗糙度roughnessMap: roughnessTexture
})

在这里插入图片描述

在这里插入图片描述


四、金属度与金属贴图

.metalness 材质与金属的相似度。非金属材质,如木材或石材,使用 0.0,金属使用 1.0。通常没有中间值。默认是 0.0。

0.0 - 1.0 之间的值可用于生锈金属的外观。

.metalnessMap 该纹理的蓝色通道用于改变材质的金属度。

我们给门上的合页添加金属贴图,让它更有金属的感觉

在这里插入图片描述

// 导入金属贴图
const metalnessTexture = textureLoader.load('./textures/metalness.jpg')
......
const material = new THREE.MeshStandardMaterial({......// 设置金属度metalness: 1,// 改变金属度(生锈的感觉)metalnessMap: metalnessTexture
})

在这里插入图片描述


五、法线贴图

法线贴图就是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。

对于视觉效果而言,它的效率比原有的凹凸表面更高,若在特定位置上应用光源,可以让细节程度较低的表面生成高细节程度的精确光照方向和反射效果。

设置法线贴图,让门的凸显门的凹凸感,立体感更加逼真

下图中每种颜色的线条都是向外扩散的

在这里插入图片描述

// 导入法线贴图
const normalTexture = textureLoader.load('./textures/normal.jpg')
......
const material = new THREE.MeshStandardMaterial({......// 法线贴图normalMap: normalTexture
})

在这里插入图片描述


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

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

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


在这里插入图片描述



http://www.ppmy.cn/news/6023.html

相关文章

503.下一个更大元素II,42. 接雨水

503. 下一个更大元素 II 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数…

C语言--操作符

文章目录一、数据的存储二、算术操作符三、移位操作符左移位操作符<<右移操作符四、位操作符五、赋值操作符六、单目操作符sizeof前后置七、关系操作符一、数据的存储 如果想要准确的掌握每个操作符的作用&#xff0c;那么首先需要理解数据在计算机中的存储和运算规则。…

JMeter+Ant+Jenkins接口自动化测试框架

一:简介 大致思路&#xff1a;Jmeter可以做接口测试&#xff0c;也能做压力测试&#xff0c;而且是开源软件&#xff1b;Ant是基于Java的构建工具&#xff0c;完成脚本执行并收集结果生成报告&#xff0c;可以跨平台&#xff0c;Jenkins是持续集成工具。将这三者结合起来可以搭…

扫雷游戏的设计(百分百还原电脑操作)

目录 &#x1f332;了解扫雷游戏的作用原理并梳理思路 &#x1f332;扫雷游戏前期部分完善 &#x1f337;文件的创建 &#x1f337;创建菜单&#xff0c;完善主函数 &#x1f333;代码呈现&#xff1a; &#x1f332;扫雷游戏主题内容 &#x1f334;第一步初始化棋盘 &#x1…

蓝牙耳机什么牌子好?音质好、配置高的蓝牙耳机分享

​经常听到很多网友在讨论哪些蓝牙耳机好用&#xff0c;什么蓝牙耳机的配置高......选购蓝牙耳机无非就是音质、蓝牙技术、续航、佩戴体验等各方面条件&#xff0c;还有哪位朋友不知道该如何选购蓝牙耳机的&#xff1f;根据我对蓝牙耳机的了解&#xff0c;从网上整理了好几款蓝…

5.Linux文件管理命令---cp复制文件

文章目录Linux文件管理命令cp&#xff1a;复制文件示例介绍&#xff1a;Linux文件管理命令 cp&#xff1a;复制文件 作用&#xff1a;文件或目录的复制。 用法&#xff1a;cp [选项]… [-T] 源文件 目标文件 cp [选项]… 源文件… 目录 cp [选项]… -t 目录 源文件… 将<源…

熬不过“冬天”,又一跨境电商平台关停

熬不过“冬天”&#xff01;又一跨境电商平台关停据相关媒体报道&#xff0c;京东旗下跨境电商服务平台Joybuy于2022年11月4日宣布将进行“业务升级”&#xff0c;而后该平台的所有交易活动已经停止。据Egain News报道&#xff0c;“业务升级”的说法很大可能只是关停的一种“委…

MySQL数据库的安装、创建库、创建表、创建测试数据及连接取数

安装MySQL数据库MySQL数据库简介安装MySQL数据库下载安装包安装MySQLMySQL创建一个新的数据库&#xff0c;并在其中创建新的数据表&#xff0c;填充测试数据并查看mysql>模式下输入的每句sql语句都要以;结尾&#xff1b;若多行语句无;&#xff0c;则被默认为一条语句未输入完…