"짐벌락(Gimbal Lock)"
개발을 하다보면 3D 카메라를 마우스로 돌리거나, 비행체나 우주선처럼 Pitch/Yaw/Roll을 모두 다루는 순간이 온다.
그런데 각도를 어느 지점까지 돌리면 갑자기 회전 축이 꼬이거나 좌우(Yaw)가 Roll처럼 느껴지는 등,
회전이 걸린 것처럼 이상해지는 현상이 생길 수 있다.
이 현상을 짐벌락(Gimbal Lock)이라고 한다.
특히 짐벌락은 오일러 각(Euler Angles) 기반으로 회전을 다룰 때 자주 발생한다.
Unity에서도 오일러 각을 반복적으로 변환/누적해 사용하는 경우 같은 문제를 겪을 수 있다고 공식 문서에서 설명한다.
오늘은 짐벌락이 무엇이고 왜 생기는지,
그리고 어떻게 해결 및 예방하는지 간단히 정리해볼 예정이다.
1) 짐벌락(Gimbal Lock) 이란?
짐벌락은 간단히 말해 3축으로 회전해야 하는데,
특정 자세에서 회전이 한 축처럼 잠겨 보이는 현상이다.
정확히는 축이 사라지는게 아니라,
두 회전축이 같은 방향으로 정렬(겹침)되면서
원래는 따로 움직여야 할 회전이 서로 구분이 안 되는 상태가 된다.
2) 짐벌락이 왜 생기는가?
짐벌락은 오일러 각의 특이점에서 기인하는데
오일러 각(Euler Angles)은 보통 Yaw / Pitch / Roll처럼 각도 3개로 회전을 표현한다.
문제는 특정 각도에서 회전 순서/축 정렬 때문에 두 축이 겹칠 수 있다는 점이다.
(대표적으로 Pitch가 위/아래로 크게 꺾이는 구간)
즉, 오일러 각 자체가 나쁜 건 아니지만,
매 프레임 오일러 각을 누적하거나 변환을 반복하면 짐벌락처럼 보이는 문제가 더 쉽게 발생한다.
(오일러 각은 각도 3개라 직관적이지만
특정 자세에서 축이 정렬되면 회전이 3축이 아니라 한 축처럼 잠긴 느낌이 날 수 있다)
3) 짐벌락처럼 보이는 예시 상황
(a) transform.eulerAngles로 회전을 매 프레임 누적할 때
transform.eulerAngles += new Vector3(-mouseY, mouseX, 0f);
읽고 → 더하고 → 다시 넣는 패턴은 축 꼬임을 체감하기 쉽다.
(b) FPS/TPP 카메라에서 Pitch를 90도 근처까지 허용할 때
위/아래를 끝까지 보게 만들면 그 구간에서 좌우 회전 감각이 비틀리거나 잠긴 느낌이 날 수 있다.
(c) 비행체/우주선 조작에서 'Euler 기반'으로 처리할 때
Pitch/Yaw/Roll을 모두 자유롭게 만지면 특이점 구간을 밟을 확률이 올라간다.
4) 짐벌락의 해결/예방 방법은?
(a) 회전 누적은 Quaternion 중심으로 계산하기
Unity 내부 회전은 Quaternion 기반이라,
표현은 Euler로 하더라도 누적/보관은 Quaternion 쪽이 안전하다.
(b) '부모-자식 피벗'으로 Yaw/Pitch를 분리하기
PlayerYawPivot (좌우 Yaw)
└─ CameraPitchPivot (상하 Pitch)
└─ Camera
이렇게 분리하면 좌우는 부모, 상하는 자식이 맡아서
축이 꼬일 여지를 크게 줄일 수 있다.
(c) Pitch를 Clamp로 제한하기
실제로는 정확히 90도까지 볼 필요가 없는 경우가 많아서,
특이점에 가까이 가지 않도록 제한하는 게 유효하다.
(ex: -80 ~ 80)
5) 오늘의 한 줄 요약
『 짐벌락(Gimbal Lock)은 특정 각도에서 회전축이 겹쳐 회전이 한 축처럼 잠긴 느낌이 나는 현상이다.』
'1일 1 cs' 카테고리의 다른 글
| 27. IK애니메이션이란? (0) | 2026.02.16 |
|---|---|
| 26. 프로세스(Process)와 스레드(Thread)란? (0) | 2026.02.15 |
| 24. 스프라이트 아틀라스(Sprite Atlas)란? (0) | 2026.02.13 |
| 23. 스크립터블 오브젝트(ScriptalbeObject) 란? (0) | 2026.02.09 |
| 22. 박싱(Boxing)과 언박싱(Unboxing)이란? (0) | 2026.02.08 |