I am following this youtube tutorial to animate my 3d .glb avatar created using readyplayer service. I have managed to load the avatar model in my nextJs app.
In order to get the animation file from mixamo, I imported the .glb into .fbx format using blender, then uploaded the .fbx file to mixamo. I chose "typing" animation, then saved the file "Typing.fbx" into the "/public/animations/Typing.fbx" of my nextJs app folder.
I then loaded the file with
const {animation:typingAnimation} = useFBX("/animations/Typing.fbx")
However, as I tried to
console.log(typingAnimation)
the result is undefined.
Please help me to load this typing animation file, so I can animate my 3d .glb avatar in nextJs.
This is the original .glb avatar, and if you want to replicate the issue, this is the github repo. The avatar file is located in
/public/images/3d/avatar.glb
Edit : the complete code is as follows :
import React, { useEffect, useRef } from "react";
import { useFBX, useGLTF } from "@react-three/drei";
export function Avatar(props) {
//the code below is where I load my 3d avatar model, it works correctly
const { nodes, materials } = useGLTF("/images/3d/avatar.glb");
//the code below is where I call the animation file
const {animation:typingAnimation} = useFBX("/animations/TypingAgain.fbx")
useEffect(()=>{
console.log(typingAnimation)//this is where it failed, the result is undefined
}, [typingAnimation])
//the return statement below can display my 3d avatar model
return (
<group {...props} dispose={null}>
<primitive object={nodes.Hips} />
<skinnedMesh
name="EyeLeft"
geometry={nodes.EyeLeft.geometry}
material={materials.Wolf3D_Eye}
skeleton={nodes.EyeLeft.skeleton}
morphTargetDictionary={nodes.EyeLeft.morphTargetDictionary}
morphTargetInfluences={nodes.EyeLeft.morphTargetInfluences}
/>
<skinnedMesh
name="EyeRight"
geometry={nodes.EyeRight.geometry}
material={materials.Wolf3D_Eye}
skeleton={nodes.EyeRight.skeleton}
morphTargetDictionary={nodes.EyeRight.morphTargetDictionary}
morphTargetInfluences={nodes.EyeRight.morphTargetInfluences}
/>
<skinnedMesh
name="Wolf3D_Head"
geometry={nodes.Wolf3D_Head.geometry}
material={materials.Wolf3D_Skin}
skeleton={nodes.Wolf3D_Head.skeleton}
morphTargetDictionary={nodes.Wolf3D_Head.morphTargetDictionary}
morphTargetInfluences={nodes.Wolf3D_Head.morphTargetInfluences}
/>
<skinnedMesh
name="Wolf3D_Teeth"
geometry={nodes.Wolf3D_Teeth.geometry}
material={materials.Wolf3D_Teeth}
skeleton={nodes.Wolf3D_Teeth.skeleton}
morphTargetDictionary={nodes.Wolf3D_Teeth.morphTargetDictionary}
morphTargetInfluences={nodes.Wolf3D_Teeth.morphTargetInfluences}
/>
<skinnedMesh
geometry={nodes.Wolf3D_Hair.geometry}
material={materials.Wolf3D_Hair}
skeleton={nodes.Wolf3D_Hair.skeleton}
/>
<skinnedMesh
geometry={nodes.Wolf3D_Glasses.geometry}
material={materials.Wolf3D_Glasses}
skeleton={nodes.Wolf3D_Glasses.skeleton}
/>
<skinnedMesh
name="Wolf3D_Outfit_Top"
geometry={nodes.Wolf3D_Outfit_Top.geometry}
material={materials.Wolf3D_Outfit_Top}
skeleton={nodes.Wolf3D_Outfit_Top.skeleton}
morphTargetDictionary={nodes.Wolf3D_Outfit_Top.morphTargetDictionary}
morphTargetInfluences={nodes.Wolf3D_Outfit_Top.morphTargetInfluences}
/>
<skinnedMesh
name="Wolf3D_Outfit_Bottom"
geometry={nodes.Wolf3D_Outfit_Bottom.geometry}
material={materials.Wolf3D_Outfit_Bottom}
skeleton={nodes.Wolf3D_Outfit_Bottom.skeleton}
morphTargetDictionary={nodes.Wolf3D_Outfit_Bottom.morphTargetDictionary}
morphTargetInfluences={nodes.Wolf3D_Outfit_Bottom.morphTargetInfluences}
/>
<skinnedMesh
name="Wolf3D_Outfit_Footwear"
geometry={nodes.Wolf3D_Outfit_Footwear.geometry}
material={materials.Wolf3D_Outfit_Footwear}
skeleton={nodes.Wolf3D_Outfit_Footwear.skeleton}
morphTargetDictionary={
nodes.Wolf3D_Outfit_Footwear.morphTargetDictionary
}
morphTargetInfluences={
nodes.Wolf3D_Outfit_Footwear.morphTargetInfluences
}
/>
<skinnedMesh
name="Wolf3D_Body"
geometry={nodes.Wolf3D_Body.geometry}
material={materials.Wolf3D_Body}
skeleton={nodes.Wolf3D_Body.skeleton}
morphTargetDictionary={nodes.Wolf3D_Body.morphTargetDictionary}
morphTargetInfluences={nodes.Wolf3D_Body.morphTargetInfluences}
/>
</group>
);
}
useGLTF.preload("/images/3d/avatar.glb");