[게임 수학] 벡터 / 행렬 / 스칼라

2024. 4. 17. 23:16게임 수학

벡터

힘의 크기(값)와 방향을 동시에 좌표로 표현한 것
*덧셈 -> 이동, 회전처리
*뺄셈 -> 적 시점에서, 플레이어가 어느 방향이 있는지 구할 때
이동처리, 방향 구할 때
크기와 방향이 같으면 같은 벡터이다.
꼬리잇기
뺄셈 --> 뒤에 있는 것이 앞을 바라봄
에너미 - 플레이어 --> 플레이어가 에너미를 바라봄
p0 = p1 + vt(벡터 + 타임)

벡터의 덧셈

벡터에는 시작위치, 끝 위치의 개념이 없다.
즉, 0에서 5를 가든, 5에서 10을 가든 같은 벡터이다.
크기와 방향이 같으면 같은 벡터라고 보면 된다.
벡터는 시작점에 고정되어 있지 않다.

캐릭터를 이동시킬 때 벡터의 연산을 이용
있는 위치를 (x , y)로 따진다면,  이동은 처음 위치와 도착 위치를 이어주면 된다.
한 벡터의 끝 지점에서 다른 벡터의 시작지점을 이어 새로운 벡터를 만든다. -> 새로운 벡터는 두 벡터를 더한 것이 된다.
플레이어는 광장에 있고, 뒤에는 자신의 집이, 앞에는 상점이 있다고 쳐보자.
플레이어의 위치는 (5, 0), 상점의 위치는 (7, 0), 자신의 집의 위치는 (3, 0)이라고 할 때, 집에서 상점까지의 거리는 집 ~플레이어의 위치 + 플레이어 ~ 상점의 위치를 하면 된다.
따라서, 집 ~ 상점의 위치라는 새로운 벡터가 생기게 된다.

벡터의 뺄셈

뺄셈은 그냥 빼도 되지만, 마이너스를 더할수도 있다.
벡터에 마이너스를 붙이는 것은 방향을 바꾸는 것. 즉, 좌표를 마이너스 방향으로 가듯이.
아까와 같이 예를 들어보자. 집은 (3, 0) 플레이어는 (5, 0), 상점은 (7, 0)일 때 플레이어가 상점이 아닌 집으로 돌아간다면 x좌표에 -2만큼 더해주면 된다.

스칼라의 곱셈

*스칼라란? 그냥 수 라고 생각하면 된다.
평범한 곱셈을 하면 된다. 5 * 2 = 10이듯이.
음수는 -5 * 2 = -10이다.

벡터의 내적

두 개의 벡터(차원이 같은)의 각 자리수(좌표)를 곱하고, 그 결과를 더해준다.
(2, 2) , (-1, 0)의 경우
(2 * -1) + (2 * 0)
=>-2 + 0
=>-2
결과값이 양수라면 두 벡터 사이의 각이 <=90도
결과값이 음수라면 >= 90도

getAngle대신에 사용
결과가 스칼라(라디안)으로 나옴
두 벡터가 주어졌을 때, 사이의 각도를 구할 수 있음(아크코사인)
넉백 처리(에너미의 피격), 라이트 처리(빛의 자연스러움), 카메라 내에 보여줄(랜더) 것 처리 시 많이 사용

벡터의 외적

3차원 벡터에서만 적용
*법선벡터란? 어떤 평면에 수직인 벡터
a,y * b, z - a,z * b, y
x1,y1 * x2,y2 - x1,y2 * x2,y1
(두 벡터가 이루는 sin * 두 벡터의 길이) * 두 벡터가 수직이 되는 벡터

두 벡터와 수직인 벡터가 있다
수직인 벡터. 직교 벡터 구하기
방향
결과가 벡터로 나옴
A X B =/(같지 않다) B X A 방향이 반대
왼손좌표계(z가 내 시선쪽을 바라보고있음), 오른손좌표계(z가 나를 바라보고있음)
게임에서는 왼손좌표계를 씀

행렬(Matrix)

3차원 이미지를 2차원에 투영하거나 사실적인 움직임을 그리기 위함

3D에서 4 * 4 행렬을 사용
게임에서 행렬은? 위치, 크기, 회전을 행렬로 처리
트랜스폼이라고 부르는것이 행렬이다
모든 게임 오브젝트는 트랜스폼을 가져야 한다

S*R*T( Scale Rotate Translate) 순서대로..

단위행렬

행렬의 초기화

1000
0100
0010
0001

영행렬

0000
0000
0000
0000

전치행렬

1   2   3    4
5   6   7    8
9   10 11 12
13 14 15 16

=>

1  5   9   13
2  6  10  14
3  7  11  15
4  8  12  16
행과 열의 같은 번호끼리 교환

역행렬

a행렬 * b행렬 = 단위행렬? ==> b행렬 == a행렬의 역행렬
존재하거나, 존재하지 않거나

Inverse Matrix : 이동한 물체를 다시 본래 자리로 돌릴 때 사용(Back시킴)

행렬 덧셈

각 요소들을 자리에 맞게 더한다

행렬 뺄셈

덧셈과 동일한 방법으로 뺀다

행렬 곱셈

곱하고자 하는 두 행과 열의 길이가 같아야 함
a1 a2     *     b1 b2
a3 a4            b3  b4

=>   a1*b1 + a2*b3   a1*b2 + a2*b4
a3*b1 + a4*b3   a3*b2 + a4*b4

행렬 변환

이동행렬

(x, y, z, 1)벡터를 이용하여 이동 가능
일반 : 1     0  0   0
           0     1  0   0
           0     0  1   0
           px py pz 1
동차좌표 이용 : 100px
                           010py
                           001pz
                           000 1

회전 행렬

X = 1   0      0   0
       0  cos sin  0
       0-sin cos 0
       0    0      0   1

Y = cos  0  -sin  0
       0       1      0     1
       sin    0   cos   0
       0        0      0     1

Z = cos   sin    0     0
       -sin   cos  0     0
         0        0       1     0
         0        0       0     1

크기변환 행렬

px   0     0   0
0     py   0   0 
0      0    pz 0
0      0     0   1