본문 바로가기

게임수학

벡터

수벡터

2차원이나 3차원에서의 점의 위치를 수치의 조합으로 나타낼 경우, 이 조합의 순서에서는 의미가 있다.
x, y, z의 순서를 (x, y, z) 안에서 바꿔 버리면 전혀 다른 좌표가 된다. 이 수치의 조합은 각 요소에 순서가 정해진 배열이지 단순한 수치의 집합(set)이 아니다. 이처럼 순서가 있는 수치로 조합된 벡터를 수벡터라고 부른다.

배열로 벡터를 표현한 경우, 하나하나의 요소를 벡터의 성분이라고 한다. 성분을 옆으로 나열한 형식인 행벡터 또는 성분을 세로로 나열하는 열벡터 표기 방식을 사용한다. 이 둘은 벡터로서 동일하다.

기하벡터

성분의 배열로 벡터 표현을 하지 않고, 크기, 방향을 가진 양으로서 벡터를 정의 할 수 있다.
벡터의 화살표를 시작되는 점을 시점, 화살표 끝 점을 종점으로 표시한다. 해당 벡터는 아래와 같이 표현한다.

단, 식 안의 모든 양이 벡터인 경우처럼 이 표기법을 항상 적용하기가 번잡할 때는 화살표 기호를 생략하기도 한다.
이 기하하적 벡터는 좌표계와 관계없이 존재하는데, 이를 벡터를 기하벡터라고 한다.
벡터 AB가 평행이고, 크기가 같은 벡터인 A`B`가 있다고 할 때, 사작과 종점은 달라도, AB와 A`B`를 같다고 보는 것이 기하벡터의 사고 방식이다. 한편 좌표계와 원점이 없는 기하벡터가 존재하는 장소를 아핀 공간이라 부른다.

스칼라

크기와 방향이 있는 양을 가리켜 벡터라고 한다면, 크기만 있는 일반적인 수치는 보통 스칼라로 부른다. 위치 벡터에서 요소 하나하나는 스칼라다. 길이, 질량 또는 시간은 당연히 방향이 존재하지 않기 때문에 스칼라이다.
컴퓨터의 CPU로는 크기와 방향을 가진 양으로서의 기하벡터 자체를 직접 처리할 수 없으므로, 어디까지나 스칼라양 또는 스칼라 배열로 수벡터를 처리하한다.

벡터 연산 - 덧셈, 뺄셈, 교환법칙, 결합법칙

기하벡터 a와 기하벡터 b가 있을 때, a의 시점부터 b의 종점에 이르는 벡터를 a + b의 합으로서 벡터의 덧셈을 정의할 수 있다. 

a + b = b + a

 

다음 식이 성립하는데, 이를 교환법칙이 성립했다고 한다.

기하벡터 b를 역방향으로 한 역벡터인 -b도 정의할 수 있어, 다음처럼 벡터의 뺄셈을 나타낼 수 있다.

a + (-b) = a - b

 

뺄셈은 다음과 같이 우변에 마이너스를 부호를 적용할 필요가 있으므로, 교환법칙이 성립되지 않기 때문에 반가환이다.
a - b = -(b - a)

 

b에 -b를 더한 경우는 원래 시점으로 되돌아가므로, 시점에서 시점으로 향하는 길이가 0이고 방향도 없는 벡터가 된다는 것을 알 수 있다. 이 특별한 벡터를 영벡터(Zero Vector)라고 한다. 영벡터 0에 관해서는 다음 식이 성립된다.

a + 0 = 0 + a = a

 

또한, 기하벡터 c가 하나 더 있을 때는 다음과 같다.

(a + b) + c = a + (b + c)

 

이처럼 괄호의 위치를 이동해도 결과가 같은 상태를 결합법칙이 성립했다고 한다.

벡터 연산 - 스칼라 곱셈, 나눗셈

벡터의 뎃셈, 뺄셈은 벡터끼리 연산했지만, 벡터에 스칼라를 곱해 스칼라 곱을 구하거나 벡터를 스칼라로 나눌 수 있다. 그 결과는 다른 길이의 새로운 벡터가 된다. 

 

벡터 a, b와 스칼라 c에 대해 다음처럼 분배법칙이 성립한다.

c(a + b) = ca + cb

 

단위벡터

크기가 1인 벡터는 단위벡터라 한다. 벡터 a와 같은 방향의 단위벡터 u는 a의 길이 |a|로 a를 나누거나 또는 |a|의 역수를 곱해서 구할 수 있다.

