Make Unreal REAL.
article thumbnail
이득우의 게임 수학

 

게임 엔진은 개발자 관점에서 바라보는 게임 공간과 게이머 관점에서 바라보는 게임 공간 두 가지 화면을 제공해야 한다.

 

개발자 관점 (좌) / 게이머 관점 (우)

 

카메라가 출력할 화면의 해상도 정보를 갖고 월드의 일부를 그려낸 화면을 뷰포트(Viewport)라고 한다.

 

카메라에 설정된 뷰포트 정보를 바탕으로 월드 공간의 일부분을 렌더링하기 위해서는 카메라를 중심으로 물체의 트랜스폼을 재조정하는 작업이 필요하다.

  • 카메라를 중심으로 변환한 공간을 뷰 공간(View space)이라고 한다.

 

 

월드 공간에서 게임 오브젝트 A가 (10, 10)에 위치하고 카메라가 (-10, -10)에 위치한다면, 카메라를 기준으로 한 A의 상대적인 위치는 (20, 20)이다.

 

 

카메라를 기준으로 한 뷰 공간에서 월드 공간의 원점 좌표는 (10, 10)이다.

 

이는 월드 공간의 모든 위치 좌표에 (10, 10)을 더해주면, 뷰 공간의 좌표를 얻을 수 있음을 의미한다.

 

 

로컬 공간 좌표를 월드 공간 좌표로 변환해주는 모델링(M) 행렬이 있듯이, 월드 공간 좌표를 뷰 공간 좌표로 변환해주는 뷰(V) 행렬이 있다.

 

월드 공간에서의 카메라의 상대 좌표 (Wₓ, Wᵧ)를 반전시키면 뷰 공간에서의 월드 공간의 상대 좌표 (-Wₓ, -Wᵧ)를 알 수 있는데, 이는 이동 행렬의 역행렬을 사용해 계산할 수 있다.

 

 

따라서 로컬 공간의 좌표 P를 월드 공간 좌표로 변환한 후, 뷰 공간 좌표로 변환하는 행렬은 다음과 같다.

 

 

책의 예제인 CK소프트렌더러에서는 트랜스폼의 위치 값에 반대 부호를 붙여 뷰 행렬을 생성한다.

 

// 책의 예제인 CK소프트렌더러에 정의된 카메라
class CameraObject
{
public:
    CameraObject() = default;
    ~CameraObject() { }

public:
    // 트랜스폼
    TransformComponent& GetTransform() { return _Transform; }
    const TransformComponent& GetTransform() const { return _Transform; }

    // 카메라의 화면 크기를 가져오는 함수
    const ScreenPoint& GetViewportSize() const { return _ViewportSize; }

    // 카메라의 화면 크기를 설정하는 함수
    void SetViewportSize(const ScreenPoint & InViewportSize) { _ViewportSize = InViewportSize; }

    // 뷰 행렬 생성
    FORCEINLINE Matrix3x3 GetViewMatrix() const
    {
        return Matrix3x3(Vector3::UnitX, Vector3::UnitY, Vector3(-_Transform.GetPosition()));
    }

private:
    TransformComponent _Transform;
    ScreenPoint _ViewportSize;
};

 

월드 공간은 항상 카메라를 통해 렌더링되므로, 게임 엔진이 항상 카메라를 가지도록 한다.

 

// 책의 예제인 CK소프트렌더러의 게임 엔진에 선언된 메인 카메라
class GameEngine : public EngineInterface
{
public:
    // 카메라 
    FORCEINLINE CameraObject& GetMainCamera() { return _MainCamera; }
    FORCEINLINE const CameraObject& GetMainCamera() const { return _MainCamera; }

private:
    CameraObject _MainCamera;
};

'게임 수학 > 이득우의 게임 수학' 카테고리의 다른 글

오일러 각(Euler's angle)  (0) 2023.05.05
3차원 공간의 설계  (0) 2023.05.04
렌더링 파이프라인  (0) 2023.05.02
게임 엔진의 워크플로우  (0) 2023.05.01
리소스 저장소  (0) 2023.04.30
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그