
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 参数控制
🖼️ 效果预览
🎮 案例演示
📖 效果拆解
| 层次 | 视觉效果 | 技术实现 |
|---|---|---|
| 基础 | 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 的位移系数 |
🚀 扩展思路
- 时间暂停效果:添加时间停止的瞬间定格效果
- 时间回溯:实现时间倒流视觉效果
- 多球体组合:添加多个不同颜色和相位的时间球体
- 粒子轨迹:让粒子留下时间轨迹尾巴
- 音效同步:配合时间扭曲音效增强沉浸感
📚 相关学习资源
©️ 版权声明
*本文档由 ThreeLab 编辑整理,专注 Three.js 着色器、Web 3D、GIS 可视化技术分享。如需转载,请注明出处。







京公网安备 11010502038735号
💬 评论区
评论功能即将上线,敬请期待!