본문 바로가기

Unreal

[Unreal] Lyra 프로젝트 분석 - 04. Camera

CameraManager는 PlayerController에 CameraComponent는 Character에 만든다.

플레이어 컨트롤러가 다른 캐릭터에게 부착될 수도 있기 때문에 CameraManager을

캐릭터에 종속되지 않도록 컨트롤러에 붙이는 것이 합리적이다.

 

CameraMode는 FPS에서 조준을 할 때, 차에 탈 때, 기본 상태에서 시점이 모두 다른데,

Lyra에서는 이것들을 모두 각각의 CameraMode로 만들었다. 

CameraMode들은 스택에 담는다. 그래서 현재 모드와 다음 모드를 보간해 자연스러운 시점 변경을 한다.

 

CameraManager: 실질적으로 보이는 시야를 결정, 출력

CameraComponent: 보이는 시야를 찍는 것은 맞는데 정보를 종합해 출력하는 것은 Manager

 

 

 

CameraComponent

UpdateCameraMode

매프레임 실행되며 델리게이트에 바인딩된 함수가 반환하는 카메라모드를 스택에 저장한다. (PushCameraMode함수)

 

HeroComponent에서 DetermineCameraMode를 델리게이트에 바인딩하는데 PawnData의 CameraMode를 반환하는 함수다. 바인딩은 HandleChangeInitState에서 DataInitialized되는 경우, 즉 모든 데이터가 준비돼서 초기화를 진행할 때 한다.

 

 

 

CameraMode

GetCameraModeInstance

CameraModeInstance는 만든 모드들을 캐싱해놓는 Array다. CameraModeInstance에 모드가 있다면 그걸 반환하고

없다면 새로운 모드를 생성해 CameraModeInstance에 추가하는 역할을 하는 함수다.

 

PushCameraMode

CameraModeStack은 새로운 값이 추가되면 index 0번에 들어간다. 그리고 자리를 내기 위해 기존에 있던 값들을 한칸씩 다음 자리로 옮긴다. 스택에 들어있던 값이 추가되면 새로 추가되는 것이 아닌 기존 값의 순서가 0번으로 바뀐다. 

이 때 보간을 유지하기 위해서 ExistingStackContribution 값을 이용해 계산한다. (수학계산 - pdf,cdf검색)

최신 데이터일수록 0에 가깝고 오래된 데이터일수록 크기가 크다는 것을 기억해야 한다.

 

EvaluateStack

UpdateStack으로 0->Num으로 최신부터 오래된쪽으로 CameraMode 업데이트

BlendStack으로 Num->0으로 오래된쪽에서 최신으로 CameraMode 업데이트

 

UpdateStack

BlendWeight이 1을 넘어가면 더 이상 업데이트하지 않는다. 1을 넘어가면 그 다음 index부터 모든 Mode들을 날려버린다. 

이것이 일반적인 스택과 달리 가장 나중에 넣는 (최신) 데이터가 index 0번에 들어가는 이유다. 그 다음 index부터

날리기 때문에 CameraMode는 스택에 적어도 한개가 남는다.

 

CameraMode->UpdateCameraMode

UpdateStack에서 UpdateView로 View를 업데이트, UpdateBlending으로 BlendAlpha를 계산한다.

 

참고로 BlendWeight은 각각의 모드마다 존재한다. 자꾸 한 스택에 BlendWeight도 한 개라고 헷갈려서 적어놓음.

 

UpdateView

CameraComponent Owner인 Character 활용해 PivotLocation/Rotation 반환하고 그에 따른 View를 업데이트

 

UpdateBlending

BlendAlpha는 시간이 지남에 따라 증가하는데 이것을 Linear, EaseIn, EaseOut 등 보간 방식에 따른 보간 함수에 집어넣어

보간된 BlendWeight값을 도출한다. 

 

이 과정을 마치면 BlendWeight이 1이하인 모드들만 남았을텐데, 이들 사이에 자연스럽게 전환을 해줘야 한다.

 

BlendStack

Update와 반대로 오래된 모드 (1에 가까운 모드) 부터 최신 모드로 보간한다.

보간하는 값은 Location ,Rotation, FOV가 있다. 오래된->최신 모드로 순회하며 BlendWeight이 1 넘어버리면 덮어쓴다.

 

 

 

CameraMode_ThirdPerson

플레이어가 사용하는 카메라 모드로 TargetOffsetCurve가 있다면 Pitch에 따라 Curve값을 Location에 추가한다.

그래서 시점의 회전에 따라 더 자연스러운 카메라 움직임을 볼 수 있다.