Camera Rotation Smoothing With Motion Plugin On Unreal Engine
Context
I really like the plugin True First Person developped by Kia Armani. It’s a great plugin that allows you to create a first person camera with a lot of features with nice and smooth camera movements.
In a project where I used this plugin, I wanted make the camera rotation smoother. I found a way to achieve this effect and I wanted to share it with you.
You’ll have to modify the
UMotionCameraComponentclass from the plugin. The version I use is the1.6.x.
The code
MotionCameraComponent.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MOTIONCORE_API UMotionCameraComponent : public UCameraComponent
{
GENERATED_BODY()
//...
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Configuration")
float CameraInertiaStrength = 1.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Configuration")
bool bEnableCameraInertia = false;
UPROPERTY()
bool bFirstInitialization = true;
UPROPERTY()
FRotator CurrentRotation = FRotator::ZeroRotator;
//...
}
MotionCameraComponent.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void UMotionCameraComponent::GetCameraView(float DeltaTime, FMinimalViewInfo& DesiredView)
{
// ...
for (const TTuple<FString, UE::Math::TRotator<double>> & StaticRotationOffset: CameraStaticRotationOffsets)
{
UpdatedCameraRotation = FRotator(FQuat(UpdatedCameraRotation) * FQuat(StaticRotationOffset.Value));
}
UpdatedCameraRotation = FRotator(FQuat(UpdatedCameraRotation) * FQuat(CameraRotatorFromCurves));
// Apply inertia effect based on camera rotation
if (bFirstInitialization)
{
CurrentRotation = UpdatedCameraRotation;
bFirstInitialization = false;
}
if (bEnableCameraInertia && CurrentRotation.Equals(UpdatedCameraRotation, 0.01f) == false)
{
// Interpolate towards the target rotation
CurrentRotation = FMath::RInterpTo(CurrentRotation, UpdatedCameraRotation, DeltaTime, CameraInertiaStrength);
}
else
{
CurrentRotation = UpdatedCameraRotation;
}
DesiredView.Rotation = CurrentRotation;
SetWorldRotation(CurrentRotation);
// ...
}
Explanation
This part is the original code from the plugin. It’s used to apply the camera rotation from the curves and the static rotation offsets.
1
2
3
4
5
6
for (const TTuple<FString, UE::Math::TRotator<double>> & StaticRotationOffset: CameraStaticRotationOffsets)
{
UpdatedCameraRotation = FRotator(FQuat(UpdatedCameraRotation) * FQuat(StaticRotationOffset.Value));
}
UpdatedCameraRotation = FRotator(FQuat(UpdatedCameraRotation) * FQuat(CameraRotatorFromCurves));
The next part is new. It’s used to apply the inertia effect on the camera rotation.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Apply inertia effect based on camera rotation
if (bFirstInitialization)
{
CurrentRotation = UpdatedCameraRotation;
bFirstInitialization = false;
}
if (bEnableCameraInertia && CurrentRotation.Equals(UpdatedCameraRotation, 0.01f) == false)
{
// Interpolate towards the target rotation
CurrentRotation = FMath::RInterpTo(CurrentRotation, UpdatedCameraRotation, DeltaTime, CameraInertiaStrength);
}
else
{
CurrentRotation = UpdatedCameraRotation;
}
For the first initialization, we need to initialize
CurrentRotationwith theUpdatedCameraRotation.If there is rotation delta between the current and the updated rotation above
0.01f(you may change this value if you want)- Then the camera will interpolate towards the target rotation with
CameraInertiaStrengthas the interpolation speed.
- Then the camera will interpolate towards the target rotation with
In case this article become outdated, you may also want to check the Gist with the latest changes: https://gist.github.com/Plimsky/925aacdcad0e9d259f690efe562d7bdf
Conclusion
It’s simple as that! You can now have a smoother camera rotation with the True First Person plugin.
You may want to tweak the CameraInertiaStrength value to match your needs.
Have a fantastic day!