热力图效果

🎯 提示词

PROMPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用 Three.js 实现热力图效果,具体要求:

【核心特效】
- 多点热源叠加
- 颜色渐变映射
- 动态参数控制

【场景与光照】
- 白色环境光
- 透明背景
- 坐标轴辅助

【交互与控制】
- OrbitControls 视角控制
- GUI 参数调节面板

【技术要求】
- Three.js 最新版本
- lil-gui 控制面板

📖 效果拆解

层次 视觉效果 技术实现
基础 平面几何体 PlaneGeometry(10, 10)
核心特效 热力图渲染 点距离场叠加
增强细节 颜色渐变 三角函数颜色映射
交互层 GUI 参数调节 lil-gui

🔧 核心技术点

1. 热力点数据结构

JAVASCRIPT
1
2
3
4
5
6
const arr = [
  [0., 0., 10.], [.2, .6, 5.], [.25, .7, 8.],
  [.33, .9, 5.], [.35, .8, 6.], [0.017, 5.311, 6.000],
  [-.45, .8, 4.], [-.2, -.6, 5.], [-.25, -.7, 8.],
  // ... 更多点
].map(i => new THREE.Vector3(...i));

2. 热力值计算

GLSL
1
2
3
4
5
6
7
float d = 0.;
for (int i = 0; i < PointsCount; i++) {
    vec3 v = Points[i];
    float intensity = v.z / HEAT_MAX;
    float pd = (1. - length(uv - v.xy) / PointRadius) * intensity;
    d += pow(max(0., pd), 2.);
}

3. 颜色渐变映射

GLSL
1
2
3
4
vec3 gradient(float w, vec2 uv) {
    w = pow(clamp(w, 0., 1.) * 3.14159 * .5, .9);
    return vec3(sin(w), sin(w * 2.), cos(w)) * 1.1 + mix(c1, c2, w) * 1.1; 
}

4. 动态着色器生成

JAVASCRIPT
1
2
3
const fragmentShader = 'precision highp float;\n' + 'varying vec2 vUv; \n' +
    Object.keys(uniforms1).map(i => 'uniform ' + uniforms1[i].unit + ' ' + i + ';')
        .join('\n') + '\nuniform vec3 Points[' + uniforms1.PointsCount.value + '];';

💡 调试与优化

问题类型 表现形式 解决方案
着色器编译失败 黑屏或报错 检查 uniforms 定义
热力效果不明显 颜色太淡 调整强度和半径参数
性能问题 帧率下降 减少热力点数量
颜色异常 颜色混合错误 检查渐变函数

🚀 扩展思路

变体效果 核心改动 难度
动态热力点 添加动画更新 ⭐⭐
3D 热力图 使用体积渲染 ⭐⭐⭐
鼠标交互 点击添加热力点 ⭐⭐
数据可视化 加载外部数据 ⭐⭐⭐

本文档由 ThreeLab 编辑整理,如需转载,请注明出处。