단위벡터를 구하는 조작을 가리켜 벡터를 정규화한다고 표현한다. 유니티에서는 normalized를 사용하면 원래 벡터의 단위벡터를 구할 수 있다.

기저와 좌표계

3D 직교좌표계에서 원점에 해당하는 위치를 시점으로 x축, y축, z축 방향으로 각각 단위벡터 i, j, k가 뻗어 있다고 가정할 때,  해당 좌표계상의 임의의 점을 가리키는 위치벡터는 a는 다음과 같이 나타낼 수 있다.

a = a(x) + a(y) + a(z)

여기서 a(x), a(y), a(z)는 가각 i, j, k를 곱한 것이기 때문에 다음과 같이 나타낼 수 있다.

a = xi + yj + zk

 

이처럼 기하벡터를 이용해도 직교좌표계를 표현할 수 있고, 또 거꾸로 기하벡터를 좌표의 수벡터로서 나타낼 수 있어, 컴퓨터 상에서 단순한 배열 데이터로 처리할 수 있다. 또한, 여기서는 서로 직교하는 단위벡터 i, j, k를 이용해 3D 직교좌표계를 표현했지만, 직교하지 않는 단위 벡터를 여러 개 이용하면 사교좌표계를 표현할 수 있다.

 

단 서로 평행인 벡터로는 좌표계를 표현할 수 없다. 또한 3D 공간을 표현하고 싶은데, 세 개의 벡터가 모두 같은 평면에 있어도 좌표축으로 사용할 수 없다. 그 벡터들은 선형종속이라 불리며, 하나의 벡터를 다른 벡터의 합으로 표현할 수 있는 상태가 된다. 반면에 선형종속이 아닌 상태를 선형독립이라고 한다.

선형독립이고 좌표계 표현에 사용할 수 있는 벡터(앞에 예에서는 i, j, k)를 가리켜 기저벡터라하고 그 집합을 기저라 부른다.벡터가 만족하는 덧셈과 스칼라 곱이 잘 정의된 벡터공간이라는 집합에서는 좌표계를 나타내는 기저를 구성하는 기저벡터의 개수를 차원이라 부른다.

법선벡터

법선벡터는 2D인 경우에는 어떤 벡터에 수직인 벡터이고, 3D인 경우에는 어떤 평면에 수직인 벡터다. 법선이라는 개념 자체는 벡터에 국한되지 않고, 수직인 직선을 의미한다. 이 같은 법선벡터는 3D 컴퓨터 그래픽스에서는 매우 응용 범위가 넓으면 다양한 장면에서 사용한다. 벡터 v를 그 시점이 속한 면에 수직인 벡터와 그 면상의 벡터로 분해했을 때, 수직인 벡터를 가리켜 v의 법선성분이라고 하고, 면상의 벡터를 v의 접선성분이라고 한다. 법선벡터는 평면을 정의하는데도 사용할 수 있는데, 점 P와 P를 시점으로 하는 법선벡터 N이 있을 때 P를 포함하는 평면의 표면이 어느 쪽을 향하는지 결정할 수 있다.

크기

벡터 v의 크기는 절댓값 기호와 같은 기호를 사용해 스칼라양과 마찬가지로 | v |로 표기하는 방식과 벡터의 크기를 노름이라 부르고 || v ||로 표기하는 방식이 있다.

좌표축을 사용하면, 위치벡터의 좌표에 표시되는 각 성분의 수치를 피타고라스의 정리에 적용해 벡터의 크기를 구할 수 있다. 

3D 벡터 v 역시 마찬가지로 다음과 같이 구한다.

단 이렇게 벡터의 크기를 구하려면 제곱근 연산이 필요한데 컴퓨터 상의 제곱근 연산은 실행 비용이 많이 들어, 그러므로 두 개 벡터의 크기만 비교하고 싶을 때는 제곱근을 구할 것까지 없이, 벡터의 크기를 제곱한 값끼리 비교하는 것으로 충분하다. 유니티에서는 sqrMagnitude 함수로 벡터 크기의 제곱을 나타낼 수 있다.

내적

내적은 두 개의 벡터를 하나의 스칼라양으로 변환하는 연산이다. 벡터 a와 벡터 b의 내적은 수식상으로 도트 연산자를 아용해 a · b로 표기한다. 내적이 추가된 벡터 공간은 내적공간이라고 한다. 

내적이라는 연산이 어떤 사양을 만족해야 벡터를 다루는 도구로서 바람직한지 예를 들어보면,  다음 식처럼 벡터 자신의 내적은 해당 벡터 크기를 제곱한 스칼라양이 다음과 같다고 가정한다.

