본문 바로가기
유니티 공부/Unity

Unity - 유니티 수학(+) Model Matrix, View Matrix, Projection Matrix)

by 코딩하는 돼징 2024. 6. 1.
반응형

파이프라인 공부를 하던 중 Vertex Shading부분에서 많은 행렬들이 나오는데 더 자세한 이해를 필요로 하는 것 같아 게시글을 작성하게 되었습니다 :)

 

현실 세계의 공간 vs 수학의 공간

우리가 사는 현실 세계와 게임이 모방한 가상 세계는 모두 일정한 규칙과 질서에 따라 움직인다. 이러한 규칙을 설명하기 위해 수학적 개념이 사용되며, 그 중 중요한 것이 바로 벡터와 벡터 공간이다.

 

벡터 공간이란?

벡터들의 집합으로, 벡터들이 특정 규칙에 따라 더해지거나 스칼라에 의해 곱해질 수 있는 공간을 말한다. 벡터 공간의 구성 요소가 벡터들이다. 벡터 공간을 이해하는 것은 벡터를 제대로 이해하는데 필수적이며 이는 나아가 행렬을 이해하는데도 중요하다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

 

벡터 공간에서의 벡터 조합

벡터 공간 내에서 벡터들을 조합하는 방법을 이해하는 것은 매우 중요하다. 예를 들어 벡터 공간안에서 서로 영향을 미치지 않는 두 벡터를 찾아야 하는 경우 이들은 서로 직각을 이루며 이 두 벡터를 조합하여 다른 모든 방향의 벡터를 만들 수 있다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

그러므로 Vector Span은 벡터 공간 내의 벡터들이 특정 벡터 집합을 통해 생성할 수 있는 모든 벡터들의 집합을 말한다.

 

벡터 공간에의 기저 벡터

기저벡터는 백터 공간 내에서 모든 벡터를 표현할 수 있는 최소한의 벡터 집합이다. 기저 벡터의 갯수를 통해서 몇차원인지 결정된다. 수학에서 벡터 공간의 차원에는 제한이 없지만 게임은 3차원만 신경쓰면 된다. 왜냐하면 우리의 인지 범위가 3차원 공간에 한정되어있기 때문이다.


행렬과 선형 변환

선형 변환이란 벡터 공간이 변형되어도 원점에서부터 시작하는 선형적 성질이 유지되는 변환을 말한다. 이 변환은 벡터들을 선형적으로 변형시켜 새로운 벡터들을 만들어내지만, 그 관계의 선형성(곧바로 연결되는 직선의 형태)은 유지된다.

 

기저 벡터를 바꾸게 되면 어떻게 될까?

기저 벡터란 벡터 공간에서 기준이 되는 벡터들이다. 이 벡터들을 바꾸면 공간을 다양한 형태로 변형할 수 있다. 공간 변형을 설계하는 방법이 행렬을 사용하는 것이다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

예시 - 오른속 법칙과 회전

x축을 왼쪽으로 y축을 오른쪽으로 돌리면 시계 방향으로 90도 회전하게 되서 아래와 같이 나온다. X축은 -Y축으로 Y축은 X축으로 이동한다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s


행렬 곱셈

기존 공간의 벡터를 새로운 공간의 벡터로 변환하는 과정이다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

대표적인 예로 유니티 Transform와 MVP matrix가 있다.

01 MVP matrix = P V M

1) Model Matrix

서로 다른 공간에 있던 오브젝트들을 모델 행렬은 로컬 좌표계에서 원드 좌표계로 변환한다. 이는 오브젝트의 위치, 회전, 크기 변환을 적용한다. 각 오브젝트마다 고유한 모델 행렬을 가진다.

2) View Matrix

월드 좌표계를 카메라 좌표계로 변환한다. 이는 카메라의 위치와 방향에 따라 월드 공간을 카메라의 시점으로 변환한다.

3) Projection Matrix

카메라 좌표계를 클립 좌표계로 변환한다. 이 행렬은 3D 장면을 2D화면에 투영하는 역할을 한다.

Perspective Projection (원근 투영): 원근감을 주어 먼 객체는 작게, 가까운 객체는 크게 보이게 함.

Orthographic Projection (직교 투영): 객체의 크기를 거리에 상관없이 일정하게 유지.

https://charlezz.com/?p=960

 

