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

相关推荐
不午休の野猫21 分钟前
vs + qt环境编译.sln项目时报无法解析的外部符号metaObject && qt_metacast
开发语言·qt
吴声子夜歌44 分钟前
Java——接口的细节
java·开发语言·算法
阿拉金alakin1 小时前
深入理解 Java 锁机制:CAS 原理、synchronized 优化与主流锁策略全总结
java·开发语言
myheartgo-on1 小时前
Java—方 法
java·开发语言·算法·青少年编程
雨落在了我的手上1 小时前
如何学习java?
java·开发语言·学习
xiangxiongfly9151 小时前
Vue3 根据角色权限动态加载路由
前端·javascript·vue.js·动态加载路由
神仙别闹2 小时前
基于 C# OpenPGP 的文件管理系统
开发语言·c#
番石榴AI2 小时前
纯 CPU 推理!0.1B 超轻量级端到端OCR模型,使用 Java 进行文档解析
java·开发语言·ocr
likerhood2 小时前
ConcurrentHashMap详细讲解(java)
java·开发语言·性能优化
费曼学习法2 小时前
React 18 并发模式(Concurrent Mode):Fiber 架构的终极进化
javascript·react.js