* 정의
벡터(vector)란 크기(magnitude)와 방향(direction)을 모두 가진 수량(quantity)을 가리키는 말이다.
* 사용예시
일반적으로 힘, 변위, 속도를 나타내는데 쓰인다.
3차원 게임에서는 플레이어가 바라보는 방향, 다각형이 향한 방향, 광선이 이동하는 방향, 한 표면에서 광선이 반사되는 방향 등 순수한 방향만 나타낼 때도 벡터가 쓰인다.
* 벡터와 좌표계
컴퓨터는 벡터를 기하학적으로 다루지 못하기 때문에, 벡터를 수치로 지정하는 방법이 필요하다.
그 방법은 공간에 3차원 좌표계를 도입하고 모든 벡터를 그 꼬리가 그 좌표계의 원점과 일치하도록 이동함으로써 하나의 벡터를 그 머리의 좌표로 규정할 수 있게 된다.

같은 벡터라도 좌표계가 다르면 좌표 표현이 달라진다.
기준이 달라지면 해당 기준에 대한 좌표표현도 달라질 수 밖에 없다. 예를 들어 섭씨온도에서 100도로 표현되는 온도는 화씨온도에서는 212도로 표현된다. 표현하는 숫자는 다르지만 물리적인 온도는 같다.
3차원 공간에서는 여러가지 좌표계를 사용하기 때문에 현재 벡터가 어떤 좌표계에 있는지 인지하고, 필요하다면 다른 좌표계로 변환하여 사용하여야 한다. (ex. 어떤 물체의 로컬좌표계에서의 방향을 월드좌표계에서 표현할 때 등)


* 왼손 좌표계와 오른손 좌표계
3차원 공간을 표현할 때 왼손좌표계와 오른손좌표계 중 하나로 표현한다.
엄지 검지 중지 순으로 x y z 축으로 생각하고 확인해보면 된다. 각각 공식은 오른손과 왼손을 사용한다.

왼손좌표계 : 각 축에서 시계방향 회전 / DirectX, Unity, Unreal Engine
오른손좌표계 : 각 축에서 반시계방향 회전 / OpenGL, 3ds Max
* 기본 벡터 연산
U = (ux, uy, uz), V = (vx, vy, vz)
두 벡터에 대해서 연산은 다음과 같이 정의된다.
- 상등
두 벡터가 상등이라면 ux = vx, uy = vy, uz = vz를 만족해야한다.
- 덧셈
덧셈은 성분별로 이루어진다. U + V = (ux + vx, uy + vy, uz + vz)
기하학적으로 U의 꼬리가 V의 머리와 일치하도록 평행 이동했을 때, V의 꼬리에서 U의 이동 후의 머리까지의 벡터를 의미한다.

- 스칼라 곱셈
k가 스칼라이면 kU = (k * ux, k * uy, k * uz)
기하학적으로 부호가 -일때 방향을 뒤집는 것을 의미하고, k만큼 벡터를 확대 or 축소하는 것을 의미한다.

- 뻴셈
벡터 덧셈과 스칼라 곱셈을 통해서 정의된다. U - V = U + (-1 * V) = (ux - vx, uy - vy, uz - vz)
기하학적으로 U와 V를 점으로 해석한다면 U-V는 점 V에서 U로 가는 벡터에 해당한다.
또한 이 길이는 U와 V사이의 거리를 의미하기도 한다.

* 길이와 단위벡터
한 벡터의 크기는 해당 벡터의 선분의 길이를 구하면된다.
||U||로 표기하며, 벡터 U의 크기를 뜻한다.

피타고라스의 정리에 따라 공식은 다음과 같다.
||U|| = √(y² + a²) = √(y² + (√(x² + z²))²) = √(y² + x² + z²)
벡터를 순전히 방향을 나타내는 용도로만 사용하는 경우에는 벡터의 길이가 중요하지 않다.
방향 전용 벡터의 길이를 1로 맞추어두면 편리한데, 이를 단위벡터라고 한다. 이때 길이를 1로 만드는 과정을 정규화(normalization)이라고 한다.
U의 단위벡터 = U/||U|| = (x/||U||, y/||U||, z/||U||)
* 직교투영(정사영)
도형의 각 점에서 한 도형에 내린 수선의 발이 그리는 도형을 직교투영(orthographic projection) 또는 정사영이라고 한다. 간단한 예시를 들어보면 도형 A의 각 점에서 도형 B에 내린 수선의 발로 이루어진 도형 A'를 도형 A의 도형 B 위로의 정사영이라고 한다.
다음과 같은 그림에서 벡터v와 단위벡터n이 주어졌을 때 v의 n 위로의 정사영인 p(n에 대한 v의 직교투영)를 내적을 이용해서 v와 n으로 표현할 수 있다.


