컴퓨터 화면은 좌표로 이뤄져 있다. 특정 도형은 화면의 좌표 위에 존재하게 되고 만약 사각형이 있다고 가정할 경우 좌표에 사각형의 네 각에 해당하는 정점(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 |
댓글