After a lot of trial and error, I unintentionally fixed the issue by using SkeletonUtils.clone()
to clone the loaded gltf.scene
before adding it to my scene and applying animations.
To be honest, I'm not entirely sure what the root cause was. My best guess is that there was some kind of mismatch or internal reference issue between the original SkinnedMesh
and its Skeleton
when applying animations directly to the unmodified gltf scene. Perhaps cloning with SkeletonUtils
forces a proper rebinding of the mesh to the skeleton.
If someone has a more technical explanation for why this happens, I'd love to hear it — but in the meantime, if anyone runs into a similar issue with animated GLB models looking crushed in Three.js: try SkeletonUtils.clone()
! It solved it for me.