Artoke

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

리깅: 회전의 함정 — 오일러 각과 짐벌락 대표 이미지
Gimbal-locked airplane. When the pitch (green) and yaw (magenta) gimbals become aligned, changes to roll (blue) and yaw apply the same rotation to the airplane. · 출처: 회전의 함정 — 오일러 각과 짐벌락

비행 시뮬레이터를 만들다 보면, 기체를 특정 자세로 돌려놓았을 때 조종간의 한 축이 갑자기 먹통이 되는 순간을 만난다. 좌우로 돌리는 값을 바꿔도, 기울이는 값을 바꿔도 화면 속 기체가 똑같은 방향으로만 돈다. 회전을 오일러 각으로 다루면 반드시 마주치는 이 함정이 바로 짐벌락(gimbal lock)이다. 이 글은 "왜 자유도가 하나 사라지는가"를 회전 행렬을 직접 곱해가며 단계별로 뜯어본다.

세 개의 고리, 세 개의 각도

물리적인 짐벌은 서로 직교하는 축을 가진 세 개의 고리다. 바깥 고리, 가운데 고리, 안쪽 고리가 각각 하나의 회전축을 담당한다. 컴퓨터 그래픽스에서 이 세 고리를 대신하는 것이 세 개의 오일러 각이다.

  • (요, yaw) — 세로축 둘레의 회전
  • (피치, pitch) — 가로축 둘레의 회전
  • (롤, roll) — 앞뒤축 둘레의 회전

기호가 낯설다면 이렇게 읽으면 된다. 는 고개를 좌우로 젓는 각, 는 고개를 끄덕이는 각, 는 고개를 갸웃하는 각이다. 세 각은 각각 라디안 단위로 잰다.

세 축을 가진 짐벌이 롤·피치·요로 자유롭게 도는 모습
Gimbal with 3 axes of rotation. A set of three gimbals mounted together to allow three degrees of freedom: roll, pitch and yaw. When two gimbals rotate around the same axis, the system loses one degre · 출처: 회전의 함정 — 오일러 각과 짐벌락

회전을 행렬로 적는다

각 축 둘레의 회전은 하나의 행렬로 쓴다. 여기서 이 필요한데, 각도로부터 좌표를 뽑아내는 삼각함수가 회전의 언어이기 때문이다.

축 둘레(롤):

축 둘레(피치):

축 둘레(요):

세 축의 이름 는 각각 회전이 일어나도 값이 그대로 남는 축을 뜻한다. 예컨대 의 첫 행·첫 열에 만 있는 것은, 축 성분은 이 회전에 영향받지 않는다는 뜻이다.

전체 자세는 세 회전을 순서대로 이어붙여 만든다. 바깥 고리부터 안쪽 고리로 요→피치→롤 순서라면

행렬 곱은 순서가 중요하다. 오른쪽 것이 먼저 적용되므로, 여기서는 롤이 가장 안쪽, 요가 가장 바깥에서 작동한다.

정상 상태: 세 축이 서로 독립

에서 멀리 떨어져 있을 때는 세 고리의 축이 서로 다른 방향을 가리킨다. 각 축을 조금씩 돌리면 기체는 서로 다른 방향으로 반응한다. 세 개의 조종 손잡이가 각각 독립된 결과를 내는, 우리가 기대하는 상태다.

세 고리의 축이 서로 다른 방향을 가리키는 정상 상태
Normal situation: the three gimbals are independent · 출처: 회전의 함정 — 오일러 각과 짐벌락

가운데 고리를 90도로 세우면

문제는 일 때 터진다. 이때 , 이므로

이 상태에서 안쪽 고리(롤)의 회전축이 바깥 고리(요)의 회전축과 나란해진다. 두 고리가 같은 축을 공유하게 되는 것이다. 아래 도식이 그 순간을 보여준다.

리깅: 회전의 함정 — 오일러 각과 짐벌락 도식
세 고리 중 둘이 같은 평면에 놓여 자유도 하나가 사라진 짐벌락 상태
Gimbal lock: two out of the three gimbals are in the same plane, one degree of freedom is lost · 출처: 회전의 함정 — 오일러 각과 짐벌락

