게임 수학 · 게임 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내적과 시야각 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
6강. 내적과 시야각 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.