본문 바로가기

알고리즘/수학

게임에서의 벡터와 내적, 그리고 외적

벡터란 뭘까?

(참고) 나는 수학에 거의 문외한이다.

그렇기 때문에 더 수학을 이해하고자 노력하려고 하며,

내 설명은 철저히 나와 같은 문외한들이 이해할 수 있도록 말하는 것을 목적으로 한다.

그러므로 다소 틀린 부분, 정확하지 않은 부분이 있을 수 있으며

이에 대해 태클을 건다면 당연히 여러분의 말이 정답이다.

아 그리고 태클 환영합니다 제발. 나 잘 몰라 알려줘..


 

벡터를 알기 전에 우리는 스칼라에 대한 이해와 에 대한 이해가 필요하지만

이건 나도 명확하게 모르고 대충 이해하고 있기 때문에 시간이 되면 나중에 자세하게 적어보기로 한다.

 

<< "전 그렇게까지는 알고 싶지 않은데요?" 라고 생각한다면, 첫 그림이 나올때까지 건너뛰면 된다. >>

 

체(Field)란?

간단하게만 말하자면, 체라는 것은 실수나 무리수와는 다르게 수를 정의하는 방법이며

대수의 한 정의로, 사칙연산(특히 덧셈과 곱셈. 뺄셈은 덧셈으로 정의가 가능하며 나눗셈 역시 곱셈으로 정의가 가능하기 때문에 덧셈과 곱셈만으로 정의한다.)의 결과가 한 집합 안에서 이루어 질 때 (집합 내의 모든 수의 범위에서 교환법칙, 결합법칙, 분배법칙이 성립하고 항등원, 역원이 존재할 때) 체의 구조를 지닌다고 한다.

 

우리는 당연하게 1 + 2 = 3 이라고 계산을 해왔지만, 이게 가능했던 이유는 1과 2가 실수에 속하고, 그 결과 3이 실수에 속하며, 실수 집합이 체이기 때문에 이러한 덧셈이 가능했던 것이다.

다른말로 실수 집합은 체이기 때문에 가능하다! 라고 증명하는 것이라 생각하면 된다.

 

이를 더 잘 이해하려면 군(Group), 환(Ring)에 대한 개념도 들여다 보아야 하지만.. 그만 알아보도록 하자.

 

스칼라(Scalar)란?

단순히 벡터의 반대, 크기만 존재하는 양을 의미한다고 알고있지만

사실은 이러한 체의 집합에 속해 있는 원소를 스칼라 라고 한다.

 

그렇다면, 벡터(Vector)란?

벡터는 벡터 공간 내의 원소를 의미한다.

? 벡터 공간(Vector Space)은 또 뭔데?

 

벡터 공간의 정의를 대수적으로 설명하는 것은 수에 대한 이해가 필요한 일이다. 그러므로 나는 다룰 능력이 안된다 ㅋ..

그러므로 단순하게 말해서 벡터는 벡터 공간에 속하므로, 벡터 공간이란 벡터들이 모여있는 집합을 의미한다.

(그게 그 소리 아니냐고)

 

근데 아무 벡터나 다 되는건 아니고

덧셈과 스칼라 곱의 연산을 정의할 수 있으며, 벡터 공간의 공리를 만족하는 벡터들을 갖고 있는 공간이어야만 한다.

 

이게 무슨 소리냐면

그냥 덧셈이 가능하고, 스칼라 곱이 가능하며, 아래의 조건 (공리) 를 만족하면 된다는 것이다.

이해하기 쉽게 그냥 내 마음대로 적으므로 태클 거는 이가 있다면 당신의 말이 무조건 맞습니다

 

1. 덧셈에 대한 교환법칙

: 모든 벡터 V1, V2에 대해 V1 + V2 = V2 + V1 이어야 한다. 덧셈의 순서가 바뀌어도 결과가 동일해야 한다.

 

2. 덧셈에 대한 결합법칙

