상세 컨텐츠

본문 제목

벡터 내적 활용 : 몬스터가 캐릭터 시야에 있는지 확인하기(Field of View)

개발기록/Unity 유니티

by 도리(Dory) 2026. 1. 3. 14:33

본문

게임에서 캐릭터(또는 카메라)가 어떤 방향을 보고 있을 때, 특정 대상이 내가 보는 방향의 앞쪽 시야(FOV, Field of View) 안에 들어오는지 판단해야 하는 경우가 많습니다.

 

시야 안에 들어오는지 여부 판단

 

예를 들면:

 

  • 적이 내 시야 안에 들어오면 경고 UI 띄우기
  • NPC가 플레이어를 “봤는지” 판정하기
  • 자동 조준에서 “가장 내 정면에 가까운 대상” 찾기

 

이때 가장 간단하고 빠르게 쓰는 방법이 벡터 내적(Dot product) 입니다.

 

 


 

핵심 아이디어: “각도” 대신 “코사인”을 비교한다

 

 

1) 두 방향 벡터를 준비한다

  • f: 내가 바라보는 방향(Forward)
  • d: 나에서 대상까지의 방향(Direction to target)

 

예시로는 보통 이렇게 만듭니다:

  • f = (내 forward 방향)
  • d = (대상 위치 - 내 위치)

 

2) 둘 다 정규화(normalize) 한다

 

정규화란 벡터의 길이를 1로 만드는 것입니다.

  • 정규화된 벡터는 “방향”만 남습니다.
  • 이 작업을 해야 내적 값이 각도의 코사인(cos) 이라는 깔끔한 형태가 됩니다.

 

정규화한 뒤에는 다음이 성립합니다.

 

Dot(f, d) = cos(θ)
(θ는 f와 d 사이의 각도)

 

 


Dot 값은 무엇을 의미할까?

 

정규화된 상태에서 내적은 “얼마나 같은 방향인가”를 나타냅니다.

 

  • Dot = 1 → 각도 0° (완전히 정면)
  • Dot = 0 → 각도 90° (옆)
  • Dot = -1 → 각도 180° (정반대)

 

즉, Dot 값이 클수록 정면에 가깝다는 뜻입니다.

 


FOV(시야각) 판정은 왜  cos(FOV/2) 인가?

 

시야각 FOV는 보통 “좌우로 벌어진 전체 각도”입니다.

 

예를 들어 FOV가 60°라면, 정면을 기준으로:

 

  • 왼쪽 30°
  • 오른쪽 30°

 

즉, 경계선은 정면 기준 ±(FOV/2) 입니다.

 

따라서 대상이 시야 안에 있으려면:

 

  • 대상과 정면 사이의 각도 θ가 FOV/2 보다 작거나 같아야 합니다.

 

수학으로 쓰면:

 

  • θ ≤ FOV/2

 

그런데 게임에서는 보통 각도 계산(acos) 을 피합니다.

(acos는 상대적으로 비용이 크고, 불필요한 경우가 많습니다)

 

대신 코사인을 이용해 이렇게 바꿉니다:

 

  • cos(θ) ≥ cos(FOV/2)

 

정규화된 벡터에서 cos(θ)가 바로 Dot(f, d) 이므로 최종적으로:

 

Dot(f, d) ≥ cos(FOV/2)

 

이 조건이면 대상은 시야각 안에 있습니다.

 


직관적으로 이해하기

 

  • Dot(f, d)는 “대상이 내 정면에 얼마나 붙어있나” 점수입니다.
  • FOV가 좁을수록 경계( cos(FOV/2) )가 1에 가까워져서 조건이 빡빡해집니다.
  • FOV가 넓을수록 경계가 작아져서(예: 0.5, 0.0에 가까워짐) 더 넓게 허용됩니다.

 

예시:

 

  • FOV = 60° → FOV/2 = 30° → cos(30°) ≈ 0.866
    • Dot이 0.866 이상이면 “시야 안”
  •  
  • FOV = 120° → FOV/2 = 60° → cos(60°) = 0.5
    • Dot이 0.5 이상이면 “시야 안”

관련글 더보기