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

좌표계와 위치

난이도입문
예상 시간35분
선수지식1강의 AI 구조

2강. 좌표계와 위치

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

적이 회전하면 “앞쪽 100” 위치가 달라지는데 월드 X축에 숫자를 더해 공격 지점을 계산하고 있습니다. 월드 기준 위치와 Actor 기준 로컬 위치를 구분합니다.

2. 학습 목표​

3. 핵심 개념​

좌표는 기준이 있어야 의미가 있습니다. 월드 좌표는 레벨 전체의 공통 기준이고 로컬 좌표는 Actor 또는 Component의 위치·회전·크기를 기준으로 합니다.

Unreal의 기본 축은 X가 Forward, Y가 Right, Z가 Up입니다. 다른 엔진은 축 정의와 회전 표현이 다를 수 있지만 “기준 좌표계 사이를 변환한다”는 원리는 같습니다.

먼저 알아야 할 용어​

용어의미Unreal 예시
원점좌표를 재는 출발점 (0, 0, 0)월드 원점 또는 Actor 자신의 중심
축어느 방향을 양수로 셀지 정한 기준X 전방, Y 오른쪽, Z 위쪽
위치한 좌표계의 원점에서 떨어진 지점플레이어의 World Location
로컬 좌표부모나 Actor 자신의 원점·축으로 표현한 좌표적 기준 (100, 0, 0)은 적 앞 100
월드 좌표레벨 전체가 공유하는 원점·축으로 표현한 좌표레벨에서 실제 공격 지점
TransformTranslation·Rotation·Scale을 묶어 좌표계를 바꾸는 정보GetActorTransform()

로컬 좌표는 “작은 숫자”, 월드 좌표는 “큰 숫자”라는 뜻이 아닙니다. 같은 점을 어느 기준으로 설명하느냐가 다릅니다. 적이 월드 원점에 있고 Yaw가 0도면 로컬 (100, 0, 0)은 월드 (100, 0, 0)입니다. 적을 Yaw 90도로 돌리면 같은 로컬 점은 대략 월드 (0, 100, 0)이 됩니다. 전방은 적과 함께 회전했기 때문입니다.

위치와 방향 변환도 구분해야 합니다. 위치는 원점에서 떨어진 점이므로 Translation의 영향을 받지만, “전방” 같은 방향은 위치 이동과 무관합니다. 위치에는 TransformPosition, 방향에는 목적에 맞는 TransformVector 또는 회전 적용을 사용합니다.

4. 단계별 실습​

C++ · 파일 경로: Source/TopDownSurvival/AI/CoordinateProbe.h

CoordinateProbe.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CoordinateProbe.generated.h"

UCLASS()
class TOPDOWNSURVIVAL_API ACoordinateProbe : public AActor
{
GENERATED_BODY()

public:
UFUNCTION(BlueprintCallable, Category = "Math")
FVector LocalPointToWorld(FVector LocalPoint) const;

UFUNCTION(BlueprintCallable, Category = "Math")
FVector WorldPointToLocal(FVector WorldPoint) const;
};

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

CoordinateProbe.cpp
#include "AI/CoordinateProbe.h"

FVector ACoordinateProbe::LocalPointToWorld(FVector LocalPoint) const
{
return GetActorTransform().TransformPosition(LocalPoint);
}

FVector ACoordinateProbe::WorldPointToLocal(FVector WorldPoint) const
{
return GetActorTransform().InverseTransformPosition(WorldPoint);
}

코드 한 줄씩 이해하기​

  1. 두 함수는 Actor 상태를 바꾸지 않으므로 끝에 const를 붙입니다.
  2. GetActorTransform()은 이 Actor의 현재 월드 위치·회전·크기를 묶은 FTransform을 반환합니다.
  3. TransformPosition(LocalPoint)은 LocalPoint에 Scale과 Rotation을 적용하고 마지막에 Actor Translation을 더합니다.
  4. InverseTransformPosition(WorldPoint)은 월드 점에서 Translation을 제거하고 회전·크기의 역변환을 적용해 Actor 기준 좌표를 구합니다.
  5. 정방향으로 바꾼 점을 같은 Transform의 역방향으로 되돌리면 부동소수점 오차 범위 안에서 원래 로컬 점이 나와야 합니다.

