[게임수학] 정사영 (Orthogonal Projection)
정사영이란 '수직으로 투영된 그림자' 를 말한다.
어떤 선이나 물체 위에서 빛이 비춰졌을때
아래 평면에 그림자가 생긴다는 개념이다.
정사영(Orthogonal Projeciton)의 개념은
선형대수에서 벡터와 함께 아주 유용하게 사용된다.
벡터 V를 평면 O에 투영하면 벡터 P가 나오는데
P를 O 평면에 대한 V의 투영(Projection) 벡터라 한다.
또 벡터 V를 벡터 N에 투영하면 벡터 P' 가 나오는데
P'를 N 벡터에 대한 V의 투영(Projection) 벡터라 한다.
투영(Projection)벡터를 구하는 방법은 다음과 같다.
먼저 삼각함수로 투영벡터의 크기를 구하고,
| Proj(V) | = ( |V| × cosθ )
구해진 크기에 단위벡터 N을 곱하면 투영벡터가 된다.
( |V| × cosθ ) × N = Proj(V)
벡터의 내적으로도 투영벡터를 구할 수 있다.
먼저 내적 공식을 생각하면
VㆍN = |V| × |N| × cosθ
N은 크기가 1인 단위벡터이므로
VㆍN = |V| × cosθ
결국 두 벡터의 내적은 투영벡터의 크기이다.
이 크기에 단위벡터를 곱하면 투영벡터가 된다.
(VㆍN) × N = Proj(V)
이렇게 내적을 활용하면 점과 직선사이의 최단거리나
점과 평면사이의 최단거리도 쉽게 구할 수 있다.
직선(혹은 평면)위의 한점 Po에서 P까지의 벡터와
직선(혹은 평면)의 노말벡터를 내적하면
투영벡터의 크기가 나오는데,
이는 점과 직선(혹은 평면)사이의 최단거리이다.
d = (P - Po)ㆍN
정사영은 벡터의 성분 분해를 위해 사용된다.
벡터 V를 X축에 투영한 벡터는 Px이고,
Px = (|V|×cosθ) × Xn
= (VㆍXn) × Xn
벡터 V를 Y축에 투영한 벡터는 Py이다.
Py = (|V|×sinθ) × Yn
= (VㆍYn) × Yn
Px는 벡터 V의 X 성분이 되고, Py는 벡터 V의 Y성분이 된다.
V의 속도로 진행중인 오브젝트가 있다고 하자.
이 오브젝트가 벽에 부딪쳤을때
벽면을 따라 미끄러지도록 구현해야 한다면
먼저 벡터 V를 벽면에 수직이 되는 성분과
수평이 되는 성분으로 분해해야 한다.
그 다음 속도 V에서 수직 성분을 제하면
수평 성분만 남게 되어 벽면을 따라 이동하게 된다.
벡터 V를 벽면의 노말벡터인 N과 내적하여 투영벡터 P를 얻는다. 이 벡터 P가 벽면에 수직이 되는 성분이다.
P = (VㆍN) × N
이제 벡터 V에서 벡터 P를 제하면 벽면에 수평이 되는 벡터 (V-P)만 남게 된다.
이 벡터 (V-P)가 벽면을 따라 이동하는 미끄러짐(Sliding) 벡터 S이다.
S = V - P
= V - (VㆍN) × N
오브젝트가 벽에 충돌시 튕겨나가도록 구현해야 한다면
먼저 벡터 V에서 수직 성분 P를 빼고 남은 수평성분 S에다
한번 더 수직 성분 P를 빼면
벽에 대한 반사벡터(Reflection Vector)를 얻는다.
즉, 반사벡터 R은 벡터 V에서 벡터 P를 두번 뺀것이다.
R = V - 2P = V - 2(VㆍN) × N