본문 바로가기
프로그래밍 이야기/C++ 기초

[게임이론] 벡터-내적의 활용

by Mulder5 2020. 12. 26.
반응형

https://definelife.tistory.com/56

 

[게임이론] 백터의 내적

벡터의 내적에 대해 알아본다. 티스토리는 수식입력이 참 어렵다. 스크린샷으로 대신한다.

definelife.tistory.com

벡터의 내적에 대해 알아봤으니 이제 실제 게임에서 어떻게 사용되는지 알아본다. 마찬가지로 엔진 구성이나 사용 방식보다는 학습한 공식을 적용해보는데 중점을 둔다. 위 포스팅에서의 핵심 공식은 다음과 같다.

 

 

위와 같이 스크린상에 다수의 오브젝트 ghost가 존재하고 flashlight가 이동하면 이 flashlight안에 들어온 ghost의 개수를 확인하는 시나리오이다. 이에 대한 중심 코드는 아래와 같다.

void CheckGhost()
 {
     int i = 0;  // 초기값은 0


     // foreach를 이용해서 각 오브젝트 모두를 확인
     foreach (var ghost in ghostObjectArray)
     {
         // 오브젝트와 Flashlight와의 벡터( 도착지(ghost) - FlashLight )
         Vector3 distanceVec = ghost.transform.position - transform.position;

         // magnitude : 거리
         if (distanceVec.magnitude < rangeDistance)
         {
             // 내적을 하기 위해서 방향벡터로 만들어줌.
             Vector3 dirVec = distanceVec.normalized;

             // transform.right/up, Vector2.right/left/up/down 모두 크기가 1인 방향벡터
             // 내적 : x1y1+x2y2 이지만 유니티 내적 함수 Vector3.Dot()사용한다.ㅏ
             
             if(Vector3.Dot(transform.up, dirVec) > Mathf.Cos(rangeAngle*Mathf.Deg2Rad))
                 i++;

         }
     }
     
     Debug.Log("감지된 유령의 수: "+i);
 }

 

1. flashlight와 ghost object의 벡터 구하기
   flashlight와 ghost object의 벡터는 [ 도착지(ghost) - 출발지(FlashLight) ] 로 구할 수 있다.

 Vector3 distanceVec = ghost.transform.position - transform.position;

 

2. 거리 체크
   위에서 구한 vector의 속성에서 magnitude를 사용하면 해당 vectord의 거리가 나온다. 이를 범위 값과 비교한다.

distanceVec.magnitude < rangeDistance

 

3. 각도 체크
  위에서 구한 벡터에서 방향벡터를 구하고, 공식을 적용한다. 두 벡터의 dotproduct 가 cos@보다 크면 각도 안에 들어온 것이다. 

// 내적을 하기 위해서 방향벡터로 만들어줌.
Vector3 dirVec = distanceVec.normalized;

// transform.right/up, Vector2.right/left/up/down 모두 크기가 1인 방향벡터
// 내적 : x1y1+x2y2 이지만 유니티 내적 함수 Vector3.Dot()사용한다.ㅏ

if(Vector3.Dot(transform.up, dirVec) > Mathf.Cos(rangeAngle*Mathf.Deg2Rad))
    i++;

 

반응형