Blueprint와 Unreal Editor에서 가장 작은 확인​

  1. C++ 컴파일 후 ACoordinateProbe의 Blueprint 자식 BP_CoordinateProbe를 만듭니다.
  2. 레벨 원점 (0, 0, 0)에 배치하고 Yaw를 0으로 둡니다.
  3. Blueprint에서 BeginPlay에 Local Point To World를 호출하고 Local Point로 (100, 0, 0)을 전달합니다.
  4. 반환값을 Print String으로 출력하거나 Draw Debug Sphere의 Center에 연결합니다. 예상 월드 위치는 (100, 0, 0)입니다.
  5. Actor Yaw를 90으로 바꾸고 다시 Play합니다. 예상 월드 위치는 부동소수점 오차를 제외하면 (0, 100, 0)에 가깝습니다.

Details에서 Actor의 World Transform과 자식 Component의 Relative Transform을 번갈아 확인하세요. 부모를 회전하면 자식의 Relative 값은 그대로여도 최종 World 위치가 바뀝니다.

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

TransformPosition은 로컬 점에 Scale과 Rotation을 적용한 뒤 Translation을 더합니다. InverseTransformPosition은 반대 순서의 역변환으로 월드 점을 Actor 기준으로 되돌립니다. 로컬 X가 양수면 적 앞쪽, Y 부호는 좌우를 나타내므로 AI 판단을 회전과 무관하게 작성할 수 있습니다.

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

7. 직접 실습​

실습 목표​

같은 로컬 지점을 서로 다른 Actor 회전에서 월드로 변환하고, 플레이어가 적의 앞쪽에 있는지 적 로컬 좌표로 판정합니다.

시작 전 상태​

레벨 원점에 BP_CoordinateProbe 하나를 배치하고 Local Point (100, 0, 0)의 변환 결과가 출력되도록 합니다. 테스트마다 Actor Location은 고정하고 Yaw만 바꿉니다.

1단계: 따라 하기​

Yaw 0, 90, 180에서 결과를 기록합니다. 예상값은 각각 (100, 0, 0), (0, 100, 0), (-100, 0, 0)에 가깝습니다. 0.00001처럼 작은 잔여값은 회전 계산의 부동소수점 오차일 수 있습니다.

2단계: 값 바꿔 보기​

Actor Location을 (1000, 500, 0)으로 옮기고 다시 Yaw 0과 90을 비교합니다. 회전된 로컬 오프셋에 Translation이 마지막으로 더해져 결과가 각각 (1100, 500, 0), (1000, 600, 0)에 가까워야 합니다.

3단계: 직접 적용​

플레이어 World Location을 WorldPointToLocal에 넣고 반환된 로컬 X가 0보다 크면 앞, 작으면 뒤라고 출력하세요. 경계인 0을 앞에 포함할지 별도 상태로 둘지도 정합니다.

4단계: 스스로 확인​

막혔을 때​

증상원인해결
Yaw를 바꿔도 결과가 같음Local Point를 월드 값처럼 그대로 출력반드시 LocalPointToWorld 반환값을 출력합니다.
예상 위치가 일정하게 더 멀거나 가까움Actor 또는 부모 Scale이 1이 아님Details에서 Actor와 부모의 Scale을 확인합니다.
앞·뒤가 반대로 나옴Enemy - Player처럼 기준을 반대로 사용플레이어 World 위치를 적 Transform의 역변환에 넣습니다.
작은 0이 정확히 0으로 안 나옴부동소수점 회전 오차정확한 동등 비교 대신 허용 오차 또는 방향 판정에 필요한 부호를 사용합니다.

8. 이해 점검 질문 3개​

9. 핵심 요약​

다음 강의 연결​

다음 강의: 벡터 기초에서는 두 위치의 차이로 이동 방향과 거리를 표현하고, 좌표가 실제 게임 움직임의 언어가 되는 과정을 배웁니다.

MINI QUIZ

좌표계와 위치 미니 퀴즈

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

0 / 2
  1. 문제 1“좌표계와 위치” 내용을 실제 작업에 적용한 설명으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2‘축 정의를 다른 엔진과 같다고 가정’ 상태에 관한 “좌표계와 위치” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

2강. 좌표계와 위치 미완료 상태