기본 패턴
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