게임 개발에서 공간을 다루는 것은 필수적인 개념이며, 이를 위해 벡터와 행렬이 중요한 역할을 한다. 특히 객체의 이동, 회전, 크기 변환과 같은 변환(Transformation)을 효율적으로 수행하기 위해 행렬을 활용한다.
1. 공간 개념
현실 세계 vs. 가상 세계
현실 세계 : 물체는 물리 법칙을 따르며, 3차원 공간에서 위치와 크기를 가짐
가상 세계 : 수학적으로 정의된 시스템으로, 벡터 공간과 행렬 연산을 통해 객체의 움직임을 표현
벡터(Vector)와 행렬(Matrix)의 역할
벡터 : 위치, 속도, 힘과 같은 물리적 특성을 표현 (예: v = ( x , y , z ) \mathbf{v} = (x, y, z) v = ( x , y , z ) )
행렬 : 벡터의 변환을 담당하며, 회전, 이동, 크기 조정을 효율적으로 수행
2. 선형 변환의 특징
선형 변환 : 입력 벡터에 특정한 규칙을 적용해서 새로운 벡터를 생성하는 변환을 의미.
게임에서 캐릭터 이동, 카메라 회전, 애니메이션, 충돌 판정 등에 사용된다.
선형 변환은 벡터 공간의 성질을 유지하면서 좌표를 변경하는 수학적 연산을 수행한다.
덧셈 보존 : T ( v + w ) = T ( v ) + T ( w ) T(\mathbf{v} + \mathbf{w}) = T(\mathbf{v}) + T(\mathbf{w}) T ( v + w ) = T ( v ) + T ( w )
스칼라 곱 보존 : T ( c v ) = c T ( v ) T(c \mathbf{v}) = c T(\mathbf{v}) T ( c v ) = c T ( v ) (c c c : 스칼라 값)
3. 동차 좌표계 (2D인데 3x3 행렬을 사용하는 이유)
2D 변환을 설명하는 과정에서 3×3 행렬을 사용하는 이유는 행렬 연산에서 덧셈을 표현할 수 있도록 하기 위해서다.
이동 변환을 살펴보면, 특정 좌표를 ( d x , d y ) (dx, dy) ( d x , d y ) 만큼 이동시키는 것은 기존 좌표에 단순히 이동 값을 더하는 방식이다. 하지만 행렬 곱셈에서는 곱셈 연산만 지원하고 덧셈 연산을 직접 표현할 수 없다.
예를 들어, 일반적인 2×2 행렬을 사용한 변환식을 보면:
[ x ′ y ′ ] = [ a b c d ] [ x y ] \begin{bmatrix} x{\prime} \\ y{\prime} \end{bmatrix} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} [ x ′ y ′ ] = [ a c b d ] [ x y ]
여기서 각 요소를 계산하면:
x ′ = a ⋅ x + b ⋅ y x{\prime} = a \cdot x + b \cdot y x ′ = a ⋅ x + b ⋅ y
y ′ = c ⋅ x + d ⋅ y y{\prime} = c \cdot x + d \cdot y y ′ = c ⋅ x + d ⋅ y
그러나 이동 변환의 공식인 x ′ = x + d x x{\prime} = x + dx x ′ = x + d x , y ′ = y + d y y{\prime} = y + dy y ′ = y + d y 를 비교하면, 덧셈을 표현할 방법이 없음을 알 수 있다.
이를 해결하기 위해 좌표를 한 차원 증가시켜 3×3 행렬을 사용 하는 것이 동차 좌표계(Homogeneous Coordinates)다. 동차 좌표계에서는 기존의 2D 좌표 ( x , y ) (x, y) ( x , y ) 를 ( x , y , 1 ) (x, y, 1) ( x , y , 1 ) 로 확장해서 다음과 같이 표현한다:
[ x ′ y ′ 1 ] = [ 1 0 d x 0 1 d y 0 0 1 ] [ x y 1 ] \begin{bmatrix} x{\prime} \\ y{\prime} \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & dx \\ 0 & 1 & dy \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣ ⎢ ⎡ x ′ y ′ 1 ⎦ ⎥ ⎤ = ⎣ ⎢ ⎡ 1 0 0 0 1 0 d x d y 1 ⎦ ⎥ ⎤ ⎣ ⎢ ⎡ x y 1 ⎦ ⎥ ⎤
이제 행렬 곱셈을 수행하면:
x ′ = 1 ⋅ x + 0 ⋅ y + d x ⋅ 1 = x + d x x{\prime} = 1 \cdot x + 0 \cdot y + dx \cdot 1 = x + dx x ′ = 1 ⋅ x + 0 ⋅ y + d x ⋅ 1 = x + d x
y ′ = 0 ⋅ x + 1 ⋅ y + d y ⋅ 1 = y + d y y{\prime} = 0 \cdot x + 1 \cdot y + dy \cdot 1 = y + dy y ′ = 0 ⋅ x + 1 ⋅ y + d y ⋅ 1 = y + d y
이처럼 동차 좌표계를 사용하면 이동 변환도 행렬 곱셈으로 표현할 수 있다. 이는 회전, 확대, 축소 등의 변환을 하나의 행렬 연산으로 통합할 수 있게 해주는 중요한 개념이다.
4. 선형 변환과 행렬
게임에서 객체의 이동, 회전, 크기 변환(확대/축소) 등은 선형 변환을 통해 수학적으로 처리된다.
행렬을 사용하면 복잡한 변환을 간단한 연산으로 수행할 수 있으며, 여러 개의 변환을 하나의 행렬로 합쳐서 최적화할 수 있기 때문 에 선형 변환은 행렬(Matrix)을 사용해서 표현된다.
5. 이동 변환
이동 변환은 객체를 특정 방향으로 ( d x , d y ) (dx, dy) ( d x , d y ) 만큼 이동하는 변환이다.
✅ 이동 변환 공식
점 ( x , y ) (x, y) ( x , y ) 가 이동 변환을 거치면 다음과 같은 새로운 좌표를 가진다:
( x ′ , y ′ ) = ( x + d x , y + d y ) (x{\prime}, y{\prime}) = (x + dx, y + dy) ( x ′ , y ′ ) = ( x + d x , y + d y )
이 변환은 행렬을 활용해서 표현할 수 있다.
✅ 이동 변환 행렬 (3×3 형태)
T = [ 1 0 d x 0 1 d y 0 0 1 ] T = \begin{bmatrix} 1 & 0 & dx \\ 0 & 1 & dy \\ 0 & 0 & 1 \end{bmatrix} T = ⎣ ⎢ ⎡ 1 0 0 0 1 0 d x d y 1 ⎦ ⎥ ⎤
이 행렬을 이용하면 점의 이동을 간단한 행렬 연산으로 수행할 수 있다.
✅ 이동 변환 적용 방식
[ x ′ y ′ 1 ] = T × [ x y 1 ] = [ 1 0 d x 0 1 d y 0 0 1 ] × [ x y 1 ] \begin{bmatrix} x{\prime} \\ y{\prime} \\ 1 \end{bmatrix} = T \times \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & dx \\ 0 & 1 & dy \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣ ⎢ ⎡ x ′ y ′ 1 ⎦ ⎥ ⎤ = T × ⎣ ⎢ ⎡ x y 1 ⎦ ⎥ ⎤ = ⎣ ⎢ ⎡ 1 0 0 0 1 0 d x d y 1 ⎦ ⎥ ⎤ × ⎣ ⎢ ⎡ x y 1 ⎦ ⎥ ⎤
이를 전개하면,
x ′ = 1 ⋅ x + 0 ⋅ y + d x ⋅ 1 = x + d x x{\prime} = 1 \cdot x + 0 \cdot y + dx \cdot 1 = x + dx x ′ = 1 ⋅ x + 0 ⋅ y + d x ⋅ 1 = x + d x
y ′ = 0 ⋅ x + 1 ⋅ y + d y ⋅ 1 = y + d y y{\prime} = 0 \cdot x + 1 \cdot y + dy \cdot 1 = y + dy y ′ = 0 ⋅ x + 1 ⋅ y + d y ⋅ 1 = y + d y
이므로 이동 변환은 단순한 덧셈 연산으로 좌표를 변환하는 과정이다.
✅ 예제: P ( 3 , 4 ) P(3,4) P ( 3 , 4 ) 를 ( d x = 2 , d y = 5 ) (dx=2, dy=5) ( d x = 2 , d y = 5 ) 만큼 이동
✔ 초기 좌표 (동차 좌표계 적용)
P = [ 3 4 1 ] P = \begin{bmatrix} 3 \\ 4 \\ 1 \end{bmatrix} P = ⎣ ⎢ ⎡ 3 4 1 ⎦ ⎥ ⎤
✔ 이동 변환 행렬
T = [ 1 0 2 0 1 5 0 0 1 ] T = \begin{bmatrix} 1 & 0 & 2 \\ 0 & 1 & 5 \\ 0 & 0 & 1 \end{bmatrix} T = ⎣ ⎢ ⎡ 1 0 0 0 1 0 2 5 1 ⎦ ⎥ ⎤
✔ 행렬 연산 수행
[ x ′ y ′ 1 ] = [ 1 0 2 0 1 5 0 0 1 ] × [ 3 4 1 ] \begin{bmatrix} x{\prime} \\ y{\prime} \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 2 \\ 0 & 1 & 5 \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} 3 \\ 4 \\ 1 \end{bmatrix} ⎣ ⎢ ⎡ x ′ y ′ 1 ⎦ ⎥ ⎤ = ⎣ ⎢ ⎡ 1 0 0 0 1 0 2 5 1 ⎦ ⎥ ⎤ × ⎣ ⎢ ⎡ 3 4 1 ⎦ ⎥ ⎤
✔ 계산 과정
x ′ = 1 × 3 + 0 × 4 + 2 × 1 = 5 x{\prime} = 1 \times 3 + 0 \times 4 + 2 \times 1 = 5 x ′ = 1 × 3 + 0 × 4 + 2 × 1 = 5
y ′ = 0 × 3 + 1 × 4 + 5 × 1 = 9 y{\prime} = 0 \times 3 + 1 \times 4 + 5 \times 1 = 9 y ′ = 0 × 3 + 1 × 4 + 5 × 1 = 9
✔ 최종 결과
P ′ = ( 5 , 9 ) P{\prime} = (5,9) P ′ = ( 5 , 9 )
즉, 점 ( 3 , 4 ) (3,4) ( 3 , 4 ) 가 ( 5 , 9 ) (5,9) ( 5 , 9 ) 로 이동되었다.
6. 회전 변환
회전 변환은 객체를 원점을 기준으로 특정 각도 θ \theta θ 만큼 회전하는 변환 이다.
✅ 극좌표계를 이용한 회전 변환
어떤 점 ( x , y ) (x, y) ( x , y ) 가 있을 때, 이를 극좌표계로 나타내면 다음과 같다.
x = r cos θ 0 , y = r sin θ 0 x = r \cos\theta_0, \quad y = r \sin\theta_0 x = r cos θ 0 , y = r sin θ 0
여기서 r r r 은 원점에서 점까지의 거리 r = x 2 + y 2 r = \sqrt{x^2 + y^2} r = x 2 + y 2 이고, θ 0 \theta_0 θ 0 은 기존 점이 형성하는 각도다. 이 점을 θ \theta θ 만큼 회전시키면, 새로운 좌표 ( x ′ , y ′ ) (x', y') ( x ′ , y ′ ) 는 다음과 같이 표현된다.
x ′ = r cos ( θ 0 + θ ) , y ′ = r sin ( θ 0 + θ ) x' = r \cos(\theta_0 + \theta), \quad y' = r \sin(\theta_0 + \theta) x ′ = r cos ( θ 0 + θ ) , y ′ = r sin ( θ 0 + θ )
✅ 삼각함수를 이용한 변환식 도출
삼각함수의 덧셈 공식을 적용하면 다음과 같이 정리할 수 있다.
코사인 덧셈 공식
cos ( A + B ) = cos A cos B − sin A sin B \cos(A + B) = \cos A \cos B - \sin A \sin B cos ( A + B ) = cos A cos B − sin A sin B
사인 덧셈 공식
sin ( A + B ) = sin A cos B + cos A sin B \sin(A + B) = \sin A \cos B + \cos A \sin B sin ( A + B ) = sin A cos B + cos A sin B
이를 적용하면:
x ′ = r ( cos θ 0 cos θ − sin θ 0 sin θ ) x' = r (\cos\theta_0 \cos\theta - \sin\theta_0 \sin\theta) x ′ = r ( cos θ 0 cos θ − sin θ 0 sin θ )
y ′ = r ( sin θ 0 cos θ + cos θ 0 sin θ ) y' = r (\sin\theta_0 \cos\theta + \cos\theta_0 \sin\theta) y ′ = r ( sin θ 0 cos θ + cos θ 0 sin θ )
✅ 회전 변환 공식
이제 r cos θ 0 = x r \cos\theta_0 = x r cos θ 0 = x , r sin θ 0 = y r \sin\theta_0 = y r sin θ 0 = y 를 대입하면 다음과 같은 회전 변환 공식을 얻을 수 있다.
x ′ = x cos θ − y sin θ x' = x \cos\theta - y \sin\theta x ′ = x cos θ − y sin θ
y ′ = x sin θ + y cos θ y' = x \sin\theta + y \cos\theta y ′ = x sin θ + y cos θ
✅ 회전 변환 행렬 표현
이 공식을 행렬 연산으로 표현하면 다음과 같다.
R ( θ ) = [ cos θ − sin θ 0 sin θ cos θ 0 0 0 1 ] R(\theta) = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} R ( θ ) = ⎣ ⎢ ⎡ cos θ sin θ 0 − sin θ cos θ 0 0 0 1 ⎦ ⎥ ⎤
이를 동차 좌표계에서 적용하면:
[ x ′ y ′ 1 ] = R ( θ ) × [ x y 1 ] = [ cos θ − sin θ 0 sin θ cos θ 0 0 0 1 ] × [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = R(\theta) \times \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣ ⎢ ⎡ x ′ y ′ 1 ⎦ ⎥ ⎤ = R ( θ ) × ⎣ ⎢ ⎡ x y 1 ⎦ ⎥ ⎤ = ⎣ ⎢ ⎡ cos θ sin θ 0 − sin θ cos θ 0 0 0 1 ⎦ ⎥ ⎤ × ⎣ ⎢ ⎡ x y 1 ⎦ ⎥ ⎤
✅ 예제: P ( 3 , 4 ) P(3,4) P ( 3 , 4 ) 를 9 0 ∘ 90^\circ 9 0 ∘ 회전하면?
✔ 초기 좌표 (동차 좌표계 적용)
P = [ 3 4 1 ] P = \begin{bmatrix} 3 \\ 4 \\ 1 \end{bmatrix} P = ⎣ ⎢ ⎡ 3 4 1 ⎦ ⎥ ⎤
✔ 90도 회전 행렬
R ( 9 0 ∘ ) = [ 0 − 1 0 1 0 0 0 0 1 ] R(90^\circ) = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} R ( 9 0 ∘ ) = ⎣ ⎢ ⎡ 0 1 0 − 1 0 0 0 0 1 ⎦ ⎥ ⎤
✔ 행렬 연산 수행
[ x ′ y ′ 1 ] = R ( 9 0 ∘ ) × [ 3 4 1 ] = [ 0 − 1 0 1 0 0 0 0 1 ] × [ 3 4 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = R(90^\circ) \times \begin{bmatrix} 3 \\ 4 \\ 1 \end{bmatrix} = \begin{bmatrix} 0 & -1 & 0 \\ 1 & 0 & 0 \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} 3 \\ 4 \\ 1 \end{bmatrix} ⎣ ⎢ ⎡ x ′ y ′ 1 ⎦ ⎥ ⎤ = R ( 9 0 ∘ ) × ⎣ ⎢ ⎡ 3 4 1 ⎦ ⎥ ⎤ = ⎣ ⎢ ⎡ 0 1 0 − 1 0 0 0 0 1 ⎦ ⎥ ⎤ × ⎣ ⎢ ⎡ 3 4 1 ⎦ ⎥ ⎤
✔ 계산 과정
x ′ = ( 0 × 3 ) + ( − 1 × 4 ) + ( 0 × 1 ) = − 4 x' = (0 \times 3) + (-1 \times 4) + (0 \times 1) = -4 x ′ = ( 0 × 3 ) + ( − 1 × 4 ) + ( 0 × 1 ) = − 4
y ′ = ( 1 × 3 ) + ( 0 × 4 ) + ( 0 × 1 ) = 3 y' = (1 \times 3) + (0 \times 4) + (0 \times 1) = 3 y ′ = ( 1 × 3 ) + ( 0 × 4 ) + ( 0 × 1 ) = 3
✔ 결과 좌표
P ′ = ( − 4 , 3 ) P' = (-4,3) P ′ = ( − 4 , 3 )
즉, 점 ( 3 , 4 ) (3,4) ( 3 , 4 ) 가 90도 회전 후 ( − 4 , 3 ) (-4,3) ( − 4 , 3 ) 으로 이동 했다.
7. 크기 변환
객체를 원점을 기준으로 s x sx s x , s y sy s y 배만큼 확대/축소 하는 변환이다.
✅ 크기 변환 공식
x ′ = s x ⋅ x x' = sx \cdot x x ′ = s x ⋅ x
y ′ = s y ⋅ y y' = sy \cdot y y ′ = s y ⋅ y
✅ 크기 변환 행렬
S = [ s x 0 0 0 s y 0 0 0 1 ] S = \begin{bmatrix} sx & 0 & 0 \\ 0 & sy & 0 \\ 0 & 0 & 1 \end{bmatrix} S = ⎣ ⎢ ⎡ s x 0 0 0 s y 0 0 0 1 ⎦ ⎥ ⎤
✅ 행렬 연산 적용
[ x ′ y ′ 1 ] = S × [ x y 1 ] = [ s x 0 0 0 s y 0 0 0 1 ] × [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = S \times \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} sx & 0 & 0 \\ 0 & sy & 0 \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} ⎣ ⎢ ⎡ x ′ y ′ 1 ⎦ ⎥ ⎤ = S × ⎣ ⎢ ⎡ x y 1 ⎦ ⎥ ⎤ = ⎣ ⎢ ⎡ s x 0 0 0 s y 0 0 0 1 ⎦ ⎥ ⎤ × ⎣ ⎢ ⎡ x y 1 ⎦ ⎥ ⎤
✅ 예제: P ( 3 , 4 ) P(3,4) P ( 3 , 4 ) 을 x x x 축 방향으로 2배, y y y 축 방향으로 3배 확대하면?
✔ 초기 좌표 (동차 좌표계 적용)
P = [ 3 4 1 ] P = \begin{bmatrix} 3 \\ 4 \\ 1 \end{bmatrix} P = ⎣ ⎢ ⎡ 3 4 1 ⎦ ⎥ ⎤
✔ 크기 변환 행렬
S = [ 2 0 0 0 3 0 0 0 1 ] S = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 3 & 0 \\ 0 & 0 & 1 \end{bmatrix} S = ⎣ ⎢ ⎡ 2 0 0 0 3 0 0 0 1 ⎦ ⎥ ⎤
✔ 행렬 연산 수행
[ x ′ y ′ 1 ] = S × [ 3 4 1 ] = [ 2 0 0 0 3 0 0 0 1 ] × [ 3 4 1 ] \begin{bmatrix} x{\prime} \\ y{\prime} \\ 1 \end{bmatrix} = S \times \begin{bmatrix} 3 \\ 4 \\ 1 \end{bmatrix} = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 3 & 0 \\ 0 & 0 & 1 \end{bmatrix} \times \begin{bmatrix} 3 \\ 4 \\ 1 \end{bmatrix} ⎣ ⎢ ⎡ x ′ y ′ 1 ⎦ ⎥ ⎤ = S × ⎣ ⎢ ⎡ 3 4 1 ⎦ ⎥ ⎤ = ⎣ ⎢ ⎡ 2 0 0 0 3 0 0 0 1 ⎦ ⎥ ⎤ × ⎣ ⎢ ⎡ 3 4 1 ⎦ ⎥ ⎤
✔ 계산 과정
x ′ = 2 × 3 = 6 x{\prime} = 2 \times 3 = 6 x ′ = 2 × 3 = 6
y ′ = 3 × 4 = 12 y{\prime} = 3 \times 4 = 12 y ′ = 3 × 4 = 1 2
✔ 결과 좌표
P ′ = ( 6 , 12 ) P{\prime} = (6,12) P ′ = ( 6 , 1 2 )
즉, 점 ( 3 , 4 ) (3,4) ( 3 , 4 ) 가 크기 변환 후 ( 6 , − 12 ) (6,-12) ( 6 , − 1 2 ) 으로 이동 했다.
8. 복합 변환
여러 변환을 이동, 회전, 크기 변환을 하나의 변환 행렬로 결합해서 표현할 수 있다. 이를 통해 여러 변환을 한 번의 행렬 연산으로 처리할 수 있으며, 연산의 효율성을 높이고 최적화할 수 있다.
✅ 변환 행렬의 조합
변환은 특정한 순서로 적용되며, 일반적으로 다음과 같은 순서로 조합된다:
M = S × R × T M = S \times R \times T M = S × R × T
이동(T), 회전(R), 크기(S)