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

외적과 회전 방향

난이도초급
예상 시간35분
선수지식6강의 내적

7강. 외적과 회전 방향

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

적이 플레이어를 향해 회전해야 하지만 어느 방향으로 도는 것이 짧은지 판단하기 어렵습니다. 탑다운 평면에서 외적의 부호로 좌우 방향을 구합니다.

2. 학습 목표​

3. 핵심 개념​

A × B는 A와 B 모두에 수직인 벡터입니다. 탑다운 게임은 X-Y 평면을 사용하므로 외적 결과의 Z 성분 부호가 회전 방향을 나타냅니다.

  • Cross.Z > 0: 목표가 전방 기준 오른쪽 또는 왼쪽인지 축·손잡이 규칙에 따라 확인
  • Cross.Z < 0: 반대쪽
  • Cross.Z ≈ 0: 같은 방향 또는 정확히 반대

Unreal의 축과 외적 순서를 기준으로 실제 Debug Draw 결과를 확인해야 합니다. A × B와 B × A는 부호가 반대입니다.

4. 단계별 실습​

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

GameMathLibrary.h · 추가
UFUNCTION(BlueprintPure, Category = "Game Math")
static float SignedTurn2D(FVector CurrentForward, FVector DesiredDirection);

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

GameMathLibrary.cpp · 외적 부호
float UGameMathLibrary::SignedTurn2D(
FVector CurrentForward, FVector DesiredDirection)
{
CurrentForward.Z = 0.0f;
DesiredDirection.Z = 0.0f;

const FVector A = CurrentForward.GetSafeNormal();
const FVector B = DesiredDirection.GetSafeNormal();
return FVector::CrossProduct(A, B).Z;
}

사용 예시

MathAIController.cpp · 회전 힌트
const FVector ToPlayer = UGameMathLibrary::Direction2D(
Enemy->GetActorLocation(), Player->GetActorLocation());
const float TurnSign = UGameMathLibrary::SignedTurn2D(
Enemy->GetActorForwardVector(), ToPlayer);

UE_LOG(LogTemp, Display, TEXT("TurnSign=%.3f"), TurnSign);

Unreal Editor 작업

적 앞, 오른쪽, 왼쪽에 플레이어를 놓고 로그 부호를 기록합니다. 프로젝트에서 어느 부호를 Right라고 부를지 테스트 결과로 주석에 남깁니다.

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

외적의 크기는 sin θ와 관련되고 Z 부호는 X-Y 평면 회전 방향을 구분합니다. 내적은 목표가 얼마나 정면인지, 외적은 어느 쪽으로 돌아야 하는지 알려 줍니다. 정확한 회전량 자체는 다음 강의의 Rotator와 보간이 처리합니다.

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

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

외적과 회전 방향 미니 퀴즈

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

0 / 2
  1. 문제 1“외적과 회전 방향”에서 혼동하기 쉬운 개념을 올바르게 연결한 것은 무엇인가요?
  2. 문제 2‘Z 높이 차이를 포함한 채 2D 판정’ 상태에 관한 “외적과 회전 방향” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

7강. 외적과 회전 방향 미완료 상태