본문 바로가기

게임개발/게임수학

[게임수학] 정사영 (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θ ) × NProj(V)

 

 

 

 

 

벡터의 내적으로도 투영벡터를 구할 수 있다.

 

먼저 내적 공식을 생각하면

 VㆍN = |V| × |N| × cosθ

 

N은 크기가 1인 단위벡터이므로

 VN = |V| × cosθ

 

결국 두 벡터의 내적은 투영벡터의 크기이다.

이 크기에 단위벡터를 곱하면 투영벡터가 된다.

 (VN) × 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