5장. 행렬
게임 개발은 사용자의 입력에 빠르게 반응해 가상 공간을 변화해야한다
행렬은 체계적으로 공간 변환을 수행하는 수학적 토대이다. 행렬을 배우기 위해 선형성이라는 관계를 알아야 한다
5.1 선형성 : 예측 가능한 비례 관계
선형성은 직선의 형태를 띠는 성질을 의미한다. 우리가 직선이라고 표현하는 것을 컴퓨터에서는 어떻게 구분할 수 있을까?
수학에서는 선형성을 가법성과 1차 동차성 두 가지 조건을 모두 만족하는 함수의 성질로 정의한다
- 가법성 : f(x1+x2)=f(x1)+f(x2)
- 1차 동차성 : f(k∗x)=k∗f(x)
5.1.1 선형 함수
입력 x와 출력이 모두 실수인 함수에서 원점을 지나는 직선의 함수는 다음과 같다
f(x)=ax
이는 가법성과 1차 동차성을 모두 만족한다. 그러므로 이 함수는 선형성을 만족한다
f(x)=ax+b
이는 선형성을 만족할까?
가법성으로 증명해보면
- 좌변 : f(x1+x2)=a(x1+x2)+b
- 우변 : f(x1)+f(x2)=ax1+ax2+2b
두 변이 b만큼 차이가 나기에 가법성을 만족하지 못한다. 그래프로 봤을 땐 직선의 형태이지만 선형성을 만족하지 못한다
여기서 알 수 있는 선형성은 단지 곧게 뻗은 직선의 성질이 아닌 두 집합의 순수한 비로 구성된 1차적 대응 관계이다
5.1.2 벡터 공간의 선형 변환
입출력을 실수에서 2차원 벡터 공간으로 설정한 후 선형성을 가지는 함수에 대해 알아보자
f(v)=f(x,y)=(ax+by,cx+dy)
2차원 벡터를 입출력으로 사용하는 선형성을 가지는 함수이다. 이 함수는 가법성과 1차 동차성을 모두 만족하므로 선형 함수이다
표준기저벡터의 선형 결합으로 형성된 벡터 공간은 선형성을 지니는데 이 벡터 공간을 선형 함수로 변화시킨 새로운 공간도 기저벡터의 선형 결합으로 형성되므로 선형성을 지닌다
두 공간이 동일한 구조를 지닐 때 두 공간의 대응 관계를 변환이라고 부르고 선형성을 유지시켜주는 선형 함수(위)는 선형 변환이라고 한다
벡터 공간에서 발생하는 선형 변환의 원리는 크기 변환이나 회전 변환과 관련있다
선형 변환은 게임의 가상 세계를 구축하는 데 필요한 모든 변환의 기본 바탕이 된다. 선형 변환의 계산을 체계화하여 계산을 쉽게 만든 도구가 바로 행렬이다
5.2 행렬
행렬은 수를 사각형의 형태로 행과 열을 맞춰 배열한 테이블이다
행렬은 선형 변환과 벡터를 나타내는 데 사용하는데 벡터는 한 줄로 구성된 행렬이며 가로 또는 세로로 표현할 수 있다
A=[12], 열벡터
B=[12], 행벡터
선형 변환을 표현할 때는 행과 열의 크기가 같은 정방행렬을 사용한다
f(x,y)=(ax+by,cx+dy)를 행렬로 표현하면
A=[acbd]
5.2.1 행렬의 기본 연산
기본적으로 알아야 하는 행렬의 연산
- 행렬과 행렬의 덧셈
- 행렬의 크기가 같은 경우에만 성립
- 같은 위치의 원소끼리 더함
- 행렬과 스칼라의 곱셈
- 행렬의 전치
- T로 표시
- 행과 열을 바꾸는 작업
- 정방행렬에서 전치연산은 대각 성분은 유지한 채 나머지는 대각을 중심으로 대칭된 행렬을 만든다
- 행렬과 행렬의 곱셈
5.2.2 행렬의 곱셈
행렬의 곱셈은 앞에 위치한 행렬의 행벡터와 뒤에 위치한 행렬의 열벡터를 각각 곱하는 방식이다
행렬 곱셈의 중요한 성질 중 하나는 교환 법칙이 성립하지 않는다. 반대로 결합법칙은 만족한다
행렬 곱의 특징 중 하나는 행렬 곱을 전치한 결과는 순서를 바꾼 후 각각 전치해 곱한 결과와 동일하다는 것임
(AB)T=BTAT
행렬 A=[acbd], v=[xy]일 때, 행렬의 곱은 [ax+bycx+dy]이고 앞서 살펴본 2차원 벡터 공간의 선형 변환 f(x,y)=(ax+by,cx+dy)과 같다
정방행렬 A가 2차원 공간의 선형 변환에 대응되는 함수를 의미하고, 2차원 벡터에 선형 변환을 적용해 새로운 벡터를 생성하는 작업으로 해석할 수 있다
그리고 벡터에 선형 변환을 적용하기 위한 연산 순서는 오른쪽에서 왼쪽 방향으로 이뤄짐을 알 수 있다
5.2.3 정방행렬의 곱셈
2 X 2 정방행렬 간 곱은 합성함수에 대응되는 연산이다
벡터 v에 선형 변환을 나타내는 2 X 2 정방행렬 A, B를 순서대로 연산한다고 생각해보자. 수식은 다음과 같음
BAv
합성함수는 결합법칙을 만족하는데 합성함수에 대응되는 행렬의 곱셈 역시 결합법칙을 만족한다. 따라서 행렬의 연산 순서를 바꿔도 새로운 벡터 w 값은 동일하다
B(Av) = (BA)v
위와 같은 성질은 컴퓨터 그래픽 연산에서 아주 유용하다. 100개의 점(벡터)이 있을 때 각 점마다 5번의 선형 변환이 발생한다면, 원래 같으면 각 벡터마다 선형 변환을 계산해 100 * 5 = 500번 연산해야 한다
하지만 위와 같은 성질을 이용해 행렬들을 미리 계산해놓으면 연산량을 줄일 수 있다
5.3 행렬의 설계
벡터 공간 V를 구성하는 두 표준기저벡터가 선형변환을 통해 W의 벡터 (a,c)와 (b,d)에 대응되어 변환된다고 생각해보자
벡터 공간 V의 벡터 v는 다음의 선형결합으로 생성됨
v =(x,y)=x⋅(1,0)+y⋅(0,1)
같은 방법으로 벡터 v가 선형 변환되는 경우에는 동일한 선형 결합식을 사용해 벡터 w가 계산된다
w =x(a,c)+y(b,d)=(ax+by,cx+dy)
이는 a, b, c, d로 만들어진 정방행렬에 벡터 (x, y)를 곱한 결과와 동일함
정방행렬과 표준기저벡터가 변화된 두 벡터 (a,c)와 (b,d)의 관계는 정방행렬을 구성하는 열벡터임을 알 수 있다
프로그래밍에서도 2 X 2 정방행렬의 생성자에 두 기저벡터에 해당하는 열벡터 인자를 받도록 설계했다
5.3.1 크기 변환행렬
크기 변환행렬은 물체의 크기를 변경하는 행렬이다. 크기 변환은 각 표준기저벡터를 동일한 방향으로 지정한 크기만큼 늘리는 변환을 의미한다
- 표준기저벡터 e1을 a배 늘리거나 줄인 벡터 : a⋅(1,0)=(a,0)
- 표준기저벡터 e2을 b배 늘리거나 줄인 벡터 : b⋅(0,1)=(0,b)
이를 크기 변환행렬로 나타내면 S=[a00b]
5.3.2 회전 변환행렬
각 θ로 벡터 공간을 회전시키는 회전 변환행렬을 설계해보자
반시계방향으로 회전하는 양의 방향 90° 회전은 두 표준기저벡터가 서로 바뀐 형태이다
- 표준기저벡터 e1을 90° 회전한 벡터 : (1,0)=(0,1)
- 표준기저벡터 e2을 90° 회전한 벡터 : (0,1)=(−1,0)
R90°=[01−10]
각 θ로 회전시켰을 때는 e1,e2가 (cosθ,sinθ),(−sinθ,cosθ)가 된다
Rθ=[cosθsinθ−sinθcosθ]
5.3.3 전단 변환행렬
표준기저벡터 e1을 고정한 채 표준기저벡터 e2를 x축 방향으로 미는 변환을 하는 행렬을 전단 변환행렬이라 한다
S=[10a1]
5.3.4 삼각함수의 덧셈 정리
삼각함수를 응용할 때 유용하게 사용되는 삼각함수의 덧셈 정리가 있다
- cos(α+β)=cosαcosβ−sinαsinβ
- sin(α+β)=sinαcosβ+cosαsinβ
배각 공식도 있는데
- cos2α=cos(α+α)=cos2α−sin2α=1−2sin2α
- sin2α=sin(α+α)=2sinαcosα
5.4 역행렬
선형 변환을 수행하는 행렬은 함수의 성질을 지니기에 항등함수와 역함수에 대응하는 행렬이 존재한다. 각각 항등행렬과 역행렬이라고 한다
항등행렬은 원 공간의 변화없이 동일한 공간으로 유지하는 변환을 의미한다. 변환된 공간의 표준기저벡터는 원 공간의 표준기저벡터와 동일하다
I=[1001]
행렬 곱의 결과가 항등행렬이 나오는 특별한 행렬이 역행렬이다
A⋅A−1=A−1⋅A=I
5.4.1 역행렬의 존재를 판별하는 행렬식
역행렬이 존재하기 위해서는 두 공간의 변환이 전단사로 대응될 때만 존재한다
어떤 행렬에 대해 역행렬이 존재하는지 파악할 수 있는 수식을 행렬식이라고 한다
A=[acbd], det(A)=ad−bc
행렬식의 값이 0인 선형 변환은 전단사 대응이 성립하지 않아 역행렬이 존재하지 않는다
행렬식이 0인 경우 벡터 공간의 차원이 줄어들어(p182) 원 공간의 정보가 소멸되면 변환이 불가하다
5.4.2 크기 변환행렬의 역행렬
크기 변환행렬의 역행렬은 변화된 크기만큼 거꾸로 크기를 변화시킨다
S=[a00b] > S−1=[1/a001/b]
5.4.3 전단 변환행렬의 역행렬
S=[10a1] > S−1=[10−a1]
5.4.4 회전 변환행렬의 역행렬
R=[cosθsinθ−sinθcosθ]
회전각 θ에 대한 회전 변환행렬의 역행렬은 반대방향의 회전각 −θ에 대한 회전 변환을 의미한다
Rθ−1=R−θ
사인 함수와 코사인 함수의 성질에 의해
Rθ−1=[cosθ−sinθsinθcosθ]
의 행렬이 나타나고 이는 원래 회전행렬의 전치 관계이다
5.4.5 행렬 곱의 역행렬
합성함수의 성질과 비슷하게 행렬 곱의 역행렬도 다음 수식이 성립한다
(A⋅B)−1=B−1⋅A−1