p = kn를 만족하는 스칼라 k가 존재한다.
||n|| = 1이므로 반드시 ||p|| = ||kn|| = |k| ||n|| = |k|이다. (k는 오직 p와 이 반대방향일 때만 음수이다.)
k = ||v||cosθ // 둔각일 때도 삼각항등식에 의해 cosθ = -cos(π - θ)이기 때문에 그림상에서 정확히 k가 나온다.
p = kn = (||v||cosθ)n = (||v|| ||n|| cosθ)n = (v · n)n 이기 때문에 k = v · n가 성립한다.
n이 단위 길이가 아니면 먼저n을 정규화해서 단위 길이로 만들어야 한다. 최종식은 다음과 같다.
p = proj n (v) = (v · n/||n||) n/||n|| = (v · n)/||n||² * n
만약 v를 하나의 힘으로 간주한다면 p는 힘 v중에서 방향n으로 작용하는 부분이다.
w = perp n (v) = v - p 는 힘 v중에서 n의 수직 방향으로 작용하는 부분이다.
즉 v는 v에 대한 n방향과 n방향의 수직방향에서 작용하는 힘의 합이다. v = p + w = proj n (v) + perp n (v)
* 직교화
벡터집합 {v(0), ... , v(n-1)}의 모든 벡터가 단위 길이고 서로 직교일 때, 이러한 벡터 집합을 정규직교(orthonormal)집합이라고 부른다.
3차원 컴퓨터 그래픽에서 정규직교집합으로 시작했지만 수치 정밀도 문제로 정규직교가 아니게 되는 경우도 생긴다.
@ 2차원의 정규직교 : 벡터집합 {v1, v2}을 직교화해서 정규직교 집합 {w0, w1}을 구해보자.

1. w0 = v0으로 시작한다.
2. 벡터 w0와 직교하는 벡터를 구해야하는데, 이를 위해서 v1에서 proj w0 (v1)을 빼주면 된다.
w1 = v1 - proj w0 (v1)
3. w0, w1을 정규화 시켜준다.
@ 3차원의 정규직교 : 벡터집합 {v1, v2, v3}을 직교화해서 정규직교 집합 {w0, w1, w3}을 구해보자.

1. w0 = v0으로 시작한다.
2. 벡터 w0와 직교하는 벡터 w1을 구해야하는데, 이를 위해서 v1에서 proj w0 (v1)을 빼주면 된다.
w1 = v1 - proj w0 (v1)
3. 벡터 w0, w1과 직교하는 벡터 w2를 구해야하는데, 이를 위해서 v2에서 proj w0 (v2)와 proj w1 (v2)을 빼주면 된다.
w2 = v2 - proj w0 (v2) - proj w1 (v2)
4. w0, w1, w2를 정규화 시켜준다.
일반화 시켜보면 벡터들의 집합 {v(0), ... , v(n-1)}을 {w(0), ... , w(n-1)} 직교화할 때는 그람-슈미트 직교화(Gram-Schmidt Orthogonalization)를 적용한다.
| 기본단계 : w(0) = v(0)
| 1 <= i <= n-1에 대해 w(i) = v(i) - ∑(0 <= j <= i-1) proj w(j) (v(i))
| 정규화 단계 w(i) = w(i) / ||w(i)||
* 내적
https://create-new-worlds.tistory.com/377
내적
* 정의 점곱(dot product)이라고도 부르는 내적(inner product)은 스칼라값을 내는 벡터 곱셈의 일종이다. 결과가 스칼라기 때문에 스칼라 곱(scalar product)이라고 부르기도 한다. - 기본 공식 다음 두 벡터
create-new-worlds.tistory.com
* 외적
https://create-new-worlds.tistory.com/378
외적
* 정의 외적(cross product, outer product)은 3차원에서만 정의되는 개념으로 두 3차원 벡터 a와 b의 외적(a × b)은 a, b 모두에 직교인 또 다른 벡터 c로 정의된다. 이때 벡터 c의 방향은 두가지가 있을 수
create-new-worlds.tistory.com