게임 엔진

Woogie_·2025년 5월 22일

게임 수학

목록 보기
14/15

로컬 공간과 월드 공간

  • 여러 점들이 모여 하나의 물체를 형성하는데 하나의 물체를 그리기 위해서는 원점 (0,0,1)(0, 0, 1)을 중심으로 각점의 상대적인 위치를 지정해야 함

  • 이렇게 물체를 그리는데 사용하는 공간을 로컬 공간 (Local Space) 라고 함

  • 그런데 게임은 하나의 물체가 아닌 하나의 공간에 여러 물체를 배치하고 주인공이 움직이면서 공간을 탐험해야 함

  • 이를 위해서는 각 물체를 구분할 수 있는 개별 공간이 별도로 필요

  • 그래서 게임 스테이지를 구성하는데 사용되는 별도의 공간을 월드 공간 (World Space) 라고 함

  • 게임 스테이지는 월드 공간의 바탕 위에서 로컬 공간이 선형 변환 되어 그 위에 덧 씌워진 상태로 구성되는 구조를 가짐

  • 월드 공간에 배치된 로컬 공간은 모든 물체의 고유한 위치를 식별해주는 고유한 값이 부여됨
  • 여기에 사용되는 값은 크기, 회전, 위치의 세 가지가 사용되며 이는 앞서 언급한 세 가지의 아핀 변환을 의미

트랜스폼 행렬

  • 세 가지 아핀 변환을 각각 크기(S), 회전(R), 이동(T)라고 했을 때 세 변환을 순서대로 적용한 결과는 다음의 경우의 수로 정리 가능
SRTSTRTSRTRSRTSRSTS\cdot R\cdot T \\ S\cdot T\cdot R \\ T\cdot S\cdot R \\ T\cdot R\cdot S \\ R\cdot T\cdot S \\ R\cdot S\cdot T
  • 만일 중간에 이동 변환을 적용하는 경우에는 하단의 그림과 같이 최종 결과로 나타난 위치는 사용자 입장에서는 식별하기가 어려워짐
  • 따라서 이동 변환은 가장 마지막에 적용하는 것이 편리

  • 그렇다면 우리가 고려할 변환은 아래의 두 가지로 나뉨
TSRTRST\cdot S\cdot R \\ T\cdot R\cdot S
  • 위 두 변환에서 아래 상황을 감안하면 크기변환 이후에 회전변환을 적용하는 것이 바람직

  • 따라서 다음과 같은 형태로 변환 순서가 결정되며 이를 모델링 행렬이라 함
M=TRSM = TRS

트랜스폼의 관리

  • 트랜스폼 변환에 관련있는 세 가지 데이터를 정리하면 다음과 같음
    • 크기 (Vector2)
    • 회전 (각)
    • 이동 (Vector2)
  • 실제 작업자가 공간에 물체를 배치할 때에는 위의 데이터를 지정하는 방식으로 사용하고 게임 엔진들도 트랜스폼을 지정하도록 UI를 제공

언리얼 엔진에서의 트랜스폼 설정

  • 사용자가 입력한 정보는 내부적으로는 모델링 행렬로 변환
  • 각 입력에 기반한 정보를 기반으로 행렬을 계산하면 모델링 행렬은 다음과 같이 계산
S=[sx000sy0001]R=[cosθsinθ0sinθcosθ0001]T=[10tx01ty001]M=TRS=[cosθsxsinθsytxsinθsxcosθsyty001]S=\begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{bmatrix} \\ R=\begin{bmatrix} cos\theta & -sin\theta & 0 \\ sin\theta & cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix}\\ T=\begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix}\\ M=TRS= \begin{bmatrix} cos\theta\cdot s_x & -sin\theta\cdot s_y & t_x \\ sin\theta\cdot s_x & cos\theta\cdot s_y & t_y \\ 0 & 0 & 1 \end{bmatrix}\\

게임 렌더링의 진행 과정

  • 게임이 원활하게 동작하기 위해서는 게임의 월드 공간에 배치된 다수의 물체를 효율적이고 체계적으로 관리할 체계가 필요

  • 스테이지를 관리하기 위한 객체를 개발 단계에서는 씬 (Scene) 이라고 하며 씬에 속한 각 물체는 월드 공간을 기준으로 어디에 배치되어 있는지를 알려주는 트랜스폼 정보가 지정

  • 이러한 트랜스폼 정보는 물체 단위로 관리되기 때문에 물체를 관리할 단위가 필요한데 이를 게임 오브젝트 (Game Object) 혹은 액터 (Actor) 라고 함

  • 이러한 구조를 그림으로 나타내면 다음과 같음

씬과 게임 오브젝트의 구조

  • 매 프레임마다 씬에 속한 게임 오브젝트의 최종 트랜스폼 정보가 확정되어야 로컬 공간에 있는 메시 정보로부터 점을 변환해 최종 삼각형이 그려짐

  • 따라서 게임의 진행은 게임 오브젝트의 최종 트랜스폼을 확정하는 단계와 최종 트랜스폼으로부터 행렬을 생성한 후 메시의 정점을 곱해 변환하는 작업의 두 단계로 나누어 짐

  • 이를 각각 게임 로직과 렌더링 로직으로 구분 하면

    • 게임 로직 : 게임 오브젝트의 트랜스폼을 확정하는 작업. 실제 렌더링 관련된 작업은 발생하지 않음.
    • 렌더링 로직 : 로컬 공간을 기준으로 저장된 메시의 정점 정보를 월드 공간을 기준으로 재배치하고 각 삼각형을 그리는 작업. 메시의 삼각형 위치를 확정하고 렌더링 관련된 작업을 진행함.

게임 리소스의 관리

  • 게임에는 씬 뿐만 아니라 게임에 사용되는 데이터를 관리하기 위한 체계적이고 효율적인 시스템이 필요

  • 게임에 사용되는 데이터를 게임 리소스(Game Resource) 혹은 게임 애셋(Game Asset)이라고 함

  • 게임 리소스는 씬과 별개로 구성되어야 하는데 게임 오브젝트마다 동일한 메시 정보는 중복해서 사용되는 일이 많기 때문

  • 예를 들어 100개의 동일한 몬스터가 스테이지의 곳곳에 배치된다면 몬스터에 대한 메시 정보를 100개로 복제해 관리하기보다 하나의 몬스터 메시를 100개의 게임 오브젝트가 공유해서 사용하는 편이 보다 효율적이기 때문

  • 따라서 게임 리소스마다 고유의 키를 부여하고 게임 오브젝트는 부여된 키를 가지고 접근하는 형태로 관리되는 것이 일반적

  • 이러한 게임 애셋의 정보를 저장한 저장소를 리소스 리파지토리 라고 함

  • 이러한 리소스 리파지토리는 씬을 구성하는 게임 오브젝트들이 필요에 맞게 사용하며 이를 사용하는 방법은 다음과 같음

profile
상상을 구현하는 개발자

0개의 댓글