Download

Engine Workflow for Skeletons/Animation Blueprint/Character Blueprints

I’m beginning on working out the workflow between skeletons and animation blueprints, was hoping that a dev could hop on here and give me any information that would narrow down my search and increase my understanding.
My purpose is to create something similar to BIK Full Body IK, with a component that will map bones to a universal rig, send that virtual rig to the animation blueprint so that any mapped bones will receive the data for their virtual rig counterpart. All inspired by Alexander Bereznyak’s IK Rig tech.
I will likely update this with questions as I dig through the engine code.

So I believe I found where the skeleton used by the animation blueprint is:
AnimInstance::InitializeAnimation()
AnimInstance->CurrentSkeleton is set to the OwningComponent->SkeletalMesh->Skeleton.
If this is the case, then I now need to get an understanding of how animations use the skeleton, which I’m currently looking for.
Before having found anything, is it that the animations simply apply the keyframed transform to to the skeleton?
My idea is to create a custom USkeleton class which will function as a normal uskeleton. In this subclass, I will allow mapping of multiple bones from a different skeleton to a universal rig(the subclass skeleton). This universal rig will apply any data received to the mapped bones.
Is that plausible?

Okay, finally a solid question

Where is UAnimationAsset::Skeleton set at?

I believe I’ve tracked down that this is the main skeleton referenced by animations.
I have also come to conclude that AnimSequence::GetAnimationPose() seems to be the main function called by animations, followed by AnimSequence::GetBonePose(). Is that mostly. or always right? I did see there were GetAdditiveBonePose etc, but I believe I saw they each called GetPoneBose() in their own right.

For Future Reference, if anyone wants to understand the flow of animations and bones:
(This is from a simple animation sequence with nothing like curves or such applied to it)

  • AnimSequence::GetAnimationPose is called

  • AnimSequence::GetBonePose is called

  • From GetBonePose:

  • Add BoneTrackPairs<float, float> to RotationScalePairs<BoneTrackPairs>, then TranslationPairs<BoneTrackPairs> for case Animation

  • CopyBonesTo()

  • AnimEncoding::AnimationFormat_GetAnimationPose()
    [LIST]

  • Sends array of TranslationPairs to AnimEncoding_ConstantKeyLerp::GetPoseTranslations
    [LIST]

  • Foreach TranslationPairs
    [LIST]

  • AnimEncoding_ConstantKeyLerp::GetBoneAtomTranslation()
    [LIST]

  • Which sets the current translation to the next translation via FTransform.SetTranslation

[/LIST]
Repeated for RotationPairs
[/LIST]
CopyBonesFrom()
[/LIST]
[/LIST]