Game Dev게임 수학

atan2와 방향 각도 계산

atan2를 이용해 방향 벡터를 각도로 바꾸고, 캐릭터 회전·조준·2D 방향 판정에 어떻게 적용하는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

text
direction = target - origin
angle = atan2(direction.y, direction.x)

설명

  • atan2는 2D 평면에서 방향 벡터를 각도로 바꿀 때 가장 자주 쓰는 함수입니다. 단순 atan(y / x)보다 사분면 정보를 보존하므로, 어느 방향을 보는지 훨씬 안정적으로 해석할 수 있습니다.
  • 캐릭터가 마우스를 향하게 하거나, 총알을 발사 각도로 맞추거나, 미니맵 아이콘의 방향을 표시할 때 결국 "벡터를 각도로 바꾸는 문제"가 나옵니다. 이때 atan2는 방향 문제를 각도 문제로 연결해 줍니다.
  • 초보자가 자주 하는 실수는 degree와 radian을 섞거나, 좌표계의 기준축을 고려하지 않는 것입니다. 엔진마다 0도 기준과 시계/반시계 증가 방향이 달라질 수 있으므로, 화면 좌표와 월드 좌표를 같이 보는 습관이 필요합니다.
  • 또 atan2는 각도를 얻는 함수이지 회전 자체를 부드럽게 만드는 함수는 아닙니다. 회전 보간이나 shortest path 회전은 별도의 interpolation 또는 angle wrapping 처리가 필요합니다.
  • 이 카드를 이해하면 2D 탑다운 조준, HUD 방향 표시, 카메라 yaw 계산처럼 "방향을 숫자로 해석하는" 문제를 훨씬 쉽게 다룰 수 있습니다.

짧은 예제

text
player -> mouse 방향 벡터를 구한다
atan2로 각도를 얻는다
필요하면 radian을 degree로 바꾼다
스프라이트 기본 앞방향에 맞춰 오프셋을 더한다

빠른 정리

항목핵심 포인트
atan2(y, x)사분면을 포함한 방향 각도를 구한다
잘 맞는 문제2D 조준, 방향 표시, 평면 회전
흔한 실수degree/radian 혼동, 축 기준 혼동
별도 처리부드러운 회전, angle wrapping, shortest path
핵심 질문지금 각도가 필요한가, 방향 벡터만으로 충분한가

주의할 점

각도를 얻었다고 회전 문제가 끝난 것은 아닙니다. 특히 359도에서 1도로 넘어갈 때는 단순 뺄셈이 아니라 wrap-around를 고려해야 자연스러운 회전이 나옵니다.

참고 링크

2 sources