리깅: 회전의 함정 — 오일러 각과 짐벌락

비행 시뮬레이터를 만들다 보면, 기체를 특정 자세로 돌려놓았을 때 조종간의 한 축이 갑자기 먹통이 되는 순간을 만난다. 좌우로 돌리는 값을 바꿔도, 기울이는 값을 바꿔도 화면 속 기체가 똑같은 방향으로만 돈다. 회전을 오일러 각으로 다루면 반드시 마주치는 이 함정이 바로 짐벌락(gimbal lock)이다. 이 글은 "왜 자유도가 하나 사라지는가"를 회전 행렬을 직접 곱해가며 단계별로 뜯어본다.
세 개의 고리, 세 개의 각도
물리적인 짐벌은 서로 직교하는 축을 가진 세 개의 고리다. 바깥 고리, 가운데 고리, 안쪽 고리가 각각 하나의 회전축을 담당한다. 컴퓨터 그래픽스에서 이 세 고리를 대신하는 것이 세 개의 오일러 각이다.
- (요, yaw) — 세로축 둘레의 회전
- (피치, pitch) — 가로축 둘레의 회전
- (롤, roll) — 앞뒤축 둘레의 회전
기호가 낯설다면 이렇게 읽으면 된다. 는 고개를 좌우로 젓는 각, 는 고개를 끄덕이는 각, 는 고개를 갸웃하는 각이다. 세 각은 각각 라디안 단위로 잰다.

회전을 행렬로 적는다
각 축 둘레의 회전은 하나의 행렬로 쓴다. 여기서 이 필요한데, 각도로부터 좌표를 뽑아내는 삼각함수가 회전의 언어이기 때문이다.
축 둘레(롤):
축 둘레(피치):
축 둘레(요):
세 축의 이름 는 각각 회전이 일어나도 값이 그대로 남는 축을 뜻한다. 예컨대 의 첫 행·첫 열에 과 만 있는 것은, 축 성분은 이 회전에 영향받지 않는다는 뜻이다.
전체 자세는 세 회전을 순서대로 이어붙여 만든다. 바깥 고리부터 안쪽 고리로 요→피치→롤 순서라면
행렬 곱은 순서가 중요하다. 오른쪽 것이 먼저 적용되므로, 여기서는 롤이 가장 안쪽, 요가 가장 바깥에서 작동한다.
정상 상태: 세 축이 서로 독립
가 에서 멀리 떨어져 있을 때는 세 고리의 축이 서로 다른 방향을 가리킨다. 각 축을 조금씩 돌리면 기체는 서로 다른 방향으로 반응한다. 세 개의 조종 손잡이가 각각 독립된 결과를 내는, 우리가 기대하는 상태다.

가운데 고리를 90도로 세우면
문제는 일 때 터진다. 이때 , 이므로
이 상태에서 안쪽 고리(롤)의 회전축이 바깥 고리(요)의 회전축과 나란해진다. 두 고리가 같은 축을 공유하게 되는 것이다. 아래 도식이 그 순간을 보여준다.

행렬을 직접 곱해 확인한다
말이 아니라 수식으로 확인해 보자. 를 대입해 를 끝까지 곱하면 다음이 나온다.
여기서 결정적인 사실이 드러난다. 최종 행렬이 와 를 따로따로 담고 있지 않고 오직 차이 로만 담고 있다. 즉 를 돌리고 를 돌리면 차이가 그대로라서 기체 자세는 조금도 변하지 않는다. 두 손잡이가 하나의 손잡이로 합쳐진 셈이다.
삼각함수의 덧셈정리를 떠올리면 이 붕괴가 왜 일어나는지 보인다. 처럼, 서로 다른 두 각이 하나의 각 차이로 뭉쳐버리는 것이다.
"자유도가 하나 준다"는 말의 정확한 의미
세 각 는 원래 3차원 공간의 좌표처럼 세 방향으로 독립적으로 움직여야 한다. 하지만 근방에서는 와 가 오직 라는 하나의 조합으로만 결과에 나타난다. 세 개의 조절기가 실질적으로 두 개(, 그리고 )로 줄어든 것이다.
수학적으로는 각속도와 오일러 각 변화율을 잇는 야코비 행렬이 이 지점에서 특이(singular)해진다고 말한다. 행렬식이 흔히 꼴로 나타나
이 되어, 어떤 각속도 방향은 오일러 각 변화로는 도저히 만들어낼 수 없게 된다. 그 방향으로 기체를 틀려면 나 를 순간적으로 무한히 빨리 돌려야 하는데, 이것이 시뮬레이션에서 축이 갑자기 튀거나 얼어붙는 현상으로 나타난다.
고리를 하나 더 달면 되지 않을까
직관적인 해법은 네 번째 축을 추가하는 것이다. 실제 자이로스코프나 항법 장치는 이렇게 만든다. 다만 공짜는 아니다. 가장 바깥 고리를 능동적으로 구동해서, 그것이 항상 가장 안쪽 축과 만큼 어긋나도록 계속 밀어줘야 한다. 가만히 두면 네 축짜리 기구에서도 짐벌락은 여전히 발생한다.

근본 원인과 그래픽스의 답
짐벌락은 특정 짐벌 설계의 버그가 아니다. 3차원 회전 전체를 이루는 공간 를 세 개의 각도라는 세 좌표로 빈틈없이 덮으려는 시도 자체가 위상학적으로 불가능하기 때문에 생기는, 좌표계의 구조적 특이점이다. 지구본에 경도·위도를 매길 때 북극·남극에서 경도가 무의미해지는 것과 같은 종류의 문제다.
그래서 현대 3D 엔진은 회전을 오일러 각 대신 단위 사원수(quaternion)로 저장한다. 사원수는 회전을 네 개의 성분 와 제약 로 표현해서, 어떤 자세에서도 특이점 없이 매끄럽게 보간된다. 오일러 각은 사람이 값을 읽고 입력하는 표시용으로만 남기고, 내부 계산은 사원수로 돌리는 것이 리깅과 애니메이션의 표준적인 처방이다.
정리하면 이렇다. 짐벌락은 에서 두 회전축이 나란해져 행렬이 에만 의존하게 되는 현상이고, 그 대가로 자유도 하나와 매끄러운 제어를 잃는다. 수식이 미리 경고해 주는 이 함정을, 표현 방식을 바꿔 피해가는 것이다.
함께 읽기 — 이 글이 쓰는 기초 수학
출처
리깅 파이프라인 자동화 도구
반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.
리깅 도구 보기