비타Cpp

내적과 직교 투영 본문

DirectX12/게임 수학

내적과 직교 투영

멍C 2021. 7. 28. 12:09

점곱(dot product)이라고도 부르는 내적(inner product)은 스칼라값을 내는 벡터 곱셈의 일종이다.

u = (ux, uy, uz)이고, v = (vx, vy, vz)라고 했을때, 내적은 다음과 같이 정의된다.


u · v = uxvx + uyvy + uzvz


다른 말로하면 "내적은 대응되는 성분들의 곱들의 합" 이다.

 

내적의 기하학적 의미는 코사인 법칙을 적용해보면 알수 있다.

 


u · v = ||u|| ||v|| cosθ


θ는 두 벡터 u, v 사이의 0≤θ≤π를 만족하는 각도이다. 따라서 위 식은 두 벡터의 내적이 두 벡터 사이의 각도의 코사인을 벡터 크기로 비례한 것임을 뜻한다. 특히 u,v 둘다 단위 벡터일 때 경우 u · v는 두벡터 사이의 각도의 코사인이다. 이를 통해 내적의 유용한 기하학적 속성 몇가지를 이끌어낼 수 있다.

 


1. u · v = 0 이면, u ⊥ v 이다. (두 벡터는 수직이다.)

2. u · v > 0 이면, 두 벡터 사이의 각도 θ는 90도보다 작다. (두 벡터는 예각을 이룬다.)

3. u · v < 0 이면, 두 벡터 사이의 각도 θ는 90도보다 크다. (두 벡터는 둔각을 이룬다.)

 

(a)의 θ는 예각 이므로 u · v > 0, (b)의 θ는 둔각이므로 u · v < 0이다.

 


 

그리고 또한 내적을 이용하여 구할 수 있는 아주 중요한 기하학적 개념이 더있다.

바로 직교 투영이다. 

 

 

위의 그림에서 벡터 v와 단위 벡터 n이 주어졌을 때 p를 내적을 이용해서 v와 n으로 표현해보자.

 

우선 그림을 보면 p = kn을 만족하는 스칼라 k가 존재함을 알 수 있다.

더 나아가, ||n||은 1이므로, 반드시 ||p|| = ||kn|| = |k| ||n|| = |k| 이다.

삼각함수 법칙을 적용하면

cosθ = k / ||v||

k = ||v|| cosθ 가 나온다.

 

따라서  p = kn = (||v|| cosθ) n이다. 그런데 n은 단위 벡터 이므로,

p = (||v|| cosθ) n = (||v|| * 1 * cosθ) n = (||v|| ||n|| cosθ) n = (v · n) n

 

이 공식에 따르면 k = v · n 이다. 이는 n이 단위벡터일 때 v· n의 기하학적 의미를 말해준다.

이러한 p를 n에 대한 v의 직교투영(orthographic projection; 또는 정사영)이라고 부르며, 흔히 다음과 같이 표기 한다.


P = projn(v)


v벡터를 하나의 힘으로 간주 한다면 p는 힘v 중에서 n방향으로 작용하는 부분이라고 이해하면 쉽다.

이와 비슷하게, 벡터w = prepn(v) = v - p는 힘v 중에서 n의 수직 방향으로 작용하는 부분이다.(prep는 perpendicular[수직]를 뜻한다.)

여기서 v = p + w임을 주목해야 한다. 즉, v는 두 직교 벡터 p와 w의 합으로 분해된다.

n이 단위 벡터가 아니면 먼저 n을 정규화 한다음 투영공식을 대입하면된다. 이로써 좀더 일반적인 투영공식이 나온다.


p = projn(v) = (v · n/||n||) * n/||n|| = (v · n)/||n||2 * n


 

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

원점을 기준으로 회전하는 카메라  (0) 2021.10.17
행렬식(Determinant)  (0) 2021.08.05
비례(Scaling) 행렬  (0) 2021.08.02
외적 (Outer Product / Cross Product)  (0) 2021.08.01
직교화(Orthogonalization)  (0) 2021.07.28
Comments