본문 바로가기
프로그래밍/공부

[Game] 변환행렬

by Sik.K 2022. 12. 15.

컴퓨터 화면은 좌표로 이뤄져 있다. 특정 도형은 화면의 좌표 위에 존재하게 되고 만약 사각형이 있다고 가정할 경우 좌표에 사각형의 네 각에 해당하는 정점(Vertex)가 찍혀 있을 것이다.

 

2차원 화면에서 이 네 개의 vertex는 x와 y의 좌표값을 가진다. 만약 이 도형을 움직이고, 크기를 키우거나 줄이고, 회전을 시키고 싶다면 어떻게 해야 할까.

 

단순히 좌표값을 바꾸면 된다. x 축을 기준으로 + 100을 이동하고 싶다면 네 정점의 좌표값의 x 좌표를 + 100 하게 되면 + 100만큼 이동한 것으로 보인다.

 

하지만 하나하나 이렇게 좌표를 입력하기 보단, 행렬을 이용하여 입력되는 값에 맞춰 자동으로 계산이 되게 하는 것이 훨씬 더 깔끔하게 적용이 된다.

 

이때 이용하는 것이 바로 변환행렬이다.

 

변환행렬은 벡터 좌표계의 특정 벡터의 위치를 바꾸는 데에 이용된다. 벡터는 좌표값을 가지고 있다. 2차원, 3차원 관계 없이 보통 네 개의 좌표값을 가진다. x, y, z, w 이 중 w는 나중에 설명하고 2차원의 경우 z는 0이 된다.

 

이것을 달리 말하면 좌표값은 행렬이 된다. 1 * 4의 행렬이라고 생각해도 무방하다. 결국 이 행렬에 변환행렬을 곱해주면 이동을 하고, 크기가 바뀌고, 회전을 한 결과값이 다시 좌표값으로 나오게 되는 것이다.

 

이를 S(Scale)R(Rotation)T(Transformation)이라 한다.

 

행우선 혹은 열우선을 정해 정점과 변환행렬을 곱하거나 변환행렬과 정점을 곱한 결과값이 바로 정점이 이동한 곳이 된다.

이동 행렬

vertex(1*4) * TM(4*4) or TM(4*4) * vertex(4*1)

 

크기 행렬

vertex(1*4) * SM(4*4) or SM(4*4) * vertex(4*1)

 

회전 행렬

 

vertex(1*4) * RM(4*4) or RM(4*4) * vertex(4*1)

 

특히 회전행렬의 경우, 벡터 좌표계 상에서 어느 축을 기준으로 하느냐에 따라, RMx, RMy, RMz로 종류가 나뉘는데, 2차원의 경우 회전은 z축을 기준으로 하기 때문에 여기선 RMz를 사용한다.

 

결국 vertex * S * R * T가 되는 것인데 SRT를 묶어 W라 칭하고 vertex * W로 사용하는 것도 가능하다.

'프로그래밍 > 공부' 카테고리의 다른 글

[Game] 객체의 회전 part.2  (0) 2022.12.22
[Game] 객체의 회전  (0) 2022.12.19
[Programing] 정적 & 동적 라이브러리  (0) 2022.12.15
[Game] Delta Time  (0) 2022.12.14
[C++] 싱글턴 패턴  (0) 2022.12.13

댓글