반응형

 

 

"짐벌락(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)특정 각도에서 회전축이 겹쳐 회전이 한 축처럼 잠긴 느낌이 나는 현상이다.

반응형

+ Recent posts