: 모든 벡터 V1, V2, V3에 대해 (V1 + V2) + V3 = V1 + (V2 + V3) 이어야 한다. 앞쪽의 연산을 먼저 하나, 뒤쪽의 연산을 먼저 하나 그 결과가 동일해야 한다.

 

3. 덧셈에 대한 항등원이 있어야 함

: 모든 벡터 V1에 대해 V1에 더해져 자기 자신(V1)이 나오게 하는 벡터가 존재해야 한다.

  V1 + X = V1 인 벡터가 있어야 하며, X는 Zero-Vector가 될 수 있다. 이 때 Zero-Vector는 벡터 공간에 속하므로 항등원이 존재한다. V1에 영벡터를 더하면 V1이므로 ㅇㅇ

 

4. 덧셈에 대한 역원이 있어야 함

: 모든 벡터 V1에 대해 V1에 더해져 항등원이 나오게 하는 벡터가 존재해야 한다.

  앞서 항등원이 Zero-Vector 라는 것을 알았다. 따라서 V1 + X = 0이 되는 X가 존재해야 하며, X는 -V1이 될 수 있고 -1 * V1은 벡터의 스칼라 곱으로써 벡터 공간에 속하므로 역원이 존재한다고 본다.

 

5. 벡터의 분배법칙

: 모든 벡터 V1에 대해서 스칼라 A, B가 있을 때 (A + B) * V1 = AV1 * BV1 이어야 한다.

  즉, 스칼라 덧셈을 벡터에 분배할 수 있다.

 

6. 스칼라의 분배법칙

:  모든 벡터 V1, V2에 대해서 스칼라 A가 있을 때 (V1 + V2) * A = AV1 + AV2 이어야 한다.

   즉, 벡터 덧셈을 스칼라에 분배할 수 있다.

 

7. 스칼라의 결합법칙

: 모든 벡터 V1에 대해서 스칼라 A, B가 있을 때 (A * B) * V1 = A * (B * V1) 이어야 한다.

  즉, 스칼라 곱에 대해서 연산 순서가 상관이 없다.

 

8. 스칼라 곱에 대한 항등원이 있어야 함

 : 모든 벡터 V1에 대해서 스칼라 A가 있을 때 A * V1 = V1인 스칼라 A가 존재해야 한다.

    1 * V1 = V1이다.


9. 덧셈에 닫혀 있어야 함

 : 모든 벡터 V1, V2에 대해서 V1 + V2 도 동일한 벡터 공간 내의 원소여야 한다.

 

10. 스칼라 곱에 닫혀 있어야 함

 : 모든 벡터 V1에 대해서 스칼라 A가 있을 때 A * V1 도 동일한 벡터 공간 내의 원소여야 한다.

 

 

굉장히 당연한 말처럼 보일 수 있는데, 위와 같이 정의하는 이유는 꼭 우리가 생각하는 벡터 공간만 있으리란 법이 없기 때문이다. 우주에 지구 외에도 다양한 행성과 항성, 은하, 은하군, 대은하군 등등이 존재하듯이 말이다.

 

어쨌든 우리가 앞으로 이야기하는 특정한 벡터 공간 내의 벡터에 대해서는 위의 법칙을 모두 만족하므로 이를 생각하며 계산하면 된다는 뜻이다.


 

어쨌든 위와 같은 공리를 통해 우리는 벡터에 스칼라 곱이 가능하고, 이를 정의할 수 있는 것이 벡터다 라는 것을 알게 되었다. 이를 정확히 이해하려면 또 기저(Basis)차원(Dimension)을 알아야 한다. 기저를 이해하기 위해서는 또 벡터의 생성(Span)선형 독립, 의존(Linear Independence, Linear Dependence)을 이해해야 한다.

 

근데 내 경험상 이걸 아무것도 모를 때 이해하려고 하면 뇌가 아프니까 나중에 알아보도록 하자.

 

어쨌든 우리는 스칼라 곱을 아래처럼 정의할 수 있다.

