流体动力学效果

🎯 提示词

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

【核心特效】
- 涡旋场模拟
- 流体密度计算
- 泡沫效果

【场景与光照】
- 纯黑色背景
- 自发光效果
- 无需传统光源

【交互与控制】
- OrbitControls 视角控制
- GUI 参数调节面板
- GSAP 自动旋转动画

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

📖 效果拆解

层次 视觉效果 技术实现
基础 球体几何体 SphereGeometry(2.5, 64, 64)
核心特效 流体流动纹理 涡旋场 + 噪声
增强细节 流动线和泡沫 正弦波动叠加
动画层 自动旋转 GSAP timeline

🔧 核心技术点

1. 涡旋场函数

创建旋转的流体运动效果。

GLSL
1
2
3
4
5
6
7
8
9
10
vec2 vortexField(vec2 uv, float time) {
    vec2 center = vec2(0.5, 0.5);
    vec2 dir = uv - center;
    float dist = length(dir);
    float angle = atan(dir.y, dir.x);
    
    angle += sin(dist * 10.0 + time * flowSpeed) * turbulence;
    
    return vec2(cos(angle), sin(angle)) * dist * 0.5;
}

2. 流体密度计算

多层噪声叠加模拟流体密度分布。

GLSL
1
2
3
4
5
6
7
8
9
10
11
float fluidDensity(vec2 uv, float time) {
    vec2 vortex = vortexField(uv, time);
    
    float density = 0.0;
    for (int i = 0; i < 3; i++) {
        float frequency = float(i + 1) * 2.0;
        density += fluidNoise(uv * frequency + vortex) / float(i + 1);
    }
    
    return density * viscosity;
}

3. 流体颜色映射

根据密度值映射到不同深度的蓝色。

GLSL
1
2
3
4
5
6
7
8
9
10
11
vec3 fluidColorMap(float density) {
    vec3 deepColor = vec3(0.0, 0.2, 0.8);   // 深蓝色
    vec3 midColor = vec3(0.2, 0.6, 1.0);     // 中蓝色
    vec3 surfaceColor = vec3(0.8, 0.9, 1.0); // 表面色
    
    if (density < 0.3) {
        return mix(deepColor, midColor, density / 0.3);
    } else {
        return mix(midColor, surfaceColor, (density - 0.3) / 0.7);
    }
}

4. 泡沫效果

GLSL
1
2
float foam = sin(uv.x * 30.0 + time * 3.0) * sin(uv.y * 30.0 + time * 3.0) * 0.1;
color += foam * vec3(1.0, 1.0, 1.0);

💡 调试与优化

问题类型 表现形式 解决方案
着色器编译失败 黑屏或报错 检查 GLSL 语法和 uniform 定义
性能问题 帧率下降 降低细分或噪声迭代次数
颜色异常 颜色不自然 调整颜色映射曲线
动画卡顿 旋转不流畅 检查 GSAP 配置

🚀 扩展思路

变体效果 核心改动 难度
水流瀑布 将球体改为平面,添加垂直流动效果 ⭐⭐
气泡上升 添加粒子系统模拟气泡 ⭐⭐⭐
漩涡中心 创建吸引子效果 ⭐⭐
多色流体 添加颜色渐变动画 ⭐⭐

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