카메라 종류 및 구조

언3 에서 미리 정의되어 있는 카메라의 종류 및 구조에 대해 개략적으로 살펴본다.

사용할 카메라 선언

PlayerController 에서 CameraClass 를 선언할 수 있다.

PlayerController.uc
class PlayerController extends Controller
...
 
var const class<Camera>     CameraClass;       // PlayerController 가 사용할 카메라 이름

Camera 클래스

Engine 이 제공하는 Camera.uc 의 역할은 다음과 같다.

  • 카메라의 위치/회전 값을 가진다. (따라서 최종 ViewMatrix 는 이놈으로부터 얻는다.)
  • FOV 값을 가진다.
  • Color fading 기능을 지원한다.
  • 별도의 PostProcess 세팅을 가지며 alpha 값을 토대로 기본 PostProcess 와 블랜드를 한다.
  • 두 개의 ViewTarget 간 블랜드를 한다.
  • CameraModifier 로 이동 및 회전을 줄 수 있다. (예. camera shake)
  • CameraLensEffect 효과를 줄 수 있다.
  • CameraAnimation 을 관리 및 재생한다.

중요한 것은 이 정도이고 나머지는 알아서 찾아보자.

도움 클래스

Engine 이 제공하는 Camera 클래스만으로도 게임에 활용할 수 있겠지만 GameFramework 레이어가 제공하는 여러 Camera 관련 도움 클래스들을 이용하면 다양한 기능이 구현 가능하다. (물론 직접 구현하겠다면야 ;-))

Camera 를 대체할 GamePlayerCamera

GamePlayerCamera.uc
class GamePlayerCamera extends Camera

GamePlayerCamera 는 다음의 기능을 가지고 있다.

  • 두가지 이상 서로 다른 방식으로 작동하는 카메라 Type 을 가지고 원하는 것을 택하여 사용할 수 있다. (ThirdPersonCam, FixedCam 이름을 보면 감이 오시리라.)
  • 별도의 FOV 를 가지고 원할 경우 이를 override 할 수 있다.
  • Type 간 보간을 지원한다.

중요한 것은 이 정도인데 여기서 핵심은 첫번째 내용이다. 이 놈을 상속받아 원하는 Camera Type 을 여러개 추가한 후 상황에 맞게 바꿔쓸 수 있다.

예를 들어 플레이어에 붙어다니도록 구현된 ThirdPersonCam 과 CameraActor 에 붙어서 따라다니도록 구현된 FixedCamera (이들은 Engine 기본 제공) 중 원하는 것을 선택하여 사용할 수 있다.

FindBestCameraType 함수를 상속받으면 원하는 Type 의 카메라를 선별하는 방식을 정의할 수 있다.

Type 과 Mode

위에서 (카메라) Type 에 대해서 잠깐 언급 하였다. GamePlayerCamera 는 두가지 Type 의 카메라세팅을 가지고 있는데

GamePlayerCamera.uc
...
var(Camera) editinline transient GameCameraBase       ThirdPersonCam;   // 플레이어를 따라다니는 카메라
var(Camera) editinline transient GameCameraBase       FixedCam;         // 특정 장소에 고정되어 사용되는 카메라

보면 알겠지만 Type 으로 표현한 클래스는 GameCameraBase 를 상속받아 구현하게 된다. 역시 GameFramework 가 제공하는 기본 Type 두 가지가 있다.

GameThirdPersonCamera

GameThirdPersonCamera.uc
class GameThirdPersonCamera extends GameCameraBase
...

기능은 다음과 같다.

  • 플레이어를 쫒아댕긴다.
  • 카메라가 지형/지물을 통과하는 것을 방지한다.
  • 여러 Mode 를 가지고 있으며 이들 중 하나를 선택하여 사용한다.

느낌이 왔겠지만 중요한 것은 세번째다. 위 GamePlayerCamera 가 여러 Type 을 거닐었듯이 이 GameThirdPersonCamera 라는 Type 은 여러 Mode 들을 거닐고 원하는 놈을 택하여 사용한다. 대략 코드를 보자.

GameThirdPersonCamera.uc
...
var() proptected editinline GameThirdPersonCameraMode    ThirdPersonCamDefault;      // 기본 Mode
...
 
function GameThirdPersonCameraMode FindBestCameraMode( Pawn P )
{
    ...
    return WantedMode;
}

이 클래스에선 Mode 가 (리스트리 되어있지 않고) 하나 뿐이지만 실제론 다양한 모드들이 있을 수 있겠다.

이해를 돕기 위해 아래와 같은 Mode 들이 추가될 수 있다. (실제 GoW2GoW3 에서 사용 예)

  • 기본 모드
  • 뛰기 모드
  • 조준 모드
  • 처형 모드
카메라 Mode

각각의 Mode 는 일종의 설정값들을 가지고 있는 구조체라고도 볼 수 있다.1)

백문이 불여일견

GameThirdPersonCameraMode.uc
class GameThirdPersonCameraMode extends Object
...
 
var transient config float        FOVAngle;             // FOV
var() float                       BlendTime;            // 이 Mode 로 진입할 때의 blend in 시간
var() const protected bool        bLockedToViewTarget;  // ViewTarget 만 보도록 lock 걸 것인가?
...    // 그 외 loc / rot 에 대한 spring, origin 으로부터의 offset 등 대표될만한 camera 속성들.

여러분이 생각하는 바로 그런 속성들이 Mode 에 존재한다.

GameFixedCamera

GameFixedCamera .uc
class GameFixedCamera extends GameCameraBase
...

기능은 다음과 같다.

  • CameraActor 에 붙여서 따라다니게 할 수 있다.

위 기능밖에 없다. 8-O

한눈에 보는 구조

이해를 돕기 위해 TPS 게임에 대응하여 표현해 보았다.

  • 게임에서 사용할 카메라
    • 플레이어 카메라 (type1)
      • 기본 (mode1)
      • 뛰기 (mode2)
      • 조준 (mode3)
      • 처형 (mode4)
    • 고정 카메라 (type2)
1) 이를 Archetype 을 불러오는 구조로 구현한 후 에디터에서 수정 가능하게끔 하는 것이 좋다.