수학/게임 수학

행렬과 삼각함수

게임 개발 2023. 2. 19. 15:24

 

 

 

 

 

삼각함수

삼각함수란?

 

 

+ 행렬을 들어가기 전에

 

게임 수학에서 행렬을 쓰는 이유.

 

선형 변환의 원리는 게임의 가상 세계를 구축하는 데 필요한 모든 변환의 기본 바탕이 된다.

따라서 선형 변환을 안정적이고 빠르게 계산할 수 있는 체계가 구축된다면,

컴퓨터를 사용해 게임이 요구하는 가상 세계의 기반을 손쉽게 구축할 수 있을 것이다.

수학자들은 선형 변환의 계산 과정을 체계화하여 손쉽게 계산할 수 있는 편리한 도구를 발명했는데

그것이 바로 행렬이다.

 

 

행렬

 

행렬은 수를 사격형의 형태로 행과 열을 맞춰 배열한 테이블이다.

따라서 n개의 행과 m개의 열로 구성된 반듯한 사각형의 형태를 띤다.

 

예를 들어 위 행렬은 2 x 3 행렬은 다음과 같이 2행 3열의 형태를 띤다.

 

A는 열 백터, B는 행 백터라 부른다.

선형 변환을 표현할 때는 행과 열이 크기가 같은 정방행렬( =  (n x n) ) 을 사용한다.

 

앞서 살펴본 2차원 백터 공간의 선형 변환

f(x, y) = (ax + by, cx + by)는 2 x 2 크기의 정방행렬로 표현하는데,

이에 대응하는 행렬 A는 다음과 같다.

 

 

정방행렬 A는 2개의 행백터 또는 2개의 열백터로 구성된다고 할 수 있다.

 

행렬의 기본 연산은

 

행렬과 행렬의 덧셈은 행렬의 크기가 같은 경우에만 성립되며,

다음과 같이 같은 위치의 원소끼리 더한다.

 

행렬에 스칼라를 곱하는 연산은 다음과 같이 행렬을 구성하는 모든 원소에 스칼라를 곱한다.

 

행렬의 전치연산은 첨자 T로 표시하는데 행과 열을 바꾸는 작업을 수행한다.

예를 들어 3 x 2 행렬의 전치연산은 2 x 3 행렬이 된다.

행과 열의 크기가 같은 정방행렬의 전치연산은 행과 열의 정보가 동일한

대각 성분의 원소는 그대로 유지되고, 나머지 원소는 대각 성분을 중심으로

대칭된 행렬을 만든다. 아래 2 x 2 행렬의 전치연산을 살펴보면

성분 a와 d는 동일하고 b와 c의 위치가 서로 바뀐 것을 볼 수 있다.

 

행렬의 곱셈
주의해야할 것은 행렬과 행렬의 곱셈이다.
행렬 곱셈의 중요한 성질 중 하나는 교환법칙이 성립하지 않는다는 것이다.

행렬의 곱셈은 앞에 위치한 행렬의 행벡터와 뒤에 위치한 행렬의 열벡터를

각각 곱하는 방식으로 진행된다. 

 

예를 들어 2 x 2 행렬의 곱셈은 그림 5-8에서의 화살표 방향으로 전개된다.

 

행렬 곱셈은 교환법칙이 성립하지 않는다.

 

실제로 두 행렬의 순서를 바꿔 곱셈을 하면 다른 결과가 나온다.

 

한편 행렬의 곱셈은 다음과 같은 결합법칙을 만족한다.

 

 

행렬의 곱의 특징 중 하나는, 

행렬 곱을 전치한 결과는 순서를 바꾼 후 각각 전치해 곱한 결과와 동일하다는 것이다.

 

a, b, c, d 네 개의 원소로 구성된 2 x 2 정방행렬과

2차원 벡터 ( x, y)를 열벡터로 설정한 두 행렬의 곱은 다음과 같이 전개된다.

 

행렬 곱의 결과는 앞서 살펴본 2차원 벡터 공간의 선형 변환

f (x, y)  = (ax + by + cx + dy) 와 동일하다.

따라서 2 x 2 정방행렬 A는 2차원 공간의 선형 변환에 대응되는 함수를 의미하고,

이 수식은 f (x, y) = ( ax + by, cx + dy) 2 차원 벡터에 선형 변환을 적용해

새로운 벡터를 생성하는 작업으로 해석할 수 있다.

또한, 벡터에 선형 변환을 적용하기 위한 연산 순서

오른쪽에서 왼쪽 방향으로 이뤄짐을 알 수 있다.

 

정방행렬의 곱셈

2x2 정방행렬이 2차원 벡터 공간의 선형 변환에 대응된다면,
2x2 정방행렬 간의 곱은 합성함수와 대응되는 연산이다.

 

 

