Three.js 变换动画
提示词
使用 Three.js 和 GSAP 实现模型变换动画,包括位置、旋转和缩放的动画效果,使用 FBXLoader 加载模型。
效果描述
这是一个使用 GSAP 动画库实现模型变换动画的示例,包含位置、旋转和缩放的动画效果。
效果特性
- 位置动画:模型沿 Y 轴向上移动
- 旋转动画:模型绕 Y 轴旋转 45 度
- 缩放动画:模型沿 X 和 Z 轴缩放 2 倍
- FBX 模型加载:加载城市模型
- GSAP 动画:使用 GSAP 实现平滑动画
- Promise 链:使用 Promise.all 等待所有动画完成
核心参数
| 参数 |
值 |
说明 |
| 模型路径 |
files/model/city.FBX |
FBX 模型文件 |
| 模型缩放 |
0.0005 |
模型缩放比例 |
| 动画时长 |
3秒 |
GSAP 动画持续时间 |
| 位置偏移 |
Y+5 |
位置向上移动 5 单位 |
| 旋转角度 |
PI/4 |
旋转 45 度 |
| 缩放倍数 |
X/Z * 2 |
缩放 2 倍 |
核心代码解析
GSAP 变换动画
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function setTransformAnimate(mesh) {
const position = mesh.position.clone();
position.y += 5;
const rotation = mesh.rotation.clone();
rotation.y += Math.PI / 4;
const scale = mesh.scale.clone();
scale.z *= 2;
scale.x *= 2;
const transformInfo_ = { position, rotation, scale };
const promises_gsap = ["position", "rotation", "scale"].map((i) => {
return new Promise((resolve) => {
gsap.to(mesh[i], {
x: transformInfo_[i].x,
y: transformInfo_[i].y,
z: transformInfo_[i].z,
duration: 3,
ease: "none",
repeat: 0,
yoyo: false,
yoyoEase: true,
onComplete: resolve,
});
});
});
Promise.all(promises_gsap).then(() => console.log("动画完成"));
}
FBX 模型加载
new FBXLoader().load(FILE_HOST + "files/model/city.FBX", (object3d) => {
scene.add(object3d);
object3d.scale.set(0.0005, 0.0005, 0.0005);
setTransformAnimate(object3d);
});
技术亮点
- GSAP 动画:使用 GSAP 实现平滑的变换动画
- Promise 链:使用 Promise.all 等待多个动画完成
- 变换分离:位置、旋转、缩放分别动画
- FBX 加载:使用 FBXLoader 加载模型
- 克隆属性:使用 clone() 避免修改原始值
调试技巧
- 动画时长:调整 duration 参数控制动画速度
- 变换顺序:可以调整变换的顺序
- 模型缩放:FBX 模型通常需要缩放
- 动画回调:onComplete 回调在动画完成时触发
- Promise 处理:确保所有动画都完成后再执行后续操作
扩展方向
- 缓动函数:使用不同的 ease 函数创造不同效果
- 循环动画:设置 repeat: -1 实现循环动画
- 往返动画:设置 yoyo: true 实现往返动画
- 多模型动画:同时动画多个模型
- 动画序列:使用 GSAP Timeline 创建动画序列
本文档由 ThreeLab 编辑整理,如需转载,请注明出处。
💬 评论区
评论功能即将上线,敬请期待!