溶解动画

Three.js 双向溶解动画 | 三维可视化 / AI 提示词
📋 AI 提示词
prompt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
使用 Three.js 实现【双向溶解动画】,具体要求:
【核心特效】
- 基于纹理的溶解效果
- 双向动画(从上到下/从下到上)
- 边缘发光效果
【场景与光照】
- 无光源(自发光效果)
- 深色背景
【交互与控制】
- OrbitControls 轨道控制器
- 自动循环动画
【技术要求】
- Three.js 最新版本
- ShaderMaterial 自定义着色器
- 纹理驱动的溶解
🖼️ 效果预览
🎮 案例演示
📖 效果拆解
| 层次 | 视觉效果 | 技术实现 |
|---|---|---|
| 基础 | 立方体模型 | BoxGeometry |
| 核心特效 | 纹理溶解 | 溶解贴图 + 高度阈值 |
| 动画 | 双向循环 | flag 变量控制方向 |
| 边缘 | 发光效果 | 黄色边缘高亮 |
🔧 核心技术点
1. 纹理驱动的溶解算法
使用溶解贴图和高度信息实现垂直方向的溶解效果。
glsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
float bottom = -2.0;
float top = 2.0;
float yScale = (worldPos.y - bottom) / (top - bottom);
float t;
if(flag) {
t = fract(time); // 正向:从下往上
} else {
t = 1.0 - fract(time); // 反向:从上往下
}
float h = texture2D(dissolveMap, vUv).r;
float dissolveWidth = 4.0;
// 边缘发光
float condition_if_1 = step(h + yScale * dissolveWidth, t * (dissolveWidth + 1.0) + 0.04);
float condition_if_2 = step(h + yScale * dissolveWidth, t * (dissolveWidth + 1.0));
color = mix(color, vec4(1.0, 1.0, 0.0, 1.0), condition_if_1);
color = color * (1.0 - condition_if_2);
2. 双向动画控制
通过 flag 变量切换溶解方向。
javascript
1
2
3
4
5
6
7
8
9
function updateMaterial() {
dissolveMaterials.map(m => {
m.uniforms.time.value += 0.005;
if (m.uniforms.time.value >= 1) {
m.uniforms.time.value = 0;
m.uniforms.flag.value = !m.uniforms.flag.value; // 切换方向
}
});
}
💡 调试与优化
| 问题类型 | 表现形式 | 解决方案 |
|---|---|---|
| 溶解效果不明显 | 模型无变化 | 检查溶解贴图路径 |
| 边缘发光过强 | 黄色过于刺眼 | 调整 dissolveWidth 参数 |
| 性能问题 | 帧率下降 | 降低贴图分辨率 |
| 动画卡顿 | 切换不流畅 | 优化 updateMaterial 函数 |
🚀 扩展思路
| 变体效果 | 核心改动 | 难度 |
|---|---|---|
| 自定义溶解图案 | 使用不同的溶解贴图 | ⭐⭐ |
| 多色边缘 | 添加颜色渐变 | ⭐⭐ |
| 粒子效果 | 溶解时发射粒子 | ⭐⭐⭐ |
| 3D模型溶解 | 应用到复杂模型 | ⭐⭐⭐ |
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。







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