게임수학

벡터 내적1 : 시야판별

Drill_Labito 2023. 4. 5. 00:35

내적에 대해 공부한 핵심을 나름대로 정리하고자 글을 써본다.

 

벡터의 내적은 2가지 식이 있다. 

 


(공식1)

A(x1, y1, z1), B(x2, y2, z2)

 

A, B 벡터 각 요소를 곱한값을 합함

=> x1 * x2 + y1 * y2 + z1 * z2

 

(공식2)

A B cos(세타)


(벡터 특징)

* 벡터 내적 결과 > 0 : 두 벡터는 같은 방향을 향하고 있다. 

* 벡터 내적 결과 < 0 : 두 벡터는 다른 방향을 향하고 있다. (벡터는 위치 개념이 없기에, 서로 마주보고 있다고 해석할 수도 있다.)

* 벡터 내적 결과 = 0 : 두 벡터는 서로 직교한다. 

 

이를 이용해서 다음과 같은 응용작업을 할 수 있다. 

 

1. 앞뒤 판별

위 그림같이 캐릭터와 목표물이 배치되어있다고 가정해보자. 

캐릭터의 시야벡터 f

목표물까지의 벡터 v

사잇각 세타

 

이때 두 벡터 f, v 를 내적한 결과에 따라 시야판별이 가능하다. 

 

* 벡터 f, v 내적 > 0 : 캐릭터 앞에 목표물 존재

* 벡터 f, v 내적 < 0 : 캐릭터 뒤에 목표물 존재

* 벡터 f, v 내적 = 0 : 캐릭터 바로 옆에 목표물 존재


2. 시야 판별 

 

내적을 이용하면 범위 내 목표물이 탐지되는지 파악이 가능하다. 

 

1. 시야각을 절반 나눈 각의 cos(B/2) 의 값을 미리 계산해둔다.

2. 캐릭터의 시선벡터를 구하고 이 크기를 1로 정규화시킨다. 이를 단위벡터 f 라고 하자.

3. 캐릭터에서 목표물로 향하는 벡터도 정규화시킨다. 이를 단위벡터 v라고 하자.

4. 벡터 v, f 의 내적 결과는 cos(a) 가 된다. 이를 앞서 계산한 cos(B/2) 와 비교하자. 

 

* 벡터 v, f 내적 >= cos(B/2) : 목표물이 시야 범위 안에 있음

* 벡터 v, f 내적 < cos(B/2) : 목표물이 시야 범위 밖에 있음

 

atan2 함수를 이용해 두 벡터가 이루는 각 a를 구한 후 이를 B/2 와 비교해도 동일한 결과를 얻을 수 있다. 

하지만, 단위 벡터를 구한 후 내적을 계산하는 방식이 atan2 함수를 호출하는것보다 더 효율적이다.