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

相关推荐
Dxy12393102162 小时前
Python在图片上画多边形:从简单轮廓到复杂区域标注
开发语言·python
楼田莉子2 小时前
同步/异步日志系统:日志器管理器模块\全局接口\性能测试
linux·服务器·开发语言·c++·后端·设计模式
人邮异步社区2 小时前
文科生零基础学 Python 难吗?真不难,难的是找对书!
开发语言·python
春栀怡铃声2 小时前
【C++修仙录02】筑基篇:类和对象(上)
开发语言·c++·算法
悟空爬虫-彪哥2 小时前
2026 Python UI 框架选择指南:从 Streamlit 到 Pyside6 的四层体系
开发语言·python·ui
Hilaku3 小时前
为什么我不建议普通前端盲目卷全栈?
前端·javascript·程序员
旷世奇才李先生3 小时前
Python\+ERNIE实战:字节跳动式AI内容审核完整实现(附源码)
开发语言·人工智能·python
大彼方..3 小时前
深入学习cpp初阶模板
开发语言·c++·学习
咸鱼翻身小阿橙3 小时前
QT-P3
开发语言·qt·计算机视觉