史诗级烟雾特效(修复版)
🎯 提示词
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. 改进的噪声函数
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. 双模式变形
顶点着色器中的两种烟雾模式。
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. 彩虹渐变颜色
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. 闪烁效果
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 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!