벡터를 하나의 직각삼각형으로 보았을 때 x는 밑변이고 y는 높이일테니 c는 빗변
즉, 길이를 의미한다.
∣A∣=Ax2+Ay2
θ 는 두 벡터 사이의 각도를 말한다.
θ=0∘ 라면 두 벡터는 완전히 방향이 같다. θ=90∘ 라면 두 벡터는 수직을 이루어 직교한다. θ=180∘ 라면 두 벡터는 반대 방향을 향하고있다.
이를 -1에서 1까지 값이 나오는 cosθ 에 관련하게 나타내면 다음과 같은 값들이 나온다.
각도
cosθ 값
의미
0∘
1
완전히 같은 방향
0∘ < θ < 90∘
0 < cosθ < 1
유사한 방향
90∘
0
직교
90∘ < θ < 180∘
-1 < cosθ < 0
반대 방향에 가까움
180∘
-1
완전히 반대 방향
이 내용을 지금까지 왜 알아 봤냐면
내적을 기하학적인 의미로 구하면 다음과 같다.
A⋅B=AxBx+AyBy
이로인해 간단한 계산으로 우린 cosθ 의 값을 구할 수 있다.
각 벡터의 길이를 1로 만드는 normalize를 거치고 내적을 계산하면 A⋅B=1×1×cosθ=cosθ
가 되버리기 때문이다
내적이 게임에서 시야 판별, 방향 판정, 충돌 감지, 타격 판정, 카메라 시스템 등 다양한 곳에서 사용된다.
아래에서 플레이어와 대상 물체 간의 전후방 판별, 시야각 내 판별에 대해 알아보자
플레이어와 대상 물체 간의 전후방 판별
내적을 활용하면 대상이 플레이어의 앞쪽인지, 뒤쪽인지 쉽게 판별할 수 있다.
일단 2D가 쉬우므로 아래와 같이 벡터를 가정해보자
플레이어 위치 : P
플레이어의 정면(시선) 방향(Forward Vector) : F=(Fx,Fy)
대상의 위치 : T(xt,yt)
1. 대상이 전방에 있을 때 ( θ=0∘ )
아래와 같이 값을 가정한다.
플레이어 위치 : P=(0,0)
플레이어 정면 방향 벡터 : F=(1,0) (오른쪽을 바라봄)
대상 위치 : T=(3,0) (플레이어 앞쪽)
플레이어 -> 대상 위치로 향하는 벡터 : D=T−P=(3−0,0−0)=(3,0)
내적 계산 F⋅D=(1,0)⋅(3,0)=(1×3)+(0×0)=3
내적 값이 양수로 나온다.
앞서 정의에서 확인하였듯이 내적 값이 양수면 대상은 전방에 위치한다.
2. 대상이 후방에 있을 때 ( θ=180∘ )
아래와 같이 값을 가정한다.
플레이어 위치: P=(0,0)
플레이어 정면 방향 벡터: F=(1,0) (오른쪽을 바라봄)
대상 위치: T=(−3,0) (플레이어 뒤쪽)
플레이어 -> 대상 위치로 향하는 벡터 : D=T−P=(−3−0,0−0)=(−3,0)
내적 계산 F⋅D=(1,0)⋅(−3,0)=(1×−3)+(0×0)=−3
내적 값이 음수로 나온다.
앞서 정의에서 확인하였듯이 내적 값이 음수면 대상은 후방에 위치한다.
3. 대상이 정확한 좌측에 있을 때 ( θ=90∘ )
아래와 같이 값을 가정한다.
플레이어 위치: P=(0,0)
플레이어 정면 방향 벡터: F=(1,0) (오른쪽을 바라봄)
대상 위치: T=(0,3) (플레이어 왼쪽)
플레이어 -> 대상 위치로 향하는 벡터 : D=T−P=(0−0,3−0)=(0,3)
내적 계산 F⋅D=(1,0)⋅(0,3)=(1×0)+(0×3)=0
내적 값이 0으로 나온다.
앞서 정의에서 확인하였듯이 내적 값이 0이면 대상은 측면에 위치한다.
이때 왼쪽인지 오른쪽인지에 대한 판별은 외적(Cross Produc)이라는 개념으로 가능하다.
시야각(FOV) 내에 물체가 있는지 판별
게임에서 플레이어의 시야각(Field of View, FOV) 내에 오브젝트가 포함되는지 확인하는 것은 AI의 적 탐지, 슈팅 게임에서의 타겟팅, 경비 시스템 등 중요한 요소이다.
이때, 내적을 활용하면 대상이 플레이어의 시야각 내에 있는지 판별할 수 있다.
위와 똑같이 벡터를 정의해보자
플레이어 위치 : P(xp,yp)
플레이어의 정면(시선) 방향(Forward Vector) : F=(Fx,Fy)
대상의 위치 : T(xt,yt)
플레이어 -> 대상 위치로 향하는 벡터 : D=T−P=(xt−xp,yt−yp)
시야각 내 판별 공식
두 벡터의 내적과 코사인 값을 이용하여 시야각을 판별할 수 있다
cosθ=∣F∣∣D∣F⋅D=∣F∣∣D∣FxDx+FyDy
위 식에서 θ 는 플레이어의 정면 벡터 F 와 타겟 방향 벡터 D 가 이루는 각도이다.
왜냐하면 A⋅B=∣A∣×∣B∣×cosθ
이기 때문에 ∣A∣와 ∣B∣ 가 1이라면 내적의 결과는 cosθ가 되기 때문이다.
플레이어가 볼 수 있는 전체 시야의 각도를 FOV 라고 할 때, 대상이 시야 내에 있으려면 다음 조건을 만족해야 한다. cosθ≥cos(2FOV)
이 때, 2로 나누는 이유는 시야각이 90도라고 할 때, 일반적으로 시야각을 두 개의 대칭된 영역으로 즉, 45도 45도로 양쪽으로 나누기 때문이다.
이렇게 계산한 내적 값이 시야각의 코사인 값 이상이면, 대상은 시야 내에 포함된 것 이다.
아래에서 알 수 있듯이 cosθ는 각도가 작을수록 값이 커지고, 각도가 클수록 값이 작아지는 성질이 있기 떄문이다.
θ
cosθ
0∘
1
30∘
0.866
45∘
0.707
60∘
0.5
90∘
0
외적
2차원에서의 외적의 정의는 다음과 같다.
A×B=AxBy−AyBx
이 값은 두 벡터가 반시계 방향인지(양수), 시계 방향인지(음수), 아니면 동일한 선상에 있는지를 판별하는 데 사용할 수 있다.