Graphics

[Graphics] MVP(Model View Projection Matrix)

dev_hyunn 2025. 3. 31. 20:00

오늘 다루어볼 주제는 (Model View Projection Matrix) 줄여서 MVP에 대해서 알아보려고 합니다.

이 주제를 시작하게 된 계기는 많은 프로젝트를 진행하며, Unity Engine을 활용하여 오브젝트들을 화면에 렌더링을 진행하며, MVP에 대해 정확히 이해하지 못하고, 설명하지 못하는 나를 보며 이 내용에 대해 한번 정리를 해봐야겠다고 생각이 들어 시작하게 되었습니다.

 

각 부분별 나눠서 정리를 해보겠습니다. 

 

Model Matrix

Model 이란, 2D 화면에 렌더링 되어 표시될 Object(피사체, 객체)라고 정리할 수 있습니다. 즉 화면에 나타내고자 하는 객체입니다. 아래의 예시에서는 직육면체 큐브라고 생각하면 됩니다. 이 모델은 고유의 Matrix(행렬) 값을 가지고 있습니다.

 

View Matrix

View 란, 위에서 언급한 Model객체를 바라보고 있는 카메라를 의미합니다. 해당 오브젝트를 렌더링을 하고 있는 유니티 Main Camera라를 예시로 들 수 있습니다. 해당 카메라도 마찬가지로 고유의 Matrix(행렬) 값을 가지게 됩니다.

 

Projection Matrix

Proejction Matrix, 단어에서 알 수 있듯이 Projection(투영, 투사) 행렬로, 3D좌표(ModelMatrix)를 2D 스크린(View)에 어떻게 에 투영, 투사하는 고유의 행렬값입니다.

 

위 세 개의 Matrix 행렬을 연산한 값을 통해 P * V * M 을통해 오브젝트의 월드 좌표의 점의 위치를 화면에 표현해 줍니다. 아래 예시를 통해 각 Matrix에 대해서 추가적으로 이해해 보도록 하겠습니다. 

 

 

Model, View Matrix의 행렬 구조

 

Model Matrix (Unity 예시)

위에서 이야기했던 것처럼 Model Matrix는 렌더링 될 오브젝트의 행렬값입니다. 이는 Trnasform을 통해 알아볼 수 있습니다.

CubeTransform (Model)
Matrix Print

위 Cube의 Transform의 Model Matrix를 출력해본결와 두 번째 이미지와 같은 로그를 확인할 수 있습니다.
우리가 화면에서 보는 큐브는 3D여도 2D 형태로 보이기 때문에 위에서 말한 MVP M * V * P의 공식에 따라 화면에 렌더링이 되는 것이 달라집니다. Cube의 Transform이 변경되면 Matrix가 변경되고 이로 인해 화면에 렌더링 되는 것이 달라지는 것입니다. Model Matrix는 아래와 같은 형태로 표현됩니다.

 

View Matrix (Unity 예시)

View Matrix는 Model(object)를 보는 카메라의 Matrix 행렬로, Unity 상에서는 MainCamera의 Transform을 기반으로 Matrix행렬을 구할 수 있습니다.

View Matrix Print

Projection Matrix 

Projection Matrix는 카메라의 Near , far, FieldOf View Axis, Field of View, Projection에 따라서 해당 투영행렬 Matrix가 변경되고, 이로 인해 오브젝트의 화면 렌더링이 계속해서 변경됩니다.
각 프로퍼티의 속성값은 아래와 같습니다.

 

  • Near : 렌더링을 하기에 가장 가까운 거리 
    • 카메라 View Projection으로부터 x m이후부터 렌더링을 진행한다.
  • Projection : Perspective, Orthograhic
    • Perspective : 3인칭 시점으로 사람의 시야각처럼 투영, 렌더링을 진행
    • Orhograhics : 3D Object를 2D로 프린팅 하여 원근감 없이 투영, 렌더링을 진행.
  • Field of View Axis : Vertical, horizontal 
    • FOV Axis : Camera의 시야각을 수평, or 수직 기준으로 할지 지정
  • Field of View : float value
    • Camera의 시야각 위에서 정한 수평 or 수직 기준으로 얼마큼 넓게 투영 및 렌더링을 진행.

Camera의 Projection Matrix 속성

 

MVP 연산에 대해 알아보기 전에 행렬이 익숙하지 않으니, 행렬의 곱셈을 먼저 알아보도록 하겠습니다.

아래는 4x4 Matrix 행렬의 예시 A, B 행렬의 곱셈을 풀이해 보겠습니다.

A = [ [1,  2,  3,  4],
      [5,  6,  7,  8],
      [1,  0,  1,  0],
      [0,  1,  0,  1] ]

B = [ [2,  0,  0,  0],
      [0,  2,  0,  0],
      [0,  0,  2,  0],
      [0,  0,  0,  2] ]

 

위와 같은 A x B = C라고 가정할 때 A x B 행렬의 결과 C행렬은  A의 행 x B의 열 의 행렬이 나타나게 됩니다. 

여기서는 두 행렬 A, B 가 4x4로 동일하므로 C 행렬 역시 4x4 행렬이 나타나게 됩니다.

 

C = [ [(0,0),  (0,1),  (0,2),  (0,3)],
      [(1,0),  (1,1),  (1,2),  (1,3)],
      [(2,0),  (2,1),  (2,2),  (2,3)],
      [(3,0),  (3,1),  (3,2),  (3,3)]]

 

임의로 C행렬이 위와 같다고 가정하겠습니다. 4x4 기준으로 (열, 행)으로 구분하여 각 위치의 값을 구해야 됩니다.
C [0,0] = A의 열 x B의 행을 곱하여 값을 구합니다.
즉. A의 1,2,3,4 x B의 2,0,0,0을 곱을 진행합니다. C[0,0] = (1x2) + (2x0) + (3x0) + (4x0) 
C[0,0] = 2라는 값이 도출되게 됩니다 이를 반복하여, 총 15자리의 각행렬의 요소의 값을 구하면 아래와 같이 나오게 됩니다.  
C = [ [ 2,   4,   6,   8 ],
      [10,  12,  14,  16 ],
      [ 2,   0,   2,   0 ],
      [ 0,   2,   0,   2 ] ]

 

그러면 여기서 궁금한 점 MVP Matrix 연산은 M x V x P를 진행하게 되면 4x4의 행렬이 나타나게 되는데 이는 아직 3D 상에 있는 Clipping-volume Space 공간에 있는 4x4 Matrix입니다. 이를 Screen에 Display 해주기 위해서는 아래와 같은 추가적인 작업이 필요합니다. 

 

위 내용에서 틀린 부분이 생겨 수정하게 되었습니다. 유니티 상에 있는 Cube 오브젝트는 4x4 Model Matrix를 가지게 됩니다. 하지만 우리가 Screen (화면)에 보는 것은 각 Vertex를 Screen 상에 렌더링 하는 방식으로, Model Matrix에서부터 연산하는 것이 아닌, Vertex Matrix 즉 [x, y, z,1] Vertex Matrix를 기준으로 Model Matrix, View Matrix, Projection Matrix를 진행하여 1x4 Matrix 행렬을 표현하게 됩니다. 

 

Vertex 기준으로 위 Matrix 행렬들을 연산하게 되면 최종적으로 [x', y', z', w'] 1x4 Matrix행렬의 Clipping volume Space 공간에 위치하게 됩니다. 이를 각 x,y,z 좌표를 w'로 나누게 되면 Perspective Divide를 진행하여 스크린 좌표에 표현하게 됩니다.