Three.js AnimationMixer 工程实战:骨骼动画、剪辑切换与时间缩放

文章目录

角色与机械臂一类资源进入场景后,动画往往以 AnimationClip 形式存在;工程里真正驱动播放的是 AnimationMixer 与若干 AnimationAction。本文聚焦「怎么接进主循环、怎么切换状态、怎么控速与清理」。

一、Mixer 与 Root 对象

AnimationMixer 绑定到 SkinnedMesh 所在子图 或其 共同父节点(视导出结构而定)。常见写法:

js 复制代码
const mixer = new THREE.AnimationMixer(model);
const action = mixer.clipAction(gltf.animations[0]);
action.play();

二、主循环里必须 update

每帧传入 秒 为单位的时间增量:

js 复制代码
const clock = new THREE.Clock();
function tick() {
  const dt = clock.getDelta();
  mixer.update(dt);
  renderer.render(scene, camera);
  requestAnimationFrame(tick);
}

若用固定步长或慢动作,可对 dt 做 clamp 或乘以 timeScale。

三、剪辑切换与淡入淡出

  • action.fadeOut(duration) / fadeIn(duration) 降低硬切带来的跳变。
  • 交叉淡化:prevAction.crossFadeTo(nextAction, 0.3, false)。
  • 同一 Mixer 上可同时存在多个 Action,注意 权重 与 有效 状态。

四、时间缩放与暂停

  • action.timeScale = 0.5 半速播放;负值可倒放(视剪辑是否支持)。
  • action.paused = true 暂停单条;mixer.timeScale = 0 暂停全部。

五、卸载与 dispose

切路由或销毁模型时:

  1. action.stop() 并 mixer.uncacheRoot(root) / 停止所有 action。
  2. 释放引用,避免闭包持有旧 mixer。

六、结语

动画系统本质是 状态机 + 时间积分 :update(delta) 是契约,剪辑切换要 fade/crossFade ,卸载路径要与 dispose 对称。

相关推荐
见叶之秋2 小时前
C++ 泛型世界的两块拼图:容器适配器与仿函数
java·开发语言
逗脑IDE2 小时前
零基础学ESP32:RFID无线射频卡——让ESP32拥有“刷卡“能力!
开发语言·网络·人工智能·python·esp32·硬件开发
Dovis(誓平步青云)2 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
小师兄吃牛肉2 小时前
C语言篇:内联函数
c语言·开发语言
yuniko-n3 小时前
【Java】字符串相关坑点
java·开发语言·python
xieter3 小时前
【技术精选】TypeScript 高级类型体操:条件类型与模板字面量深度剖析 (2026-10-06)
javascript
jimy13 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
ss2733 小时前
AI全栈实战 | 3.3-02 Python 并发:有 GIL 为什么还用多线程,asyncio 和 JS 事件循环同源不同味
开发语言·javascript·python
菜鸟~noob2333 小时前
【电子战】第20篇:凸优化与对数障碍法【含matlab代码】
开发语言·matlab
Wang's Blog3 小时前
Java框架 SpringCloud 快速入门: 服务拆分案例 Demo
java·开发语言·spring cloud