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

相关推荐
胡萝卜术7 小时前
从API调用到手写LRU:力扣146「LRU缓存」的哈希表+双向链表终极进化之路
前端·javascript·面试
科技道人7 小时前
记录 默认置灰/禁用 app ‘Search Engine Selector‘ 的disable按钮
开发语言·前端·javascript
逝水无殇9 小时前
C# 异常处理详解
开发语言·后端·c#
玖玥拾11 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
铅笔侠_小龙虾11 小时前
Rust 学习目录
开发语言·学习·rust
云泽80811 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦12 小时前
GO---可见性规则
开发语言·golang
逝水无殇12 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
shuaijie051812 小时前
强制修改调用接口的api地址。
javascript·vue.js·ecmascript
JerrySir12 小时前
恶意 npm 包只活了 17 分钟:技术面试里,为什么“升级依赖”还不算止血?
javascript·安全