a · a = ||a||^2

 

여기서, 삼각형 내각 θ를 이루는 두 변에 해당하는 벡터를 각각 a, b라고 하고, 나머지 한 변을 벡터 c라고 할 때, 다음과 같이 식이 성립된다.

c = a - b

이 사실을 전제로 하고, 내적이라는 연산에서 분배, 교환법칙이 성립한다고 가정하여, c와 c의 내적의 식을 전개해보면 다음과 같다.

c · c = (a - b) · (a - b)

 = a · (a - b) - b · (a - b)

 = a · a - a · b - b · a + b · b

 = a · a + b · b - 2a · b

 = ||a||^2 + ||b||^2 -2a · b

또한, 맨 처음 설정했던 것처럼 c · c = ||c||^2이므로 다음 식이 성립된다.

||c||^2 = ||a||^2 + ||b||^2 - 2a · b

코사인법칙을 이 삼각형에 적용해보자.

||c||^2 = ||a||^2 + ||b||^2 - 2||a|| ||b|| cosθ

이들 두 식은 모두 ||c||^2를 표현하므로, 우변끼리 같아져 다음 식이 성립한다.

||a||^2 + ||b||^2 - 2a · b = ||a||^2 + ||b||^2 - 2||a|| ||b|| cosθ

이 방정식을 풀면 최종적으로 다음 식을 얻을 수 있다.

a · b = ||a|| ||b|| cosθ

θ가 0일 때, cosθ = 1이므로, 벡터 자신과의 내적은 벡터 크기의 제곱과 같다고(a · a == ||a||^2)고 처음에 설정한 성질도 이 식으로 표현할 수 있다. 또한 a가 b에 수직일 때, cosθ = 0이므로, a · b = 0이다.

나아가, 2D에서 원점 O를 기준으로 한 위치벡터로서 a와 b를 생각하고 a의 성분 혹은 점A의 좌표를 (a{x}, b{y})로 하여 이들 좌표와 내적 관계를 구할 수 있다.

||c||^2 = ||a||^2+ ||b||^2 - 2a  · b

여기서 피타고라스의 정리를 사용하면, c는 직각삼각형의 빗변에 해당하므로 다음 식이 성립한다.

||c||^2 = (a(x) - b(x))^2 + (a(y) - b(y))^2

마찬가지로 다음 식이 성립한다.

||a||^2 = a(x)^2 + a(y)^2

||b||^2 = b(x)^2 + b(y)^2

따라서 다음과 같이 만들어진다.

(a(x) - b(x))^2 + (a(y) - b(y))^2 = a(x)^2 + a(y)^2 + b(x)^2 + b(y)^2 - 2a · b

이 식을 전개하면 다음과 같은 식을 얻을 수 있다.

a · b = a(x)b(x) + a(y)b(y)

한편, 3D 벡터라면 (a(x),a(y),a(z))와  (b(x),b(y),b(z))에 대해 똑같이 계산해서 다음처럼 내적의 성분표시를 얻을 수 있다.

a · b = a(x)b(x) + a(y)b(y) + a(z)b(z)

사인과 코사인으로 대표되는 초월함수라 불리는 종류의 함수는 일반적으로 컴퓨터상에서 처리비용이 비싸므로, 내적을 계산으로 구할 때는 가능한 한이 성분표시를 사용해야 한다.
내적에는 교환법칙과 분배법칙이 성립하고, 스칼라 상수를 곱할 수 있다. 벡터 a, b, c와 스칼라 상수 n을 사용하면 다음 식이 성립한다.

a · b = b · a

(a + b) · c = a · c + b · c

(na) · b = a · (nb) = n(a · b)

결합법칙은 내적의 경우 결과가 스칼라다 보니 스칼라를 곱하는게 되어버리므로 정의되지 않는다.

벡터의 직교투영

직교투영이란 직관적으로 말하자면 빛이 닿았을 때 생기는 그림자 형태라고 생각하면 된다.

벡터 a의 종점에서 벡터 b를 향해 수직으로 내린 선과 b가 교차하는 점에서부터 b의 시점까지의 길이는 ||a|| cosθ다.

여기서 a · b = ||a|| ||b|| cosθ라는 사실을 떠올리면 ||b|| = 1, 다시 말해 b가 단위벡터일 때, 다음처럼 나타낼 수 있다.

a · b = ||a|| cosθ

a에서 b로 직교투영한 길이(스칼라양)는 a와 단위벡터 b와의 내적으로 구해진다는 사실을 알 수 있다. 또한, b와 같은 방향으로 a를 b로 직교투영한 길이를 가지는 벡터 b`는 b가 단위벡터일 때, 다음과 같다.

b` = (a · b)b

