-
벡터 내적1 : 시야판별게임수학 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 함수를 호출하는것보다 더 효율적이다.