행렬로 위치, 회전, 크기 변환하기
게임 오브젝트의 Transform을 행렬로 표현하기
본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.
게임 오브젝트의 위치, 회전, 크기는 행렬로 표현할 수 있다. 2D에서 원점을 기준으로 한 변환부터 확인해보자.
크기 변환
[ sx 0 ] [ x ] = [ sx * x ]
[ 0 sy ] [ y ] [ sy * y ]
X축은 sx, Y축은 sy만큼 늘어난다. 둘 중 하나가 음수면 해당 축을 기준으로 뒤집힌다.
회전 변환
[ cosθ -sinθ ] [ x ]
[ sinθ cosθ ] [ y ]
이 행렬은 원점을 중심으로 벡터를 θ만큼 회전시킨다. Degree를 받는 함수와 Radian을 받는 함수를 섞지 않게 주의해야 한다.
이동은 왜 3×3인가?
2×2 행렬만으로는 원점을 다른 위치로 옮길 수 없다. 그래서 2D 좌표에 w = 1을 추가한 동차 좌표를 사용한다.
[ 1 0 tx ] [ x ] [ x + tx ]
[ 0 1 ty ] [ y ] = [ y + ty ]
[ 0 0 1 ] [ 1 ] [ 1 ]
3D에서는 같은 이유로 4×4 행렬을 사용한다.
순서가 결과를 바꾼다
물체를 두 배 키운 뒤 오른쪽으로 10 이동하는 것과, 먼저 이동한 뒤 전체 좌표를 두 배로 키우는 것은 결과가 다르다.
Scale → Translate
위치는 10만큼 이동
Translate → Scale
이동량까지 2배가 될 수 있음
엔진과 수학 라이브러리마다 벡터를 행으로 두는지 열로 두는지 다르므로 코드의 곱셈 순서를 문서로 확인해야 한다. 행렬 자체보다 어떤 좌표계에서 어떤 순서로 적용하는지가 더 중요하다.