본문으로 건너뛰기
게임 수학 · 게임 AI 기초집LESSON 06

내적과 시야각

난이도초급
예상 시간40분
선수지식5강의 범위 판정

6강. 내적과 시야각

1. 이번 강의에서 해결할 문제

플레이어가 적 뒤에 있어도 추적 거리 안이라는 이유만으로 발견됩니다. 적의 전방과 목표 방향이 이루는 각도를 직접 구하지 않고 시야 조건을 만듭니다.

2. 학습 목표

3. 핵심 개념

정규화된 두 벡터 A와 B의 내적은 cos θ입니다.

A · B = cos θ

A는 적 Forward Vector, B는 적에서 플레이어로 향하는 단위 방향, θ는 두 방향 사이 각도입니다. 결과 1은 같은 방향, 0은 직각, -1은 반대 방향입니다.

전체 시야각이 90도라면 좌우 절반은 45도이고, Dot >= cos(45°)일 때 시야 원뿔 안입니다.

4. 단계별 실습

C++ · 파일 경로: Source/TopDownSurvival/AI/GameMathLibrary.h · 추가

GameMathLibrary.h · 추가
UFUNCTION(BlueprintPure, Category = "Game Math")
static bool IsInsideViewCone2D(
FVector ObserverForward,
FVector ObserverLocation,
FVector TargetLocation,
float FullViewAngleDegrees);

C++ · 파일 경로: Source/TopDownSurvival/AI/GameMathLibrary.cpp

GameMathLibrary.cpp · 시야각
bool UGameMathLibrary::IsInsideViewCone2D(
FVector ObserverForward,
FVector ObserverLocation,
FVector TargetLocation,
float FullViewAngleDegrees)
{
ObserverForward.Z = 0.0f;
const FVector Forward = ObserverForward.GetSafeNormal();
const FVector ToTarget = Direction2D(ObserverLocation, TargetLocation);

if (Forward.IsNearlyZero() || ToTarget.IsNearlyZero())
{
return false;
}

const float HalfAngle = FMath::Clamp(FullViewAngleDegrees, 0.0f, 360.0f) * 0.5f;
const float Threshold = FMath::Cos(FMath::DegreesToRadians(HalfAngle));
return FVector::DotProduct(Forward, ToTarget) >= Threshold;
}

Blueprint 작업

BP_EnemyBase에서 ViewAngle을 90도로 두고 적 앞·옆·뒤에 플레이어 대용 Cube를 배치합니다. 결과에 따라 Debug Line 색을 Green 또는 Gray로 표시합니다.

5. 코드와 수학·AI가 동작하는 이유

두 벡터를 먼저 정규화해야 길이가 내적 결과에 섞이지 않습니다. cos 함수는 라디안을 받으므로 DegreesToRadians가 필요합니다. 전체 시야각을 절반으로 나누는 이유는 Forward를 중심으로 좌우에 같은 각도가 펼쳐지기 때문입니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

내적과 시야각 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“내적과 시야각” 내용을 실제 작업에 적용한 설명으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2“내적과 시야각”의 작업 기준으로 ‘시야각만 통과하면 보인다고 판단’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

6강. 내적과 시야각 미완료 상태