벡터 $ \displaystyle \vec{v} $ 에 선형 변환을 나타내는
2 x 2 정방행렬 A,B를 순서대로 연산한다고 생각해보자.
연산 순서는 오른쪽에서 왼족으로 진행되므로 이의 수식은 다음과 같다.

 

$$ B \cdot A \cdot \vec{v} $$

 

이는 다음 그림 5-9 세 개의 2차원 벡터 공간 $ \displaystyle V, U, W $에 대해 
두 번의 선형 변환을 거처 벡터 공간 $ \displaystyle V $에 속한 $ \displaystyle \vec{v} $가

벡터공간 $ \displaystyle W $ 의 벡터  $ \displaystyle \vec{w} $ 에 대응되는 관계로 해석할 수 있다.

 

선형 변환을 담당하는 정방 행렬 $ \displaystyle A, B $ 와 벡터 $ \displaystyle \vec{v} $ 의 각 요소를 다음과 같이 행렬로 나타내 보자.

$ B = $ $ \begin{bmatrix} e & f \\ g & f \end{bmatrix} $

$ A = $ $ \begin{bmatrix} a & b \\ c & d \end{bmatrix} $

$ \vec{v} = $ $ \begin{bmatrix} x & y \end{bmatrix} $

 

벡터 $ \vec{v} $ 가 $ \vec{w} $ 로 변환되는 과정은 다음과 같은 행렬 곱으로 표현할 수 있다.

 

$ \vec{w} = $ $ \begin{bmatrix} e & f \\ g & f \end{bmatrix} $ $ \cdot $ $ \begin{bmatrix} a & b \\ c & d \end{bmatrix} $ $ \cdot $ $ \begin{bmatrix} x & y \end{bmatrix} $

 

합성함수는 결합법칙을 만족한다.
합성함수에 대응하는 행렬의 곱셈 역시 결합법칙을 만족한다.

따라서 행렬의 연산 순서를 바꿔도 최종 계산된 벡터 $ \vec{w} $ 값은 동일하다.

미지수로 구성된 정방행렬과 벡터를 사용해 이를 직접 확인해보자.

 

1번과 2번은 동일한 값이므로 다음 식이 성립된다

 

