본문 바로가기

게임개발팁

그래픽스 프로그래밍의 이해1편 - 벡터이야기

아래 그림1을 보면 점이 있다. 우리는 점의 정보에 관심이 있다. 몇 차원에 속하는지 위치는 어디인지 등의 정보. 하지만 아래 그림1만을 보고선 아무 정보도 얻을 수 없다. 왜 그럴까? 무엇이 있어야 할까?

그림1



아래 그림2를 보면 점을 포함하는 직선이 그려져 있다. 이 것을 축으로 생각해 보자. 그렇다면 점이 몇 차원에 놓였는지에 관한 정보를 얻을 수 있다. 그림2의 빨간점은 현재 1차원에 놓여 있는 것이다. 하지만 점의 위치가 어디인지는 알 수 없다. 무엇이 더 필요한 것일까? 그림3을 보자.

그림2


그림3을 보면 그림2와 다르게 축위에 좌표가 적혀 있다. 이 그림3을 보고 나서야 빨간점이 1차원에 속하고 위치는 3이라는 것을 알 수 있다. 하지만 위치는 어떻게 정해지는 것일까? 위치를 정하려면 기준이 필요하다. 이 중요한 역할을 하는 것이 아래 그림3에서는 원점 O 이다. 물론 기준은 때에 따라서 정하기 나름이지만 앞으로 나오는 좌표계에서는 원점을 기준으로 삼자.

그림3


그림4를 보자. 이제 그림4를 보면 파란점의 정보를 어느 정도는 얻을 수 있다. 바로 2차원 공간에 속한 점이라는 것이다. 하지만 좌표는 알 수 없다.

그림4


파란점의 좌표를 정하기 위해서는 파란점의 위치를 정의하는 좌표계의 성질을 결정해야 한다. 바로 좌표계가 실수 집합인지 복소수 집합인지 원점은 어디인지 어느 방향이 양의 방향인지 등을 정해야 한다. 

그림5


우리는 실수좌표계를 사용하고 각 축의 이름은 가로축이 x축이고 세로축을 y축이라 하자. 그러면 파란점은 x축 성분과 y축 성분으로 위치가 정해진다. 각 좌표의 성분은 실수이다.

그림6


파란점의 x축과 y축의 성분의 임의의 실수 a와 b라고 하면 그림7처럼 표현할 수 있을 것이다. 점의 위치를 결정지었다.

그림7


그림8을 보면 원점에서 점(a,b)까지 선을 그엇다. 선분을 표현한 것이다. 1차원, 2차원, 3차원 ...  n차원에서 두 개의 점만 있으면 선분을 정의할 수 있다. 하지만 각 차원속에 속한 선분의 차이는 무엇일까? 그건 바로 점을 구성하는 성분의 갯수이다.

그림8


그림9의 선분의 길이를 d라고 해보자. 원점에서 점(a,b)까지의 거리라고 생각해도 좋다. 거리를 구하는 방법은 그 유명한 피타고라스의 정리이다.

그림9


그림10에 x축을 기준으로 선분의 방향을 나타내었다. 바로 각도 알파이다. 각도는 방향 정보를 나타내는 수학의 스칼라량이다. 이 방향을 놓고 서양인들은 재미있는 생각을 했다. 바로 방향을 분해해 보는 것이다. 서양인들은 분해와 합성을 좋아한다.

그림10


그렇다면 거리d와 각도 알파 정보를 사용하여 다시 a와 b 성분을 구할 수 있을까? 거리 d는 a와 b의 연산 합성으로 만들어진 것을 기억한다면 a와 b는 d를 분해하여 다시 얻을 수 있을 것 이다.

그림11


스칼라량을 분해하는 것은 사칙연산으로 가능하지만 방향을 분해하는 것은 그렇지 않다. 방향은 어떤 차원 속에서 생성되기 때문에 다른 방법이 필요하다. 이 때 등장하는 것이 바로 삼각함수다. 즉, 삼각함수의 주된 용도는 방향의 분해이다. 그리고 방향을 실수집합으로 변경해 주어 모든 수학 연산을 자유롭게 적용할 수 있다. 예를 들어 1+45도 의  답은 무엇일까? 답은 + 연산을 수행할 수 없다이다. 왜냐하면 실수와 각도 간에는 + 연산이 적용되지 않기 때문이다. 위의 연산을 가능하게 하려면 방향 정보를 실수로 바꿔서 연산해야 한다. 이에 대한 자세한 내용은 '정보의 합성과 추출로 생각한 4칙연산'편에서 자세히 다루겠다.  그림12를 보면 x 축 성분을 구할 때 d*cos(알파) 를 적용했고 y축 성분을 구할 때는 d*sin(알파)를 사용했다. 각 성분을 구할 때 언제 cos을 쓰고 sin을 쓰는 지는 빗변의 위치에 따라 달라진다. 이상한 점은 d에서 x축 성분을 구하는데 cos(알파)를 곱하는 것이다. 응당 나눠야 할 것 같은데 말이다. 이 것은 삼각함수의 범위가 [-1, 1] 이기 때문에 삼각함수 기호 자체에 나눗셈을 포함하고 있기 때문이다.

그림12


그렇다면 만약 알파를 모른다면 d로 부터 a와 b성분을 구할 수 있을까?

그림13


벡터를 활용하면 구할 수 있다. 그것도 아주 쉽게 말이다.

그림14




그림16

그림17

그림18

그림19

그림20

그림21

그림22

그림23

그림24

그림25

그림26

그림27

그림28

그림29

그림30

그림31

그림32