No announcement yet.

Rotating rotator based on a new pivot?

  • Filter
  • Time
  • Show
Clear All
new posts

    Rotating rotator based on a new pivot?

    I want to implement a new recoil system in the ShooterGame template, and so I want to rotate the player's first-person weapon relative to a rotator. If the rotator is 15° right and 15° upwards, then the gun should be pointed 15° right and upwards from where the player is looking. I have not been able to do this because once the gun rotates 15°, the 15° pitch increase happens from a new pivot facing that new yaw. I have no idea how to calculate a rotator that corrects for this change. I have tried adding the rotator in different places in the OnCameraUpdate function, but nothing gets me the desired result. Can anyone help me? This is probably really simple, but I am a novice coder and I have become so frustrated at this roadblock.

    The gun should be in the same location on each of these pictures (15° up and to the right): Straight - Up - Down

    Here is the OnCameraUpdate code, which determines the location and rotation of the weapon. The capital THIS is where I added 15.0f for those above photos; they're not in the original code.
    void AShooterCharacter::OnCameraUpdate(const FVector& CameraLocation, const FRotator& CameraRotation)
        USkeletalMeshComponent* DefMesh1P = Cast<USkeletalMeshComponent>(GetClass()->GetDefaultSubobjectByName(TEXT("PawnMesh1P")));
        const FMatrix DefMeshLS = FRotationTranslationMatrix(DefMesh1P->RelativeRotation, DefMesh1P->RelativeLocation);
        const FMatrix LocalToWorld = ActorToWorld().ToMatrixWithScale();
        // Mesh rotating code expect uniform scale in LocalToWorld matrix
        const FRotator RotCameraPitch(CameraRotation.Pitch + TEST, 0.0f, 0.0f);
        const FRotator RotCameraYaw(0.0f, CameraRotation.Yaw + TEST, 0.0f);
        const FMatrix LeveledCameraLS = FRotationTranslationMatrix(RotCameraYaw, CameraLocation) * LocalToWorld.Inverse();
        const FMatrix PitchedCameraLS = FRotationMatrix(RotCameraPitch) * LeveledCameraLS;
        const FMatrix MeshRelativeToCamera = DefMeshLS * LeveledCameraLS.Inverse();
        const FMatrix PitchedMesh = MeshRelativeToCamera * PitchedCameraLS;
        Mesh1P->SetRelativeLocationAndRotation(PitchedMesh.GetOrigin(), PitchedMesh.Rotator());