用途
Three.js Animation 是一份面向 Three.js 的动画能力说明,用于在 Three.js 场景中为对象添加程序化动画,或播放基于关键帧、骨骼、变形目标的动画数据,尤其适合处理 GLTF 模型自带的动画片段。
主要能力
文档介绍 Three.js 动画系统由三个主要部分组成:AnimationClip(关键帧数据容器)、AnimationMixer(在根对象及其后代上播放动画)、AnimationAction(控制动画片段的播放)。
关键帧方面,可按轨道类型创建动画数据:NumberKeyframeTrack(如 .opacity)、VectorKeyframeTrack(位置、缩放)、QuaternionKeyframeTrack(旋转)、ColorKeyframeTrack、BooleanKeyframeTrack,以及用于变形目标的 StringKeyframeTrack。轨道支持设置插值模式:InterpolateLinear(默认)、InterpolateSmooth(三次样条)、InterpolateDiscrete(阶跃)。
AnimationAction 提供播放控制(play、stop、reset、halt)、播放状态查询、时间控制(time、timeScale、paused)、权重设置、循环模式(LoopRepeat、LoopOnce、LoopPingPong)与重复次数、clampWhenFinished、混合模式(Normal 与 Additive),并支持 fadeIn、fadeOut 与 crossFadeTo 交叉淡化。
GLTF 动画加载部分说明了使用 GLTFLoader 加载 model.glb,从 gltf.animations 获取全部片段,用 AnimationClip.findByName 按名称查找,并创建 mixer 在动画循环中调用 mixer.update(delta)。
骨骼动画部分涵盖从 SkinnedMesh 访问 skeleton 与 bones、按名称查找骨骼、使用 SkeletonHelper 可视化、直接程序化旋转骨骼,以及把对象挂载到骨骼(如把手部武器添加到 RightHand 骨骼并设置偏移)。
变形目标部分说明通过 geometry.morphAttributes、mesh.morphTargetInfluences、mesh.morphTargetDictionary 访问与控制权重,并可用 NumberKeyframeTrack 对 morphTargetInfluences 做关键帧动画。
动画混合部分展示多个动作以不同权重混合,并给出按速度切换 idle/walk/run 权重的示例;additive 混合部分说明 blendMode 设为 AdditiveAnimationBlendMode 及使用 AnimationUtils.makeClipAdditive。
动画工具函数包括:AnimationClip.findByName、AnimationUtils.subclip、AnimationUtils.makeClipAdditive、clip.clone、clip.duration、clip.optimize、clip.resetDuration。
过程式动画模式包括平滑阻尼(smoothDamp)、弹簧物理(Spring 类)与振荡(正弦、弹跳、圆周、8 字形)。
使用方式
典型流程是:创建或加载 AnimationClip,创建 AnimationMixer(model),通过 mixer.clipAction(clip) 获得 action 并 play,然后在渲染循环中用 clock.getDelta() 得到增量并调用 mixer.update(delta),最后 renderer.render。程序化动画可直接在 animate 循环中基于 clock.getElapsedTime() 修改对象的 rotation、position 等属性。
适用场景
- 为 Three.js 对象制作旋转、位移、缩放等程序化动画
- 播放 GLTF 模型内嵌的骨骼动画
- 通过 morph targets 做表情或形状过渡
- 在多个动画(如 idle、walk、run)之间做权重混合或交叉淡化
- 使用 additive 混合叠加呼吸等附加动作
限制
资料未说明该技能对 Three.js 版本、浏览器环境、性能上限或具体许可的要求,这些信息暂未提供。示例中部分代码将 mixer 挂在 window 上,属于示例写法,实际使用需按项目结构调整。