비타Cpp

직교화(Orthogonalization) 본문

DirectX12/게임 수학

직교화(Orthogonalization)

멍C 2021. 7. 28. 15:31

벡터 집합 {v0,v1, ... vn-1}의 n개의 모든 벡터가 단위 길이이고 서로 직교일때 그러한 벡터 집합을 정규직교(Orthonormal) 집합이라고 한다. 주어진 벡터 집합을 정규직교 벡터 집합으로 만드는 것을 직교화(Orthogonalization)라고 한다. 

 

직교화의 예시 2차원(왼쪽), 3차원(오른쪽)

 

간단한 이해를 위해 2차원의 경우 부터 살펴보자. 위의 왼쪽 그림은 벡터 집합 {v0, v1}을 직교화 해서 정규 직교 집합 {w0, w1}을 얻는 과정이다. w0 = v0으로 시작해서, 벡터 v1이 w0과 직교가 되도록 w0의 방향으로 작용하는 부분을 v1에서 뺀다. 

w1 = v1 - projw0(v1)

이제 서로 직교인 벡터들의 집합 {w0, w1}이 만들어졌다. 마지막으로 w0과 w1을 정규화해서 단위 벡터로 만들면 정규직교 집합이 완성된다.

 

3차원의 경우도 마찬가지이다. 단지 단계가 한단계더 있을뿐이다.

오른쪽 그림은 벡터 집합 {v0, v1, v2}를 직교화해서 정규직교 집합 {w0, w1, w2}를 얻는 과정이다.

우선 w0 = v0로 시작해서, 벡터 v1이 w0과 직교가 되게한다.

w1 = v1 - projw0(v1)

다음으로, v2가 w0과 w1 모두에 직교가 되게 한다. 이를 위해, 다음과 같이 w0 방향으로 작용하는 부분과 w1방향으로 작용하는 부분을 v2에서 뺀다.  

w2 = v2 - projw0(v2) - projw1(v2)

이제 서로 직교인 벡터들의 집합 {w0, w1, w2}가 만들어졌다. 마지막으로 졍규화를 해주면 완성된다.

 

이를 일반화 해서, n개의 벡터들의 집합 {v0,v1, ... vn-1}을 정규직교 집합 {w0, w1, ... wn-1}으로 직교화할 때에는 그람-슈미트 직교화(Gram-Schmidt Orthogonalization)라고 하는 공정을 적용한다. 그람-슈미트 직교화 공정은 다음과 같다.


기본 단계: w0 = v0으로 설정한다.

1≤ i ≤ n-1 에 대해 $$w_{i} = v_{i} - \sum_{j=0}^{i-1}proj_{w_{j}}(v_{i})$$ 

정규화 단계: $$\frac{w_{i}}{||w_{i}||}$$  


 

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

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