You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Three.js Fiber中运行Blender导出的多段模型动画?

解决GLTF模型动画无法播放的问题

先确认核心依赖与初始化步骤

首先得用对useAnimations钩子——这是drei库专门处理GLTF动画的工具,别直接瞎调用actions:

  1. 导入钩子:
import { useAnimations } from '@react-three/drei'
  1. 在组件里正确关联动画与模型场景:
const { gltf, animations } = useGLTF('/你的模型路径.glb')
const { actions } = useAnimations(animations, gltf.scene)

这里第二个参数必须传gltf.scene,不然actions找不到要驱动的对象。

排查动画调用的常见问题

1. 动画名称不匹配

别想当然用Blender里的名字,先打印出来确认实际键名:

useEffect(() => {
  console.log('可用动画列表:', Object.keys(actions))
}, [actions])

比如Blender里叫"跑步动画",导出后可能保留原名或变成"跑步_动画",大小写也必须完全一致,差一个字母都不行。

2. 过早调用play导致报错

useEffect要加actions作为依赖项,并且加判断确保actions初始化完成:

useEffect(() => {
  // 替换成你要播放的动画名,比如"Idle"
  if (actions.Idle) {
    actions.Idle.play()
    // 默认可能只播一次,需要循环的话设置:
    actions.Idle.loop = THREE.LoopRepeat
  }
}, [actions])

不加依赖的话,组件渲染时actions还没加载,自然会报undefined错误。

3. Blender导出时的坑

  • 导出GLTF时,必须在动画选项里勾选"All Actions"或你需要的单个动作,不然动画根本没导出。
  • 检查Blender里的NLA轨道,确保把动作拖到轨道上,没拖的话导出后不会有动画。

完整示例代码

import { useGLTF } from '@react-three/drei'
import { useAnimations } from '@react-three/drei'
import { useEffect } from 'react'
import * as THREE from 'three'

export default function YourModel() {
  const { gltf, animations } = useGLTF('/your-model.glb')
  const { actions } = useAnimations(animations, gltf.scene)

  useEffect(() => {
    console.log('可用动画:', Object.keys(actions))
    // 替换成你实际的动画名称
    const targetAnim = actions['你的动画名称']
    if (targetAnim) {
      targetAnim.play()
      targetAnim.loop = THREE.LoopRepeat
      targetAnim.clampWhenFinished = false // 防止动画停在最后一帧
    }
  }, [actions])

  return <primitive object={gltf.scene} />
}

useGLTF.preload('/your-model.glb')

内容的提问来源于stack exchange,提问作者cedFlame

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:22:51