$ \vec{w} = B $ $ \cdot ( A \cdot \vec{v} $ $ = ( B \cdot A ) \cdot \vec{v} $

 

이처럼 결합법칙이 성립하는 행렬 곱의 성질은 컴퓨터 그래픽 연산에서 아주 유용하게 활용된다.

 

예를 들어 100개의 점으로 구성된 물체가 모니터에 표현되기까지 5번의 선형 변환이 발생한다고 가정해보자.
물체의 점은 각각 $ \vec{v1} ... \vec{v100} $ 으로 표기하고 선형 변환을 수행하는 행렬을 각각

$ A, B, C, D $라고 하면 컴퓨터가 수행해야할 계산은 

각 점마다 5번의 행렬 곱이 수행되므로 100개의 점에 대한 행렬 곱의 총 횟수는 500이 될 것이다.

 

이때 결합법칙이 성립하는 행렬 연산의 특징을 사용하면
계산량을 줄이되 동일한 결과를 얻을 수 있다.
다음과 같이 행렬 곱을 4번 수행해서 합성함수에 해당하는 행렬 $ F $를 미리 만들어두자.

 

$ F = E $ $ \cdot $ $ D $ $ \cdot $ $ C $ $ \cdot $  $ B $ $ \cdot $ $ A $

 

이제 각 점에 대해 미리 계산된 $ F $ 만 곱하면 동일한 결과가 나온다.

 

$ F $ $ \cdot $  $ \vec{v1} $

 . . .  

$ F $ $ \cdot $ $ \vec{v100} $

 

이 경우 100개 점에 대한 행렬 곱의 총 횟수는
최초 합성 변환을 만들기 위한 4번의 행렬 곱과 벡터마다 1번의 행렬 곱이 수행되므로 104가 된다.

 

$ 4 + 1 $ $ \cdot $ $ 100 = 104 $

 

이의 결과는 앞서 구한 500번의 행렬 곱 연산과 동일하다.

가상 공간의 한 캐릭터를 표현하는 데 보통 10만 개의 점이 사용되므로,
컴퓨터 그래픽에서 행렬은 가성 세계를 구축하는 데 필요한 계산량을 크게 줄여주는
중요한 역할을 수행한다는 사실을 알 수 있다. 

 

++ 참고 ++
열 기준 행결과 행 기준 행렬

행렬과 벡터의 곱셈을 수행하는 방식으로
열 기준 행렬(Column major matrix)과 행 기준 행렬(Row major matrix) 두 가지가 있다.
수학에서 행렬을 다룰 때는, 벡터를 열벡터로 나타내는 열 기준 행렬 방식을 주로 사용한다.

그런데 컴퓨터에서 실제로 행렬을 응요할 때는, 행 기준 행렬을 사용하는 경우도 있다.
행기준 선형 변환을 수행할 때는 열 기준과 다르게 행렬과 벡터의 위치를 거꾸로 뒤집어서,
벡터를 앞쪽에 두어야 행렬의 곱셈이 성립된다.

그런데 이와 같이 정방행렬 A의 요소를 열 기준 방식과 동일하게 배치한다면
행렬 곱셈의 결과는 다른 값이 나온다.
우리가 원하는 결과는 (ax + by, cx + dy) 이므로 열 기준 행렬 방식을 사용한다면
정방행렬 A의 요소는 다음과 같이 배치해야 할 것이다.
이는 행 기준 방식의 정방행렬 A를 전치시킨 결과와 동일하다.
행 기준 방식을 사용하는 대표적인 사례로는 게임 그래픽스 라이브러리인 DX가 있으며,
열 기준 방식을 사용하는 대표적인 사례로는 OpenGL이 있다.
유니티 엔진 C#은 스크립트에서 열 기준을, 언리얼 C++ 코드는 행 기준을 사용한다.
그러나 두 방식 모두 전치 연산을 통해 서로 변환할 수 있으므로,
방식만 명확히 이해하고 있다면 응용하는 데 큰 문제는 없다.
열벡터와 행벡터는 서로 전치 관계에 있기 때문에,
선형 변환 역시 전치 관계의 차이가 있을 뿐이다.

열 기준 체계에서 설계된 수식을 행 기준에서 가져다 쓰고 싶다면
다음과 같이 전치연산을 적용해 변환하면 된다.

열 기준 행렬은 행렬의 적용 순서가 오른쪽에서 왼쪽 방향으로 흐르는 역방향으로 진행된다.
다음 행렬의 곱셈이 열 기준 방식으로 이뤄진다면,
벡터 v에 대해 행렬 A의 선형 변환이 적용된 후 행렬 B의 선형 변환이 적용된다.
이와 같은 열 기준 방식의 변환을 행 기준 방식으로 변환하기 위해 위 식을 전치해보자.
계산은 다음과 같이 왼쪽에서 오른쪽의 순방향으로 진행된다.
이와 같이 열벡터 행렬을 전치한 결과는 행벡터가 된다.
따라서 행벡터 변환 방식을 사용한다면 행렬의 적용 순서는
왼족에서 오른족의 순방향으로 진행되므로 이 점을 주의하자.

 

크기 변환 행렬

크기 변환행렬 (Scale transformation matrix)은
물체의 크기를 변경하는 행렬이다.
크기 변환은 각 표준기저벡터를
동일한 방향으로 지정한 크기만큼 늘리는 변환을 의미한다.

 

다음과 같은 임의의 좌표를 예시로 표준기저벡터를 변환해보자.

 

$ \cdot $ 표준기저벡터 $ e_{1} $ 을 $ a $ 배 늘리거나 줄인 벡터 : $ a $ $ \cdot $ $ (1,0) = ( a, 0 ) $

$ \cdot $ 표준기저벡터 $ e_{2} $ 을 $ b $ 배 늘리거나 줄인 벡터 : $ b $ $ \cdot $ $ (0,1) = ( 0, b ) $

 

$ e_{1} $ 을 $ a $ 배 만큼 늘리고 $ e_{2} $ 를 $ b $ 배만큼 줄인 선형 변환으로 인한 벡터 공간의 변화는
그림 5-13과 같이 표현할 수 있다.

 

그렇다면 변환도니 두 표준기저벡터 $ ( a , 0 ) $ 과 $ ( 0, b ) $ 를 열벡터로 설정해 생성한
크기 변환행렬은 다음과 같다.

 

 

 

회전 변환행렬

이번에 주어진 각 θ로 벡터 공간을 회전시키는 회전 변환행렬을 설계해보자.

 

 

 

전단 변환행렬

 

삼각함수의 덧셈 정리

 

역행렬의 존재를 판별하는 행렬식

 

전단 변환행렬의 역행렬

 

회전 변환행렬의 역행렬

 

 

해당 게시물은 이득우의 게임 수학을 발췌하여 공부한 내용입니다.

 

'수학 > 게임 수학' 카테고리의 다른 글

이득우의 게임 수학 3장 벡터(2차원 공간)  (0) 2024.10.18
이득우의 게임 수학 열기  (0) 2024.10.18
유클리드 공간  (0) 2024.01.19
삼각함수 - 일반각과 삼각비  (0) 2023.01.17