// 예제: 월드 좌표를 스크린 좌표로 변환
Vector3 worldPosition = someGameObject.transform.position;

// 1. 월드 좌표 → 카메라 좌표 (뷰 행렬 적용)
Vector3 cameraPosition = Camera.main.worldToCameraMatrix.MultiplyPoint(worldPosition);

// 2. 카메라 좌표 → 클립 좌표 (투영 행렬 적용)
Vector3 clipPosition = Camera.main.projectionMatrix.MultiplyPoint(cameraPosition);

// 3. 클립 좌표 → 스크린 좌표
Vector3 screenPosition = Camera.main.WorldToScreenPoint(worldPosition);

// 결과 출력
Debug.Log("Screen Position: " + screenPosition);

02 Unity Transform

Transform 을 구성하는 삼대요소는 오브젝트의 위치 , 회전, 스케일이 있다.

1) 스케일 변환

벡터의 크기를 변환시킨다. 

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

2) 회전 변환

두 표준 기저 벡터가 변했을 때 이 두 표준 기저 벡터가 가지고 있었던 성질을 그대로 똑같이 유지해주면 회전 변환이 될 수 있다. 2차원 공간에서 두 표준 기저 벡터가 가지는 성질은 크기가 1이고 서로 직교한다. 이 성질을 계속 유지 시켜주면 회전 변환을 만들 수 있다. 

 

직교하는 두 개의 표준 기저 벡터에 임의의 각이 주어졌을때 좌표가 어떻게 변화되는지를 삼각함수를 사용하여 구할 수 있다. 2차원 평면의 회전 행렬은 두 기저벡터가 변화된 값을 열로 하나씩 배치된 모양을 가진다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

3) 이동은?

이동을 구하기 위해서는 아래 아핀(affine)공간과 점을 이해해야한다.

 


아핀 공간과 점

01 2차원 공간에서 한쪽으로 밀기(Shear) - 선형 변환

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

공간을 y축 방향으로 밀어버린 후, y = 1 영역을 살펴보면 x값이 이동한 만큼 변한다. y = 0영역을 살펴보면 x값은 그대로 유지된다. 그러므로 1차원 이동 변환 =  2차원 밀기 변환이라고 볼 수 있다.


02 3차원 공간에서의 밀기변환

z = 1인 특수한 경우만 생각하고, 이를 2차원 변환이라고 생각하자 그러면 2차원 이동변환은 3차원 밀기변환이라고 생각할 수 있다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

이동을 위한 새로운 규칙

한 차원을 높인 후 마지막 차원의 값이 1인 영역만 사용하자. 이 영역은 우리가 원하는대로 이동 가능하다.

이동 가능한 노란색 영영의 구성요소를 특별히 점(Point)이라고 부르자 그러므로 점 = 이동 가능한 요소이다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s


아핀 공간(Affine Space)란?

점과 벡터로 구성된 공간으로 점의 위치를 벡터로 표현할 수 있다. 이 공간에서는 점과 벡터간의 연산이 가능하다. 그러므로 점은 아핀 공간에서 특정 위치를 나타내는 요소이다. 보통 동차 좌표를 사용하여 표현되며 마지막 좌표 값이 1인 형태로 나타난다. 

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

만약 아핀 공간에서 점을 이동시키려면?

Transform을 유지하기 위해서는 점에 관련된 선형 변환의 결과는 항상 점으로 귀결되어야 한다.

그러므로 Transform 가능한 요소는 = 점(Point), 점의 이동 수단 = 이동 벡터(Displacement Vector)이므로 점(z=1)과 이동 벡터(z=0)로 구성된 공간이다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

3D Transform

게임에서 3D Transform을 구현하려면 4차원 공간이 필요하다. 이동 가능한 3차원 공간 = 4차원 공간(x,y,z,w)의 일부 영역이다. 간단히 말해 3차원 공간은 4차원 공간에서 w=1인 영역이다.

https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s

유니티에서는 변환행렬을 제공해준다. 이론적으로 3d 공간의 요소는 4가지지만 실제로는 x,y,z 만 가지는 Vector3를 사용한다.

 

 

 

 

 

 

 

본 게시글은 https://www.youtube.com/watch?v=nY6cZOY3VOs&list=LL&index=25&t=985s 참고하여 작성하였습니다.

 

 

 

 

 

 

 

 

반응형

댓글