Three.js 时间扭曲效果着色器 | 三维可视化 / AI 提示词

📋 AI 提示词

prompt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用 Three.js 实现**时间扭曲效果着色器**,具体要求:

【核心特效】
- 多层时间扭曲场叠加
- 时间涟漪波动效果
- 时间粒子漂浮效果
- 紫色/蓝色/绿色三种时间类型切换

【场景与光照】
- 深紫色系背景 (#1a0033 → #0a001a 径向渐变)
- OrbitControls 轨道控制器
- 自定义着色器实现时间扭曲感

【交互与控制】
- OrbitControls 鼠标拖拽旋转
- 鼠标滚轮缩放
- GUI 面板实时调节扭曲强度、时间流速、涟漪效果等参数

【技术要求】
- Three.js 版本 (ES Module)
- 自定义顶点着色器实现顶点变形
- 自定义片元着色器实现多层时间场和粒子效果
- lil-gui 参数控制

🖼️ 效果预览

Three.js 时间扭曲效果着色器

🎮 案例演示

立即体验


📖 效果拆解

层次 视觉效果 技术实现
基础 3D球体几何体 SphereGeometry (半径3, 64×32分段)
核心特效 多层时间扭曲场 片元着色器三层正弦余弦时间叠加
增强细节 时间涟漪和粒子 基于距离的波纹 + 25个漂浮粒子
交互控制 实时参数调节 lil-gui 控制扭曲/流速/涟漪

🔧 核心技术点

1. 多层时间扭曲场

为什么需要这个技术:模拟时间在空间中的扭曲效应,产生复杂的时间流动感。

glsl
1
2
3
4
5
6
7
float timeWarp(vec2 uv, float strength) {
  float warpField = 0.0;
  warpField += sin(uv.x * 4.0 + uTime * 0.3) * cos(uv.y * 6.0 + uTime * 0.5);
  warpField += sin(uv.x * 6.0 + uTime * 0.7) * cos(uv.y * 8.0 + uTime * 0.9) * 0.7;
  warpField += sin(uv.x * 8.0 + uTime * 1.1) * cos(uv.y * 10.0 + uTime * 1.3) * 0.4;
  return warpField * strength;
}

2. 时间涟漪效果

为什么需要这个技术:模拟时间在传播过程中产生的波纹效应,增强动态感。

glsl
1
2
3
4
5
6
7
float ripple(vec2 uv, float effect) {
  float rippleField = 0.0;
  rippleField += sin(distance(uv, vec2(0.5, 0.5)) * 12.0 - uTime * effect * 3.0) * 0.5;
  rippleField += sin(uv.x * 8.0 + uTime * effect * 2.0) *
                cos(uv.y * 8.0 + uTime * effect * 2.5) * 0.3;
  return rippleField;
}

3. 时间粒子漂浮

为什么需要这个技术:模拟时间线上的微小粒子,增加科幻感和层次感。

glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
float timeParticles(vec2 uv, float density) {
  if(!uShowParticles) return 0.0;
  float particleField = 0.0;
  for(int i = 0; i < 25; i++) {
    vec2 particlePos = vec2(
      noise(vec2(float(i) * 0.123, 0.456)),
      noise(vec2(float(i) * 0.456, 0.789))
    );
    float dist = distance(uv, particlePos);
    float particleLife = mod(uTime * 1.5 + float(i) * 8.0, 6.28);
    float particleIntensity = sin(particleLife) * 0.8 + 0.2;
    particleField += exp(-dist * 40.0) * particleIntensity * density;
  }
  return particleField;
}

4. 顶点变形实现时间扰动

为什么需要这个技术:让球体表面产生动态的凹凸变形,增强时间扭曲的视觉效果。

glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uniform float uWarpStrength;
uniform float uTimeFlow;
uniform float uDistortion;

void main() {
  float warp = sin(position.x * 3.0 + uTime * uWarpStrength) *
              cos(position.y * 4.0 + uTime * uWarpStrength * 0.8) *
              sin(position.z * 3.0 + uTime * uWarpStrength * 0.6);
  float flow = sin(position.x * 5.0 + uTime * uTimeFlow * 2.0) *
              cos(position.z * 5.0 + uTime * uTimeFlow * 2.0);
  float distortion = sin(position.x * uDistortion * 6.0) *
                    cos(position.y * uDistortion * 8.0);
  vec3 newPosition = position + normal * (warp + flow * 0.5 + distortion * 0.3) * 0.2;
  gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition, 1.0);
}

5. 时间类型颜色系统

为什么需要这个技术:通过颜色区分不同的时间状态,增加视觉辨识度。

glsl
1
2
3
4
5
6
7
8
9
vec3 getTimeType(int type) {
  if(type == 0) {
    return vec3(0.8, 0.2, 1.0);  // 紫色时间
  } else if(type == 1) {
    return vec3(0.2, 0.6, 1.0);  // 蓝色时间
  } else {
    return vec3(0.2, 1.0, 0.4);  // 绿色时间
  }
}

💡 调试与优化

问题类型 表现形式 解决方案
粒子闪烁过快 粒子闪烁频率过高 减小 uTime * 1.5 的系数
涟漪不同步 波纹扩散不自然 调整 distance(uv, vec2(0.5, 0.5)) 的缩放系数
性能瓶颈 复杂场景帧率低 减少粒子数量 (25→15) 或使用纹理预计算
变形过度 球体变形失真 减小顶点着色器中 newPosition 的位移系数

🚀 扩展思路

  1. 时间暂停效果:添加时间停止的瞬间定格效果
  2. 时间回溯:实现时间倒流视觉效果
  3. 多球体组合:添加多个不同颜色和相位的时间球体
  4. 粒子轨迹:让粒子留下时间轨迹尾巴
  5. 音效同步:配合时间扭曲音效增强沉浸感

📚 相关学习资源


©️ 版权声明

*本文档由 ThreeLab 编辑整理,专注 Three.js 着色器、Web 3D、GIS 可视化技术分享。如需转载,请注明出处。