본문으로 건너뛰기
게임 수학 · 게임 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강. 외적과 회전 방향 미완료 상태