彩虹圆环动画
🎯 提示词
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用 Three.js 实现【彩虹圆环动画】,具体要求:
【核心特效】
- 极坐标转换实现环形效果
- 动态颜色渐变动画
- 多层圆环叠加效果
【场景与光照】
- 透明背景
- 无光源(纯着色器效果)
- 平面几何体
【交互与控制】
- OrbitControls 视角控制
- 自动播放动画
【技术要求】
- Three.js 版本
- 自定义 ShaderMaterial
📖 效果拆解
| 层次 |
视觉效果 |
技术实现 |
| 基础 |
平面几何体 |
PlaneGeometry |
| 核心特效 |
极坐标转换 |
atan + length |
| 增强细节 |
彩虹颜色渐变 |
分段颜色混合 |
| 动画效果 |
圆环扫描动画 |
时间驱动的颜色偏移 |
🔧 核心技术点
1. 极坐标转换
将笛卡尔坐标转换为极坐标:
void main() {
vec2 p = (vUv - 0.5) * 2.0;
float tau = PI * 2.0;
float a = atan(p.x, p.y);
float r = length(p) * 0.75;
vec2 uv = vec2(a / tau, r);
}
2. 彩虹颜色生成
基于角度生成彩虹色:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
float xCol = (uv.x - (iTime / 3.0)) * 3.0;
xCol = mod(xCol, 3.0);
vec3 horColour = vec3(0.25, 0.25, 0.25);
if (xCol < 1.0) {
horColour.r += 1.0 - xCol;
horColour.g += xCol;
} else if (xCol < 2.0) {
xCol -= 1.0;
horColour.g += 1.0 - xCol;
horColour.b += xCol;
} else {
xCol -= 2.0;
horColour.b += 1.0 - xCol;
horColour.r += xCol;
}
3. 环形光束绘制
创建动态环形光束效果:
uv = (2.0 * uv) - 1.0;
float beamWidth = (0.7 + 0.5 * cos(uv.x * 10.0 * tau * 0.15 *
clamp(floor(5.0 + 10.0 * cos(iTime)), 0.0, 10.0))) * abs(1.0 / (30.0 * uv.y));
vec3 horBeam = vec3(beamWidth);
gl_FragColor = vec4(((horBeam) * horColour), 1.0);
💡 调试与优化
| 问题类型 |
表现形式 |
解决方案 |
| 着色器报错 |
变量未定义 |
检查 PI 常量定义 |
| 颜色异常 |
颜色过渡不自然 |
调整颜色混合逻辑 |
| 性能问题 |
帧率下降 |
减少计算复杂度 |
| 圆环变形 |
边缘锯齿 |
增加几何体细分 |
🚀 扩展思路
| 变体效果 |
核心改动 |
难度 |
| 多层圆环 |
添加多个环形图层 |
⭐ |
| 交互控制 |
鼠标控制圆环大小 |
⭐⭐ |
| 颜色循环 |
添加颜色主题切换 |
⭐ |
| 发光效果 |
添加 bloom 后期处理 |
⭐⭐⭐ |
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!