본문 바로가기
프로그래밍/알고리즘

3차원에서 백터(v3)의 내적 (Dot) 과 외적 (Cross) 를 이용한 상대의 앞뒤 좌우 판별법

by 눈야옹 2016. 4. 2.

조건

월드 좌표 

x = 좌(-), 우(+)

y = 앞(+), 뒤(-)

z = 위(+), 아래(-)


나 P : v(1,3, 2) , 방향(dir)  v(0, 1, 0) 을 바라보느 상황

적 A : v(3, 6, 3)

적 B : v(2, -1, 2)

적 C : v(-1, -1, 2)

적 D : v(-2, 4, 1)


먼저 나를  0,0,0 으로  해서 기준으로해서 계산을 쉽게 하기 위해 좌표를 수정한다.

단,(현재 좌우와 앞뒤를 구분하기 위해 (위아래는 하지 않는다.) 모든 z축을 0으로 둔다. )

나 P = P - P = v( 0, 0, 0 ) , dir( 0, 1, 0) 방향은 그대로 둔다.

적 A = A - P = v( 2, 3, 0)

적 B = B - P = v( 1, -4, 0)

적 C = C - P = v( -2, -4, 0)

적 D = D - P = v( -3, 1, 0)


내적 (Dot) U*V = ( Ux * Vx ) + ( Uy * Vy ) + ( Uz * Vz )

U는 나의  Foward Vector이고, V는 Target을 향한(Target - self) vector이다.

결과값이 0 이면 수직이다.

결과값이 양수면 앞, 음수이면 뒤

외적 (Cross) T  = U x V = [ ( Uy * Vz - Uz * Vu ), ( Uz * Vx - Ux * Vz ), ( Ux * Vy - Uy * Vx ) ]

결과값이 0 이면 같은 위치,

결과값이 위를 향하면 왼쪽 아래면 오른쪽 

*(현재 높낮이를 구하지 않기 위해 z값을 모두 0으로 하여 위, 아래 방향 수직인 백터만 나온다.)

*언리얼
언리얼 좌표계 에서는
위쪽(z값이 양수) -> 오른쪽
아래 쪽 (z값이 음수) -> 왼쪽 이다.

U에는  Dir 즉 나의 방향이고, V는 적의 위치를 하면된다.

Step 1. 앞 뒤
적 A의 Dot는 3 (양수) 이므로 나보다 앞에 있다.
그리고 A의 Cross는 -2 (음수) 이므로 나의 오른 쪽에 위치한다.

위와 같은 방법으로 

   D        A
     
       나

   C        B

와 같은 위치가 도출된다. 

그 뒤 Cross에서 나온 Cos값으로 각도를 구해서 회전하거나
또는 나의 디렉션 노말라이징과 나로 부터 적을 향하는 백터 노멀라이징한 값이 
일치하게 Axis를 이용한 쿼터니언 로테이션을 시키면 된다.






'프로그래밍 > 알고리즘' 카테고리의 다른 글

버블정렬 알고리즘  (0) 2016.04.12
A* 알고리즘  (0) 2016.02.12