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
24
使用 Three.js 实现可定制颜色的罗盘特效,具体要求:
**核心特效**
- 多层圆环结构
- 辐射状刻度线
- 旋转动画效果
- 三色实时切换
- 动态颜色混合
**场景与光照**
- 自定义深色背景
- PlaneGeometry 全屏
- 2D GLSL 绘制
**交互与控制**
- 颜色选择器面板
- 主色调/次级色调/强调色
- 背景色实时切换
**技术要求**
- Three.js 版本 (ES Module)
- 自定义 ShaderMaterial
- PlaneGeometry 1x1
- 2D 几何绘制算法
📖 效果拆解
| 层次 |
视觉效果 |
技术实现 |
| 基础 |
罗盘圆盘 |
1x1 PlaneGeometry |
| 外环 |
36 辐射刻度 |
radiation() 函数 |
| 六边形 |
旋转叠加 |
rectangle() 函数 |
| 小圆点 |
12 等分 |
circle() 函数 |
| 内环 |
3 角形图案 |
重复旋转 |
🔧 核心技术点
1. 圆环绘制
为什么需要这个技术:用距离函数创造清晰的圆环。
float circle(float pre, vec2 p, float r1, float r2, float power) {
float len = length(p);
float d = min(abs(len - r1), abs(len - r2));
if (len > r1 && len < r2) pre /= exp(d) / r2;
float res = power / d;
return clamp(pre + res, 0.0, 1.0);
}
2. 矩形环绘制
为什么需要这个技术:创造六边形、三角形等多边形结构。
float rectangle(float pre, vec2 p, vec2 half1, vec2 half2, float power) {
p = abs(p);
float dx1 = (p.y < half1.y) ? abs(half1.x - p.x) : length(p - half1);
float dx2 = (p.y < half2.y) ? abs(half2.x - p.x) : length(p - half2);
float dy1 = (p.x < half1.x) ? abs(half1.y - p.y) : length(p - half1);
float dy2 = (p.x < half2.x) ? abs(half2.y - p.y) : length(p - half2);
float d = min(min(dx1, dx2), min(dy1, dy2));
float res = power / d;
return clamp(pre + res, 0.0, 1.0);
}
3. 辐射状图案
为什么需要这个技术:创造罗盘刻度的辐射线效果。
float radiation(float pre, vec2 p, float r1, float r2, int num, float power) {
float angle = 2.0 * PI / float(num);
float d = 1e10;
for (int i = 0; i < 360; i++) {
if (i >= num) break;
float _d = (r1 < p.y && p.y < r2) ? abs(p.x) : min(length(p - vec2(0.0, r1)), length(p - vec2(0.0, r2)));
d = min(d, _d);
p = rotate(p, angle);
}
float res = power / d;
return clamp(pre + res, 0.0, 1.0);
}
4. 2D 旋转矩阵
为什么需要这个技术:实现几何图形的旋转。
vec2 rotate(vec2 p, float rad) {
float c = cos(rad), s = sin(rad);
return mat2(c, -s, s, c) * p;
}
💡 调试与优化
| 问题类型 |
表现形式 |
解决方案 |
| 线条过粗 |
细节糊掉 |
减小 power 参数 |
| 颜色过暗 |
不够明亮 |
增大 pow(dst, 2.5) 指数 |
| 旋转抖动 |
不平滑 |
增加动画帧率 |
🚀 扩展思路
| 变体效果 |
核心改动 |
难度 |
| 指南针 |
添加指针 |
⭐ |
| 时钟 |
12 刻度 |
⭐ |
| 雷达扫描 |
扫描动画 |
⭐⭐ |
| 仪表盘 |
添加数字 |
⭐⭐ |
| 导航罗盘 |
动态指向 |
⭐⭐⭐ |
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!