가령 y = 2x 라는 방정식이 존재한다고 생각해 보자.

이를 직교 좌표계로 나타내 보면 아래와 같을 것이다.

 

 

그러면 이 안에 벡터라는 놈이 있다는건데, x와 y의 해는 무한히 많으므로 이걸 딱 잘라 표현하기가 힘들다.

 

 

그럼 혹시, 이렇게 방향을 표시한다면 직선을 무한히 길게 그리지 않아도 되는게 아닐까?

 

 

또, 이 선분들이 무수히 많이 모이면 그게 직선이 되는게 아닐까?

그렇다면 이 하나의 선분을 자르는 기준을 크기라고 보고 정의할 수 있지 않을까?

 

 

그렇다. 그래서 우리가 보는 이놈이 바로 벡터이며, 벡터는 크기와 방향을 갖는 단위를 의미한다.

또, 이 벡터를 표현하기 위해 필요한 이 공간 전체를 바로 벡터 공간이라고 부른다.

그리고 컴퓨터 그래픽스는 모두 이 벡터라는 놈으로 이루어지고 계산된다.

 

즉 이 공간들은 사실 모두 벡터로 빽빽하게 채울 수 있다.

그런데 저렇게 y = 2x 의 직선만으로는 모든 공간을 채울 수가 없다. 그저 직선 하나가 공간 위에 그어질 뿐이며,

실제로 저 안에서의 모든 벡터는 위 사진들에서도 볼 수 있듯이 저 직선 위에서만 그릴 수 있다.

 

이를 선형 의존(Linear Dependence) 혹은 종속인 상태라고 한다.

1차원적인 직선에 의존하고 있으니까 선형 의존인거지 ㅇㅇ

 

반대로, 이렇게 어느 선형적 구조에 의존하지 않고 모든 벡터를 생성(Span)할 수 있는 상태를

선형 독립(Linear Independence)이라고 한다.

 

 

그렇다. 이게 뭔 개소리일까?

 

 

조금 더 자세히 들여다 보자면, 초록 화살표는 사실 빨간색 화살표와 파란색 화살표를 따라 이동한 결과이다.

즉, 초록 화살표는 빨간 화살표와 파랑 화살표의 결합에 의해 생성될 수 있는 벡터라는 말이다.

이를 선형 결합(Linear Combination)이라고 한다.

 

다시, 이를 조금 바꾸어 말하면

초록 화살표는 빨간 화살표와 파랑 화살표에 의해 생성되기 때문에 선형 의존이라고 할 수 있다.

 

이제 선형 의존이라는 말이 조금 더 와닿지 않은가?

 

 

* 이와 같은 성질로 인해 수학에서는 선형 결합을 아래와 같은 수식으로 정의한다.

x와 y를 각각 빨간 화살표, 파란 화살표라고 했을 때, 이를 무엇이든 바꿔서(스칼라곱) 하여 벡터를 만들어낼 수 있다는 말이다. 뭐, 방금 설명했던 내용을 그대로 수학의 언어로 바꾼 것 뿐이다 ㅇㅇ


 

근데 그럼 빨간선이랑 파랑선은 서로 다른 벡터의 선형 결합으로 만들 수 있을까?

결론부터 말하자면 그럴 필요가 없다.

 

빨간 선. 가령, (1,0) 이라는 벡터라고 생각해 보자. 이는 y=0 인 형태로, x만을 필요로 한다.

그러므로 결합에 의해 생성될 필요가 없다.

 

파란 선도 마찬가지이다. 가령, (0,1) 이라는 벡터라고 생각해 보자. 이는 x=0 인 형태로, y만을 필요로 한다.

그러므로 이것도 역시 결합에 의해 생성될 필요가 없다.

 

그러므로 이 두 벡터는 선형 독립이다 라고 표현할 수 있다.

엄마 아빠가 필요 없으니, 독립한거 맞잖아. ㅇㅇ

 

이제 선형 독립이라는 것이 와닿지 않는가?


 

