Uses the Physics Asset to compute an accurate reference-pose bounding box for a skeletal mesh asset. This typically has more utility than the default skeletal mesh bounds which can often be arbitrarily inflated or scaled.
bool UMyFunctionLibrary::GetAccurateReferencePoseBounds(FBox& AABB, const USkeletalMesh* Mesh)
{
AABB = FBox(EForceInit::ForceInitToZero);
if (!Mesh) { return false; }
if (!Mesh->GetPhysicsAsset()) { return false; }
for (const USkeletalBodySetup* BodySetups : Mesh->GetPhysicsAsset()->SkeletalBodySetups)
{
const FReferenceSkeleton& RefSkeleton = Mesh->GetSkeleton()->GetReferenceSkeleton();
FTransform ComponentSpaceBoneTransform = FTransform::Identity;
int32 BoneIndex = RefSkeleton.FindBoneIndex(BodySetups->BoneName);
while (BoneIndex != INDEX_NONE)
{
const FTransform& BoneLocalTM = RefSkeleton.GetRefBonePose()[BoneIndex];
ComponentSpaceBoneTransform = ComponentSpaceBoneTransform * BoneLocalTM;
BoneIndex = RefSkeleton.GetParentIndex(BoneIndex);
}
AABB += BodySetups->AggGeom.CalcAABB(ComponentSpaceBoneTransform);
}
return true;
}