我从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
源代码,发现了两件事:
- 动作对象没有更新,只有它的属性,所以当ref更新时
useEffect
不会触发 - 如果
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导出的那样,则有一个设置。
然后你可以在你的网格周围放一个,让它根据你的控制移动