I have a setup that lets me put my character’s left hand on a socket on the gun.
I also have a socket in my character’s left hand. I’d like to put the hand so that the hand socket world transform matches the weapon socket’s world transform.
Basically, for the hand pose, I need to return the position of the hand relative of the socket location in world space.
The code I have below almost works, but my character’s hand is backwards. I’ve tried a few things, but can’t seem to get it right. Can anyone help me with my 3D math?
The code is slightly based off this function. USkinnedMeshComponent::TransformToBoneSpace | Unreal Engine Documentation
void MyCharacter::GetLeftHandTransform1P(FVector& OutPosition, FRotator& OutRotation)
{
if (EquippedWeapon
&& Arms1PMesh
&& EquippedWeapon->WeaponAttachment1P
&& EquippedWeapon->WeaponAttachment1P->GetRootComponent())
{
int32 BoneIndex = Arms1PMesh->GetBoneIndex("b_LeftHand");
if (BoneIndex != INDEX_NONE)
{
FMatrix HandBoneToWorldTM = Arms1PMesh->GetBoneMatrix(BoneIndex);
FMatrix HandSocketWorld = Arms1PMesh->GetSocketTransform(FName("LeftWeapon"), ERelativeTransformSpace::RTS_World).ToMatrixWithScale();
FMatrix WepSocketWorld = EquippedWeapon->WeaponAttachment1P->GetRootComponent()->GetSocketTransform(FName("LeftHand"), ERelativeTransformSpace::RTS_World).ToMatrixWithScale();
FMatrix HandRelXform = HandSocketWorld * HandBoneToWorldTM.InverseSafe();
//FMatrix DestXform = FMatrix(FVector(1.f, 0.f, 0.f), FVector(0.f, -1.f, 0.f), FVector(0.f, 0.f, -1.f), FVector(0.f, 0.f, 0.f)) * HandRelXform * WepSocketWorld;
FMatrix DestXform = HandRelXform * WepSocketWorld;
OutPosition = DestXform.GetOrigin();
OutRotation = DestXform.Rotator();
}
}