Three.js 中关键帧动画(如模型的骨骼动画、位移动画等)主要依托 GLTF/GLB 格式模型(内置关键帧数据),核心通过 AnimationMixer(动画混合器)、AnimationClip(动画剪辑)、AnimationAction(动画动作)实现加载与播放。以下是基础的加载流程。
关键帧动画依赖 GLTFLoader(加载含动画的 GLB/GLTF 模型),需先在 HTML 中引入对应脚本(与 Three.js 版本匹配):
<!-- Three.js 核心库(示例用0.128.0版本,保持版本统一) -->
<script src="https://unpkg.com/three@0.128.0/build/three.min.js"></script>
<!-- GLTF/GLB 加载器(加载含关键帧动画的模型) -->
<script src="https://unpkg.com/three@0.128.0/examples/js/loaders/GLTFLoader.js"></script>
在 Vue 实例的 data 中声明动画相关核心对象,用于管理动画状态:
new Vue({
el: '#app',
data() {
return {
mixer: null, // 动画混合器(核心:管理模型所有动画)
clock: new THREE.Clock(), // 时钟(用于计算动画时间增量)
};
},
mounted() {
// 加载模型
this.loadModel();
},
methods: {
// 步骤1.加载含关键帧动画的GLB/GLTF模型(核心加载逻辑)
loadModel() {
// 加载glb模型
this.loader.load('https://threejs.org/examples/models/gltf/Flamingo.glb', (gltf) => {
// 将模型添加到场景
this.scene.add(gltf.scene);
// 创建动画混合器
this.mixer = new THREE.AnimationMixer(gltf.scene);
this.clock = new THREE.Clock();
//播放单个gltf.animations[0]关键帧动画
const action = this.mixer.clipAction(gltf.animations[0]);
action.play();//播放动画
}
);
},
// 步骤2:动画循环(更新动画混合器,让关键帧动画动起来)
animate() {
// 关键:计算时间增量(delta),更新动画混合器
if (this.mixer) {
const delta = this.clock.getDelta();
this.mixer.update(delta);
}
}
}
});
mixer,绑定到模型根节点(gltf.scene);AnimationClip(如"走路""跑步""跳跃"),存储在 gltf.animations 数组中。mixer.clipAction(clip) 创建,用于控制单个动画的播放、暂停、循环等;play()(播放)、pause()(暂停)、stop()(停止并重置)。getDelta() 方法获取帧间隔时间,确保动画播放速度与帧率无关(匀速播放)。GLB/GLTF 格式(含关键帧数据)可直接加载动画,其他格式(如FBX)需对应加载器(FBXLoader),逻辑类似;public 目录下,路径以 / 开头(如 /models/animated-model.glb);GLTFLoader 版本必须与 Three.js 核心版本一致,否则会出现 mixer 未定义、动画不播放等问题;animate() 中调用 this.mixer.update(delta),否则动画只会停在第一帧,不会播放。AnimationMixer;gltf.animations 提取 AnimationClip,创建 AnimationAction 并调用 play();mixer.update(delta) 更新动画时间。以上是关键帧动画的纯基础加载流程,无复杂控制,仅实现"加载并播放"核心功能,是后续扩展(如切换动画、控制播放/暂停)的基础。
关键帧动画为 3D 场景注入生命力,让模型能够动态展示其功能和特性。掌握关键帧动画加载技术,是开发交互式 3D 应用的重要一步。