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 对称。

相关推荐
2601_966949651 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨3 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪4 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风4 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
小大宇5 小时前
Vue知识点6-computed计算属性
前端·javascript·vue.js
程序员海军5 小时前
尤雨溪 : Vue 4 已经在规划中了!
前端·javascript·vue.js
2601_949970695 小时前
HumanizeDuration 跨端三方库仓颉适配全流程
前端·javascript·flutter
2601_962885726 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
下一站春风里7 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法