11. Camera Blending과 Update
CameraBlending이란?
- 카메라의 위치를 A에서 B로 섞어주는 것을 의미합니다.
- 예를 들어 플레이어가 저격을 위해 줌을 당기고 있다가 줌을 풀 때, 당긴 상태를 B, 기본 상태를 A라고 하면
갑자기 순간이동하듯 바뀐다기보다는 카메라가 움직이며 스르륵 바뀌는데, 이 A 상태와 B 상태를 시간에 따라 적절히 섞어주는 것이 카메라 블렌딩입니다.
한번 정리하고 가면,
1. PlayerController에서 PlayerCameraManager의 Tick을 호출해줍니다.
2. PlayerCameraManager는 Player에 부착된 CameraComponent에서 업데이트된 값을 통해 렌더링합니다.
3. CameraComponent는 CameraModeStack을 소유하며, EvaluateStack을 호출해줍니다.
4. EvaluateStack에서는 UpdateStack과 BlendStack을 돌려줍니다.
오늘 학습한 내용은 UpdateStack에 대한 내용입니다.
UpdateStack은 스택의 모든 요소(CameraMode)들을 돌며, 업데이트를 진행합니다.
이 과정에서 CameraMode의 UpdateView와 UpdateBlending이 호출되며 그 과정에서
BlendWeight (가중치)가 1.0f가 된 요소들을 스택에서 제거합니다.
BlendWeight란 BlendAlpha값을 기준으로 비선형 보간되어 계산된 가중치(보간값)입니다.
float BlendAlpha += (DeltaTime / BlendTime) 수식을 통해 BlendAlpha 값을 계산한 후, 이 Alpha값으로 실제 보간을 진행합니다.
InterpEaseIn 함수는 처음 0.5까지는 빠르게 증가하다가 점차 느려지는 비선형 보간 방식입니다.
카메라 전환의 경우 워낙 빈번하게 일어나기도 하고 그 때마다 선형적으로 변하면 심심하니 이런 식의 보간 방법을 진행하는 것으로 보입니다.
UpdateView 함수는 CameraMode가 멤버변수로 들고 있는 CameraModeView의 값들을 업데이트해주는 함수입니다.
struct FHmCameraModeView
{
FHmCameraModeView();
FVector Location;
FRotator Rotation;
FRotator ControlRotation;
float FieldOfView;
};
이 함수를 업데이트할 때 Pivot이라는 중요한 개념이 나옵니다.
Pivot이란 카메라를 회전시키는 회전 축이라고 볼 수 있습니다.
Lyra에서 제가 구현할 시점은 우선 3인칭 시점이기 때문에 카메라가 뒤쪽에서 찍고 있어야 하며,
플레이어가 회전한다면 카메라 또한 회전해야 합니다. 그러므로 카메라가 Pivot 없이 혼자서 회전할 일은 없습니다.
따라서 Pivot은 플레이어의 위치가 되어야 하므로, Location, Rotation은 모두 플레이어가 기준이 되어야 합니다.
void UHmCameraMode::UpdateView(float DeltaTime)
{
// Pivot이란? 카메라를 회전시키는 회전 축
// 카메라는 플레이어를 보고있어야 하므로 자신의 로컬 좌표를 중심으로 돌 일이 없기 때문
FVector PivotLocation = GetPivotLocation();
FRotator PivotRotation = GetPivotRotation();
// Pitch는 바라보는 방향을 기준으로 가로 축(X축)이라고 보면 됨
// X축을 기준으로 회전하니 위, 아래로 회전하는 것
PivotRotation.Pitch = FMath::ClampAngle(PivotRotation.Pitch, ViewPitchMin, ViewPitchMax);
View.Location = PivotLocation;
View.Rotation = PivotRotation;
View.ControlRotation = View.Rotation;
View.FieldOfView = FieldOfView;
}
아마 내일쯤 포스팅에서 카메라에 관한 내용이 마무리될 것 같습니다.