Three.js Day 4:材质初探(上)——Basic、Normal、Matcap、Depth 一口气认识四种

Day 1-3 搭好了舞台、相机、纹理。今天开始讲材质------物体的"皮肤质感"。

材质分两大类:不需要灯光需要灯光。本篇是(上),先讲前者:

  1. MeshBasicMaterial------纯色平面,最基础
  2. MeshNormalMaterial------彩色法向,调试神器
  3. MeshMatcapMaterial------假光照,真质感
  4. MeshDepthMaterial------根据深度渐变,黑白艺术

读完(上),你能根据需求选择基础材质;下一篇(下)讲 MeshStandardMaterial + 光照,让物体真正"亮"起来。

四种材质的核心讲解

1. MeshBasicMaterial------基础款

一句话:纯色,不受光照影响,最省资源。

javascript

ini 复制代码
//引入纹理
const doorClorTexture= textureLoader.load('/textures/door/door.jpg');

//使用纹理的样子
const material = new THREE.MeshBasicMaterial()
material.map = doorClorTexture

//使用纯色
material.color = new THREE.Color(0xffffff)

比喻:白纸一张,你涂什么颜色就是什么颜色,不管屋里灯开没开。

以下是使用纹理和颜色填充的对比效果

可以看到没有任何的光源,我使用了木门的纹理和白色纯色填充。

2. MeshNormalMaterial------炫彩款

一句话解释:根据物体表面的朝向,自动显示不同的颜色。

生活比喻:炫彩包装纸

还记得小时候那种"炫彩卡片"吗?------你换个角度,颜色就变了。

MeshNormalMaterial 就是这种"炫彩纸":

  • 立方体朝右的面 → 红色
  • 朝上的面 → 绿色
  • 朝前的面 → 蓝色

旋转立方体时,颜色随着面的朝向实时变化,就像手里的炫彩卡片在阳光下翻转。

const material = new THREE.MeshNormalMaterial()

代码非常简单,只需要创建MeshNormalMateria,就可以得到非常炫酷的效果,有一点赛博朋克感。

3. MeshMatcapMaterial------高级假货

一句话:用一张"预设贴图"模拟光照效果,不需要真光源,但质感很棒。

`// MeshMatcapMaterial

const material = new THREE.MeshMatcapMaterial()

material.matcap = matcapTexture`

就很像我们自拍时使用美颜相机或者有滤镜效果时,实际上没有真的打光但是看起来皮肤变得有光泽了。

这个看起来非常的棒,通过模拟的光照可以直接带来非常不错的的质感。

4.MeshDepthMaterial------黑白艺术

一句话解释:

根据物体离相机的远近,显示从白到黑的渐变------越近越白,越远越黑。

生活比喻:雾中行走

想象你在一个大雾天里走路:

  • 离你近的物体 → 看得清楚(白色)
  • 离你远的物体 → 渐渐被雾淹没(灰色)
  • 远到看不见 → 完全消失在雾中(黑色)

MeshDepthMaterial 就是这个"雾"------用黑白灰度告诉你:每个点离相机有多远

`// MeshDepthMaterial

const material = new THREE.MeshDepthMaterial()`

创建深度材质就可以得到效果:

四种材质对比一览表

材质 颜色规律 是否需要贴图 是否需要灯光 一句话记忆 最佳用途
MeshBasicMaterial 你指定什么颜色就是什么颜色 可选 ❌ 不需要 白纸一张 基础场景、性能优先
MeshNormalMaterial RGB = XYZ(红X/绿Y/蓝Z) ❌ 不需要 ❌ 不需要 炫彩包装纸 调试几何体、赛博朋克风
MeshMatcapMaterial 贴图上的颜色(模拟光照) ✅ 必须 ❌ 不需要 假光照滤镜 想要质感但不想加灯光
MeshDepthMaterial 越近越白,越远越黑 ❌ 不需要 ❌ 不需要 雾中行走 深度特效、后期处理

四种材质,四种性格------不需要灯光,也能玩出花样。

下一篇(下)预告:MeshStandardMaterial + 环境光 + 点光源,让你的物体从"平面色块"变成"真实世界的物体"。

📚本文学习自 Three.js Journey(Bruno Simon 的付费课程),代码为个人练习所写,概念讲解融入了个人的理解和比喻。

相关推荐
穗余34 分钟前
Typescript let和var区别
前端·javascript·typescript
晓得迷路了40 分钟前
栗子前端技术周刊第 144 期 - Rspack 2.2、pnpm 12、Solid 2.0 RC...
前端·javascript·css
奈斯先生Vector1 小时前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc
এ慕ོ冬℘゜3 小时前
前端实战:jQuery实现动态表格渲染与状态切换功能
前端·javascript·jquery
zzzzzz3103 小时前
react-bits:把酷炫动效从“灵感截图”变成可复用的 React 组件
javascript·react.js·动效
海兰10 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
小磊哥er12 小时前
深入解构Claude Code - 第 7 篇 · 连接外面的世界
javascript·ai编程
小磊哥er12 小时前
深入解构Claude Code - 第 6 篇 · 终端里的图形界面
javascript·ai编程
海兰12 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(一)
javascript·python·金融
可乐鸡翅yeah_14 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线