FromToByAnimation triggers availableAnimations not the single bone animation

So, I was trying to animate a single bone using FromToByAnimation, but when I start the animation, the model instead does the full body animation stored in the availableAnimations.

If I don't run testAnimation nothing happens. If I run testAnimation I see the same animation as If I had called

entity.playAnimation(entity.availableAnimations[0],..)

here's the full code I use to animate a single bone:


func testAnimation() {
    guard let jawAnim = jawAnimation(mouthOpen: 0.4) else {
        print("Failed to create jawAnim")
        return
    }
    guard let creature, let animResource = try? AnimationResource.generate(with: jawAnim) else { return }

    let controller = creature.playAnimation(animResource, transitionDuration: 0.02, startsPaused: false)
    print("controller: \(controller)")
}

func jawAnimation(mouthOpen: Float) -> FromToByAnimation<JointTransforms>? {
    guard let basePose else { return nil }
    guard let index = basePose.jointNames.firstIndex(of: jawBoneName) else {
        print("Target joint \(self.jawBoneName) not found in default pose joint names")
        return nil
    }

    let fromTransforms = basePose.jointTransforms
    let baseJawTransform = fromTransforms[index]

    let maxAngle: Float = 40
    let angle: Float = maxAngle * mouthOpen * (.pi / 180)
    let extraRot = simd_quatf(angle: angle, axis: simd_float3(x: 0, y: 0, z: 1))

    var toTransforms = basePose.jointTransforms
    toTransforms[index] = Transform(
        scale: baseJawTransform.scale * 2,
        rotation: baseJawTransform.rotation * extraRot,
        translation: baseJawTransform.translation
    )

    let fromToBy = FromToByAnimation<JointTransforms>(
        jointNames: basePose.jointNames,
        name: "jaw-anim",
        from: fromTransforms,
        to: toTransforms,
        duration: 0.1,
        bindTarget: .jointTransforms,
        repeatMode: .none,
    )

    return fromToBy
}

PS: I can confirm that I can set this bone to a specific position if I use

guard let index = newPose.jointNames.firstIndex(of: boneName) ...
let baseTransform = basePose.jointTransforms[index]
newPose.jointTransforms[index] = Transform(
    scale: baseTransform.scale,
    rotation: baseTransform.rotation * extraRot,
    translation: baseTransform.translation
)
skeletalComponent.poses.default = newPose
creatureMeshEntity.components.set(skeletalComponent)

This works for manually setting the bone position, so the jawBoneName and the joint-transformation can't be that wrong.

Hi @Bersaelor

The approach you've taken here looks correct, and I was able to use it to successfully animate an individual joint in a test project of my own. Is it possible that any other code paths might be incidentally triggering your model's full body animation? If not, please file a bug report via Feedback Assistant and, if possible, consider attaching a project that reproduces the issue so we can further investigate! Thanks!

FromToByAnimation triggers availableAnimations not the single bone animation
 
 
Q