🔢 数字矩阵效果
🎯 提示词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
使用 Three.js 实现【数字矩阵效果】,具体要求:
【核心特效】
- 数字字符随机生成
- 数字雨垂直下落动画
- 发光效果增强视觉冲击
- 深度渐变效果
【场景与光照】
- 黑色背景突出矩阵效果
- 无额外光源(自发光)
【交互与控制】
- OrbitControls 轨道控制器
- GUI 面板调整颜色、速度、密度、发光强度
- GSAP 旋转动画
【技术要求】
- Three.js r150+
- ShaderMaterial 自定义着色器
- GSAP 动画库
📖 效果拆解
| 层次 |
视觉效果 |
技术实现 |
| 基础 |
立方体几何体 |
BoxGeometry(4, 4, 4) |
| 核心特效 |
数字字符生成 |
伪随机函数 + step 函数 |
| 增强细节 |
数字雨动画 |
多层正弦函数叠加 |
| 视觉效果 |
发光效果 |
smoothstep + 指数函数 |
| 交互 |
参数调整 |
GUI 控制 uniform 变量 |
🔧 核心技术点
1. 伪随机数生成
基于坐标的确定性随机函数:
float random(vec2 p) {
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
}
为什么这样写:使用经典的 Hash 函数,通过正弦和点积生成可重复的伪随机数。
2. 字符生成
根据网格位置生成随机字符:
float char(vec2 uv, float seed) {
vec2 grid = floor(uv * charDensity);
float charValue = random(grid + seed);
return step(0.9, charValue);
}
为什么这样写:只保留随机值大于 0.9 的位置作为字符,控制字符密度。
3. 数字雨效果
多层雨滴叠加创造深度感:
float matrixRain(vec2 uv, float time) {
float rain = 0.0;
for (int i = 0; i < 3; i++) {
float layer = float(i) * 0.3;
float speed = rainSpeed * (1.0 + layer * 0.5);
float yOffset = fract(uv.y + time * speed + layer);
float head = smoothstep(0.0, 0.1, yOffset) * smoothstep(0.2, 0.1, yOffset);
float tail = smoothstep(0.0, 0.3, yOffset) * (1.0 - smoothstep(0.5, 0.8, yOffset));
rain += (head + tail * 0.3) * (1.0 - layer * 0.5);
}
return rain;
}
为什么这样写:
- 三层雨滴叠加,每层速度和透明度不同
- 头部使用两个 smoothstep 创建尖锐的前沿
- 尾部逐渐衰减,模拟拖尾效果
4. GSAP 旋转动画
外部动画库控制几何体旋转:
gsap.to(_primitive.rotation, {
x: Math.PI * 2,
y: Math.PI * 2,
duration: 15,
repeat: -1,
ease: "none"
});
为什么这样写:GSAP 提供流畅的动画控制,ease: "none" 确保匀速旋转。
💡 调试与优化
| 问题类型 |
表现形式 |
解决方案 |
| 字符过于密集 |
画面杂乱 |
增大 charDensity 值或降低 threshold |
| 雨滴不明显 |
下落效果弱 |
增大 rainSpeed 值 |
| 发光过强 |
画面刺眼 |
降低 glowIntensity 值 |
| 性能问题 |
帧率下降 |
减少迭代次数或降低几何体分段数 |
🚀 扩展思路
| 变体效果 |
核心改动 |
难度 |
| 中文汉字 |
修改字符生成逻辑,使用汉字纹理 |
⭐⭐⭐ |
| 颜色变化 |
添加时间控制的颜色渐变 |
⭐⭐ |
| 交互响应 |
添加鼠标位置影响雨滴方向 |
⭐⭐ |
| 3D矩阵 |
将效果应用到3D空间 |
⭐⭐⭐ |
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!