이처럼 벡터는 단위벡터로 되어 있으면 사용하기 편리하므로, 유니티의 vector3 클래스도 그런 점이 고려되었다.
예를 들어 normalized 프로퍼티에 더해 Vector3.forward 와 같은 z축 방향으로 (0, 0, 1)만큼 전진하는 벡터를 나타내는 프로퍼티도 마련되어 있다. 또한 직교투영을 구하는 Project 메서드를 제공한다.

내적의 응용

벡터 a와 b의 내적(a · b = ||a|| cosθ)은 a와 b가 이루는 각 θ를 변화시킴으로써, 바뀌는 cosθ 값에 따라 변한다. 이 점을 이용하여 단순한 방법으로 a와 b의 관계를 파악할 수 있다.

라디안으로 말하자면, x축의 각도 θ가 0에서 2π(360도)로 변화하는 동안 y축의 cosθ 값은 1 -> 0 -> -1 -> 0 ->1로 코사인파에 따라서 변화한다. 특히 π / 2의 경우 0이 되므로 이해하기 쉽다.
또한 그림의 오른쪽은 벡터 a와 b(n)이 이루는 각도와, 해당 각도일 경우, cosθ의 실제 값을 나타낸다. 여기서는 a와 b의 내적은 a와 b가 이루는 각 θ에 따라 다음과 같이 변화한다는 것을 알 수 있다.

  • a와 b가 완전히 같은 방향을 향할 때(a와 b가 평행) : a · b = ||a|| ||b|| (이때 cos0 = 1)
  • θ가 90도보다 작을 때 : a · b < ||a|| ||b||
  • b(3)가 a에 수직일 때: a · b= 0(cos π / 2 = 0)
  • θ가 90도와 180도 사이일 때: a · b < 0이고 | a · b | < ||a|| ||b||
  • a와 b(6)가 반대일 때: a · b - ||a|| ||b|| (cos π = -1)

이처럼 내적 값의 부호와, a와 b 길이의 곱과 a와 b의 내적을 비교함으로써, 두 벡터의 위치 관계를 조사할 수 있다.

외적

외적은 두 개의 벡터에서 한 개의 스칼라를 생성하는 내적과 달리, 두 개의 벡터에서 새로운 한 개의 벡터를 생성하는 연산이다. 외적과 내적의 또 다른 차이점은 벡터를 생성하는 것이 외적 연산이라고 정의했을 때, 2차원 벡터끼리의 외적이란 없고, 3차원 이상의 벡터가 아니면 외적을 정의할 수 없다는 것이다.(쐐기곱이라는 개념을 도입하면 2차원, 3차원 관계없이 더 일반적인 광의의 외적을 표현할 수 있긴 하다.)

외적으로 생성되는 벡터는 두 개의 벡터 a, b에 수직이고 a, b로 이루어지는 평행사변형의 면적과 크기가 같은 벡터다.

유니티에서는 Vector3의 Cross 메서드를 사용하면 외적을 계산할 수 있다.

외적의 응용

외적의 크기에 관해서는 다음 식이 성립한다

||a x b|| = ||a|| ||b||sinθ

그러므로, 다음과 같은 내적의 정의를 떠올리면, 외적의 크기도 내적과 마찬가지로 θ에 따라 변동하는 스칼라양이라는 것을 알 수 있다.

a · b = ||a|| ||b||cosθ

 

이때 차이점은 외적의 크기가 사인파에 따라서 변화한다는 것이다. 다시 말해 내적은 90도일 때, 0이 되었지만 외적의 크기는 0도와 190도일 때 0이 된다. 내적은 벡터의 직교 판정에 사용하고, 외적의 크기는 평행 판정에 사용할 수 있다.

이 사실은 두 개의 벡터가 서로 평행일 때 두 개의 벡터로 이루어지는 평행사변형의 면적이 0이 된다는 점에서도 분명하다.

 

하지만, 외적에 관해 가장 직접적인 사용법은 평면의 법선벡터를 구하는 것이다. 세 개의 정점으로 구성되는 삼각형의 두 변을 이루는 벡터의 외적을 구해 정규화해주면, 그 삼각형이 존재하는 평면의 법선벡터를 얻을 수 있다.

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

게임 앱 환경  (1) 2025.02.02
곡선  (0) 2025.02.02
행렬  (1) 2025.01.30
좌표계  (0) 2025.01.28
삼각함수  (1) 2024.04.06