행렬을 직접 곱해 확인한다

말이 아니라 수식으로 확인해 보자. 를 대입해 를 끝까지 곱하면 다음이 나온다.

여기서 결정적인 사실이 드러난다. 최종 행렬이 따로따로 담고 있지 않고 오직 차이 로만 담고 있다. 즉 돌리고 돌리면 차이가 그대로라서 기체 자세는 조금도 변하지 않는다. 두 손잡이가 하나의 손잡이로 합쳐진 셈이다.

삼각함수의 덧셈정리를 떠올리면 이 붕괴가 왜 일어나는지 보인다. 처럼, 서로 다른 두 각이 하나의 각 차이로 뭉쳐버리는 것이다.

"자유도가 하나 준다"는 말의 정확한 의미

세 각 는 원래 3차원 공간의 좌표처럼 세 방향으로 독립적으로 움직여야 한다. 하지만 근방에서는 가 오직 라는 하나의 조합으로만 결과에 나타난다. 세 개의 조절기가 실질적으로 두 개(, 그리고 )로 줄어든 것이다.

수학적으로는 각속도와 오일러 각 변화율을 잇는 야코비 행렬이 이 지점에서 특이(singular)해진다고 말한다. 행렬식이 흔히 꼴로 나타나

이 되어, 어떤 각속도 방향은 오일러 각 변화로는 도저히 만들어낼 수 없게 된다. 그 방향으로 기체를 틀려면 를 순간적으로 무한히 빨리 돌려야 하는데, 이것이 시뮬레이션에서 축이 갑자기 튀거나 얼어붙는 현상으로 나타난다.

고리를 하나 더 달면 되지 않을까

직관적인 해법은 네 번째 축을 추가하는 것이다. 실제 자이로스코프나 항법 장치는 이렇게 만든다. 다만 공짜는 아니다. 가장 바깥 고리를 능동적으로 구동해서, 그것이 항상 가장 안쪽 축과 만큼 어긋나도록 계속 밀어줘야 한다. 가만히 두면 네 축짜리 기구에서도 짐벌락은 여전히 발생한다.

네 번째 축을 더해도 능동 구동이 없으면 짐벌락이 여전히 일어나는 구조
Adding a fourth rotational axis can solve the problem of gimbal lock, but it requires the outermost ring to be actively driven so that it stays 90 degrees out of alignment with the innermost axis (the · 출처: 회전의 함정 — 오일러 각과 짐벌락

근본 원인과 그래픽스의 답

짐벌락은 특정 짐벌 설계의 버그가 아니다. 3차원 회전 전체를 이루는 공간 를 세 개의 각도라는 세 좌표로 빈틈없이 덮으려는 시도 자체가 위상학적으로 불가능하기 때문에 생기는, 좌표계의 구조적 특이점이다. 지구본에 경도·위도를 매길 때 북극·남극에서 경도가 무의미해지는 것과 같은 종류의 문제다.

그래서 현대 3D 엔진은 회전을 오일러 각 대신 단위 사원수(quaternion)로 저장한다. 사원수는 회전을 네 개의 성분 와 제약 로 표현해서, 어떤 자세에서도 특이점 없이 매끄럽게 보간된다. 오일러 각은 사람이 값을 읽고 입력하는 표시용으로만 남기고, 내부 계산은 사원수로 돌리는 것이 리깅과 애니메이션의 표준적인 처방이다.

정리하면 이렇다. 짐벌락은 에서 두 회전축이 나란해져 행렬이 에만 의존하게 되는 현상이고, 그 대가로 자유도 하나와 매끄러운 제어를 잃는다. 수식이 미리 경고해 주는 이 함정을, 표현 방식을 바꿔 피해가는 것이다.

함께 읽기 — 이 글이 쓰는 기초 수학

출처

광고

리깅 파이프라인 자동화 도구

반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.

리깅 도구 보기