如何在React Three Fiber中执行现场动画



我从Mixamo导入了一个带有一些动画的3D模型,想知道如何执行动画?我从npx-gltfjsx:创建的GLTF文件


const { nodes, materials, animations } = useGLTF("/Mannequin.glb");
const { actions } = useAnimations(animations, heroRef);
return (
<>
<group ref={heroRef} dispose={null}>
<group rotation={[Math.PI / 2, 0, 0]} scale={0.01}>
<primitive object={nodes.mixamorig1Hips} />
<skinnedMesh
geometry={nodes.Ch36.geometry}
material={materials.Ch36_Body}
skeleton={nodes.Ch36.skeleton}
/>
</group>
{/* <gridHelper args={[25, 25]}/> */}
</group>
</>
);
}
useGLTF.preload("/Mannequin.glb");

例如,我希望模型在不更改位置的情况下执行运行动画(在现场运行(,这样,如果我可以执行平移模型并使动画循环的用户控件,那么它们看起来就像是在实际运行。

有什么方法可以做到这一点吗?我找过了,什么也找不到。

我无法使用console.log(actions)来查看可用的操作,因为它们是未定义的,并且控制台中有{}。我的代码

const { actions } = useAnimations(animations, group);
useEffect(() => {
console.log(actions);
}, [actions]);

所以我深入研究了useAnimations源代码,发现了两件事:

  1. 动作对象没有更新,只有它的属性,所以当ref更新时useEffect不会触发
  2. 如果ref.current未定义(对于第一次渲染(,则属性未定义。这就是我在控制台中看到{}的原因

所以我我的代码更改为

const { actions } = useAnimations(animations, group);
useEffect(() => {
console.log(Object.keys(actions));
}, [actions]);

这就是我看到我的动画名称的方式:['Female_Idle', 'Female_Talk']

const { actions } = useAnimations(animations, group);
const action = actions['Female_Idle'];
useEffect(() => {
if (action) action.play();
}, [action]);

为了发挥作用,当裁判更新。成功了。

useEffect(() => {
console.log(actions) // find out the name of your action
actions.someAction.play()
});

这将使动画在适当的位置播放,如果它像从mixamo导出的那样,则有一个设置。

然后你可以在你的网格周围放一个,让它根据你的控制移动