Three.js 骨骼动画工程实战:AnimationMixer、剪辑与混合权重调参

文章目录

Three.js 骨骼动画工程实战:AnimationMixer、剪辑与混合权重调参

GLTF 角色落地后,真正决定「手感」的是 AnimationMixerAnimationAction 的组合使用:谁在更新时钟、谁在裁剪骨骼、混合权重如何衰减,都直接影响性能与表现。

一、最小可用管线

  1. mixer = new THREE.AnimationMixer(root)root 通常取 SkinnedMesh 或包含骨架的 Group。
  2. const clip = THREE.AnimationClip.findByName(animations, 'Run') 取剪辑;action = mixer.clipAction(clip)
  3. 每帧:mixer.update(delta),且 delta 必须用真实帧间隔clock.getDelta()),不要用固定 1/60 糊弄。
javascript 复制代码
const clock = new THREE.Clock();
function animate() {
  requestAnimationFrame(animate);
  const dt = clock.getDelta();
  mixer.update(dt);
  renderer.render(scene, camera);
}

二、多动作混合与优先级

  • fadeIn / fadeOut:切换站立↔跑步时用淡入淡出,避免瞬时跳变。
  • setEffectiveWeight:上层逻辑(如受伤、瞄准)叠加时,用权重而不是开多个 Mixer。
  • stop / reset :切场景前对 action.stop(),并从 Map 里移除引用,防止闭包持有旧 SkinnedMesh

三、工程坑点

现象 常见原因 处理
动画「抽搐」 同一骨骼被多个 Action 强混合 降低冲突轨权重或使用掩码
CPU 飙高 每帧全量 mixer.update 且剪辑极多 只更新可见角色;远处降采样
内存涨 Clip 未复用、重复 clipAction 缓存 Map<name, AnimationClip>

四、结语

骨骼动画的稳定性来自 单一 Mixer 时钟成对的 play/stop。把更新与资源释放写进路由/关卡生命周期,线上才不会「切场景后越跑越卡」。

相关推荐
kyriewen17 小时前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试
To_OC19 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
GuWenyue21 小时前
排序效率低?5分钟吃透快速排序,性能飙升至O(nlogn)
前端·javascript·面试
何时梦醒21 小时前
深入理解递归与快速排序 —— 从基础入门到手写实现
前端·javascript
bonechips21 小时前
LLM 的无状态:从 HTTP 协议到对话上下文工程
前端·javascript
胡志辉21 小时前
从 prototype 到 V8,看懂 JavaScript 原型链
前端·javascript
ping某1 天前
专栏-null 和 undefined 到底是什么?
前端·javascript·后端
swipe1 天前
从 0 到 1 理解 React 虚拟列表:定高、不定高与 Canvas 版本完整拆解
前端·javascript·面试
铁皮饭盒1 天前
Bun执行python代码
前端·javascript·后端
zzzzzz3101 天前
当甲方说'logo放大的同时再缩小一点'时,我用 AI 把这个需求做出来了
javascript·css·程序员