ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 벡터 내적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 함수를 호출하는것보다 더 효율적이다. 

     

    댓글

Designed by Tistory.