Three.js 可定制罗盘特效

🎯 提示词

PROMPT
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. 圆环绘制

为什么需要这个技术:用距离函数创造清晰的圆环。

GLSL
1
2
3
4
5
6
7
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. 矩形环绘制

为什么需要这个技术:创造六边形、三角形等多边形结构。

GLSL
1
2
3
4
5
6
7
8
9
10
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. 辐射状图案

为什么需要这个技术:创造罗盘刻度的辐射线效果。

GLSL
1
2
3
4
5
6
7
8
9
10
11
12
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 旋转矩阵

为什么需要这个技术:实现几何图形的旋转。

GLSL
1
2
3
4
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 编辑整理,如需转载,请注明出处。