즉, 우리가 데카르트 좌표계 내에서 벡터 공간을 정의하고 벡터를 그리려면 결국 X 벡터와 Y 벡터가 필요하다.

 

그러니까 사실은 우리가 벡터를 그리며 사용했던 이 2차원 공간은 사실 빨간 벡터와 파란 벡터가 만들어낸 벡터 공간으로 볼 수 있으며, 이 내부의 모든 원소는 이 두 벡터의 결합으로 만들 수 있다.

 

이렇게 두 기준이 되는 벡터를 기저 벡터(Basis Vector) 라고 한다.

 

그렇다. 말 그대로 기초가 되는 벡터라는 뜻이다.

그리고 이런 녀석들은 단순히 한개가 아니다. 벡터 공간에서 선형 독립인 벡터는 무한히 많으며

이 집합을 바로 기저(Basis)라고 한다. 기저 벡터들의 집합이니까 그냥 "기저" 인거다. ㅇㅇ

 

두 선형 독립인 벡터로 원소를 만들어 낼 수 있기 때문에 모두 기저 벡터라고 할 수 있다. 각각의 벡터 공간 내에서 모든 벡터를 Span 할 수 있다.

 

그리고 우리는 누구나 이 공간을 보고 2차원이라고 생각한다.

대체 왜일까? 바로 기저 벡터가 2개 있기 때문이다.

 

이것이 바로 차원(Dimension)이다. 2차원이라면 기저 벡터가 2개로 이루어져 있으며, 3차원이라면 기저 벡터가 3개로, 4차원이라면 기저 벡터 4개로 이루어져 있을 것이다.

 

반대로 0차원이라면 기저 벡터가 없겠지? 오직 하나의 원소(Zero-Vector)만 존재하게 되는 것이다.

예를 들면, 3차원 공간은 이처럼 기저 벡터가 3개라고 할 수 있다. (X, Y, Z)

 

근데 이 기저 벡터들에게는 한 가지 성질이 있다.

바로 모든 기저 벡터들 끼리는 서로가 수직이라는 점이다.

 

2차원도 X, Y축은 서로 수직이다. (다른 말로 선형 독립이다)

3차원도 X, Y, Z축은 서로 서로가 수직이다. (마찬가지로 선형 독립이다)

 

이것이 벡터에서는 아주 아주 아주 중요한 성질이니 꼭 기억하고 있도록 하자.


 

그래, 대충 벡터가 뭔지는 알았다. 그래서 너가 뭘 할 수 있는데?

죄송합니다 대재학형님

 

일단, 컴퓨터에 그려지는 모든 것들이 벡터 공간이라는 것을 이해한 다음 벡터가 어떻게 사용되는지를 먼저 알아보자.

 

우리가 만약 컴퓨터 그래픽스 세상 속에서 물건을 들어올렸다면, 이에 대한 벡터를 정의할 수 있다.

즉, 방향과 크기를 정의할 수 있다는 것이다.

 

가한 힘의 방향은 물체에 대해 수직 방향이 될 것이며, 그 크기는 물체의 무게 * 이동거리만큼의 힘을 가한 것이라고 할 수 있다. 이를 화살표로 나타내면 아래와 같을 것이다.

 


방향은 수직 방향으로, 100cm의 거리만큼 움직였다는 크기를 보여주는 벡터라고 할 수 있다.

즉 이처럼, 단순히 오브젝트를 움직이는 것 조차 벡터에 기반한다.

실제로 유니티도, 언리얼도 이러한 움직임을 벡터로 나타내고 입력할 수 있게 되어있지 않은가?

 

결국 모든 움직임은 벡터에 기반한다는 것을 확실히 알고 넘어가야 한다.

 

벡터의 덧셈

벡터의 뺄셈

벡터의 내적

벡터의 외적

 

작성중...

'알고리즘 > 수학' 카테고리의 다른 글

[C++] 소수 판별 알고리즘  (0) 2024.03.30