史诗级烟雾特效(修复版)

🎯 提示词

PROMPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
使用 Three.js 实现史诗级烟雾特效,具体要求:

【核心特效】
- 多层噪声叠加
- 爆炸/漩涡双模式
- 发光与闪烁效果

【场景与光照】
- 深蓝色渐变背景
- 环境光 + 点光源
- 添加混合模式

【交互与控制】
- OrbitControls 视角控制
- GUI 参数调节面板
- 点击切换效果模式

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

📖 效果拆解

层次 视觉效果 技术实现
基础 平面几何体 PlaneGeometry(4, 4, 64, 64)
核心特效 动态烟雾纹理 多层噪声叠加
增强细节 发光 + 闪烁 pow + 正弦波动
交互层 GUI 参数调节 + 点击切换 lil-gui + 事件监听

🔧 核心技术点

1. 改进的噪声函数

GLSL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float improvedNoise(vec2 p) {
  vec2 i = floor(p);
  vec2 f = fract(p);
  
  float a = noise(i);
  float b = noise(i + vec2(1.0, 0.0));
  float c = noise(i + vec2(0.0, 1.0));
  float d = noise(i + vec2(1.0, 1.0));
  
  vec2 u = f * f * (3.0 - 2.0 * f);
  
  return mix(a, b, u.x) + 
         (c - a) * u.y * (1.0 - u.x) + 
         (d - b) * u.x * u.y;
}

2. 双模式变形

顶点着色器中的两种烟雾模式。

GLSL
1
2
3
4
5
6
7
8
9
10
11
12
if(uEffectType < 0.5) {
  // 爆炸式烟雾
  newPosition.z += vNoise * 1.0 + vPulse * 0.5;
  newPosition.x += sin(uTime * 3.0 + position.y * 2.0) * 0.3;
  newPosition.y += cos(uTime * 2.0 + position.x * 2.0) * 0.3;
} else {
  // 漩涡式烟雾
  float angle = uTime * 2.0 + length(position.xy) * 3.0;
  newPosition.z += vNoise * 0.8;
  newPosition.x += cos(angle) * 0.4;
  newPosition.y += sin(angle) * 0.4;
}

3. 彩虹渐变颜色

GLSL
1
2
3
4
float colorMix = sin(uTime * 1.5 + vPosition.y * 2.0) * 0.5 + 0.5;
vec3 colorA = mix(uColor1, uColor2, colorMix);
vec3 colorB = mix(colorA, uColor3, vNoise);
finalColor = colorB;

4. 闪烁效果

GLSL
1
2
3
4
float sparkle = sin(vPosition.x * 20.0 + uTime * 10.0) * 
               sin(vPosition.y * 15.0 + uTime * 8.0);
sparkle = max(0.0, sparkle) * uSparkle;
finalColor += vec3(sparkle);

💡 调试与优化

问题类型 表现形式 解决方案
着色器编译失败 黑屏或报错 检查 GLSL 语法
性能问题 帧率下降 降低噪声迭代次数或细分
烟雾效果不明显 颜色太淡 调整发光强度和密度参数
模式切换失效 点击无响应 检查事件监听绑定

🚀 扩展思路

变体效果 核心改动 难度
火焰烟雾混合 添加火焰颜色渐变 ⭐⭐
3D 烟雾体积 使用粒子系统 ⭐⭐⭐
风向模拟 添加风场影响 ⭐⭐
碰撞交互 鼠标交互影响烟雾 ⭐⭐⭐

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