Three.js 音频频谱可视化特效
🎯 提示词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
使用 Three.js 实现音频频谱可视化特效,具体要求:
**核心特效**
- 64 频谱柱
- 镜像对称布局
- 颜色分段渐变
- 高度动态变化
**场景与光照**
- 正交相机
- 黑色背景
- BoxGeometry 条形
**交互与控制**
- 播放/暂停按钮
- 音频频谱分析
- 左右声道分离
**技术要求**
- Three.js 版本 (ES Module)
- Web Audio API
- AnalyserNode
- OrthographicCamera
📖 效果拆解
| 层次 |
视觉效果 |
技术实现 |
| 基础 |
64 频谱柱 |
BoxGeometry |
| 镜像 |
左右对称 |
索引计算 |
| 颜色 |
6 色彩虹 |
高度分段 |
| 音频 |
FFT 分析 |
getByteFrequencyData |
🔧 核心技术点
1. 音频频谱分析
为什么需要这个技术:用 Web Audio API 获取实时频谱数据。
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const analyser = audioCtx.createAnalyser();
analyser.fftSize = barCount * 2;
const dataArray = new Uint8Array(bufferLength);
function updateBars() {
analyser.getByteFrequencyData(dataArray);
const scale = dataArray[barCount - 1 - i] / 10;
bars[i].scale.y = Math.max(1, scale);
}
2. 正交相机布局
为什么需要这个技术:2D 风格的频谱可视化。
const camera = new OrthographicCamera(
-s, s, s * (h / w), -s * (h / w), 1, 10000
);
camera.position.set(0, 0, 100);
camera.up.set(0, 0, 1);
camera.lookAt(0, 0, 0);
3. 彩虹颜色渐变
为什么需要这个技术:根据高度从紫色渐变到红色。
uniform vec3 colors[6];
float segment = intensity * 5.0;
int index = int(segment);
float t = fract(segment);
vec3 col = mix(colors[index], colors[index + 1], t);
4. 镜像对称布局
为什么需要这个技术:左右两边完全对称的视觉效果。
const mirror = new Mesh(geometry, material.clone());
mirror.position.set(-offset, -12.5, 0);
bars.push(mirror);
💡 调试与优化
| 问题类型 |
表现形式 |
解决方案 |
| 频谱不动 |
音频未播放 |
点击播放按钮 |
| 性能问题 |
帧率低 |
减少 barCount |
| 颜色过暗 |
不够鲜艳 |
增大颜色值 |
🚀 扩展思路
| 变体效果 |
核心改动 |
难度 |
| 圆形频谱 |
环形布局 |
⭐⭐ |
| 3D 柱状 |
添加 z 轴 |
⭐ |
| 波形显示 |
时域数据 |
⭐ |
| 响应式 |
自适应大小 |
⭐ |
| 多音轨 |
多个音频 |
⭐⭐ |
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!