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。把更新与资源释放写进路由/关卡生命周期,线上才不会「切场景后越跑越卡」。

相关推荐
Larcher3 小时前
React Router 不只是页面跳转:从 SPA 路由到权限守卫的完整实践
javascript·后端
Larcher3 小时前
大模型为什么每次回答都不一样?一文搞懂 Temperature、Top K 与 Top P
javascript·后端
名字还没想好☜5 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
eric-sjq7 小时前
10 分钟实战:用 0.6B 本地模型生成中文网页(WanlyFrontend + 编译器全流程)
javascript·机器学习·自然语言处理·html
To_OC7 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
kyriewen8 小时前
面试官问"这段逻辑为什么这样写"——我才发现,这半年我写的代码,我自己都解释不了
前端·javascript·面试
一壶浊酒..8 小时前
Scrape Webpack练习
开发语言·javascript·webpack
命运之光9 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
命运之光9 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人10 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log