Artoke

리깅: 쿼터니언 — 짐벌락 없는 회전의 수학

짐벌락이라는 벽

리깅에서 관절의 회전을 오일러 각(X·Y·Z 세 축의 회전값)으로 표현하면, 특정 자세에서 두 회전축이 겹쳐 자유도 하나가 사라지는 짐벌락(gimbal lock)이 발생한다. 예를 들어 가운데 축을 90° 돌리는 순간 바깥 축과 안쪽 축이 같은 평면에 놓여, 세 개의 다이얼로 두 방향밖에 조절할 수 없게 된다. 애니메이션 커브가 갑자기 뒤틀리거나, 보간 중에 팔이 이상한 경로로 휙 도는 현상이 바로 이것이다.

쿼터니언(quaternion)은 이 문제를 근본적으로 피해 가는 회전 표현이다. 세 개의 각도를 순서대로 쌓는 대신, 하나의 회전축과 하나의 회전각을 4차원 수 하나에 담는다. 2D 회전을 단위 복소수 로 표현하는 방식을 3D로 일반화한 것이라고 보면 정확하다.

쿼터니언이라는 수

쿼터니언은 실수부 하나와 허수부 세 개로 이루어진 수다.

여기서 는 모두 실수이고, 는 서로 다른 세 개의 허수 단위다. 이들은 해밀턴이 정한 다음 규칙을 따른다.

이 한 줄에서 곱셈 규칙 전체가 나온다. 예컨대 이지만 다. 곱하는 순서를 바꾸면 부호가 뒤집힌다는 점, 즉 곱셈이 교환법칙을 만족하지 않는다는 점이 핵심인데, 뒤에서 보듯 이것은 3D 회전 자체가 순서에 민감하다는 사실을 그대로 반영한다.

공간 대각선 축을 중심으로 한 120° 회전이 i, j, k를 순환시키는 모습
A rotation of 120° around the first diagonal permutes i , j , and k cyclically · 출처: 쿼터니언 — 짐벌락 없는 회전의 수학

쿼터니언의 크기(노름)는 4차원 벡터의 길이와 같은 방식으로 정의한다.

크기가 1인 쿼터니언을 단위 쿼터니언(versor)이라 부르고, 회전 표현에는 오직 단위 쿼터니언만 쓴다. 켤레(conjugate)는 허수부의 부호만 뒤집은 것이다.

따라서 단위 쿼터니언에서는 역원이 곧 켤레다: . 이 성질 덕분에 회전을 되돌리는 연산이 부호 뒤집기 하나로 끝난다.

축과 각을 하나의 수에 담기

3D 공간의 어떤 회전이든 "어떤 축 둘레로 각도 만큼 돈다"로 기술할 수 있다(오일러의 회전 정리). 단위 쿼터니언은 이 축-각(axis–angle) 정보를 다음처럼 인코딩한다.

기호를 하나씩 풀면 이렇다. 는 회전각, 는 길이가 1인 회전축 방향 벡터다. 실수부 에는 "얼마나 도는지"가, 허수부 에는 "어느 축으로 도는지"가 담긴다. 삼각함수의 항등식 덕분에 가 단위 벡터인 한 도 자동으로 단위 쿼터니언이 된다.

회전축과 회전각으로 3D 회전을 표현하는 축-각 표현
출처: 쿼터니언 — 짐벌락 없는 회전의 수학

눈에 띄는 것은 가 아니라 , 즉 절반 각이 들어간다는 점이다. 이유는 다음 절의 회전 공식에서 드러난다.

리깅: 쿼터니언 — 짐벌락 없는 회전의 수학 도식

샌드위치 곱: 실제 회전 공식

회전시킬 점 를 실수부가 0인 순수 쿼터니언 로 바꾼 뒤, 다음과 같이 양쪽에서 를 끼워 곱한다.

결과 는 다시 실수부가 0인 순수 쿼터니언이 되고, 그 허수부가 회전된 벡터 다. 로 한 번, 로 한 번, 양쪽에서 감싸는 모양이라 흔히 "샌드위치 곱"이라 부른다. 왼쪽 곱과 오른쪽 곱이 각각 4차원에서 만큼의 회전을 일으키는데, 3D 벡터 성분에는 두 효과가 합쳐져 정확히 의 회전으로 나타난다. 공식에 절반 각이 들어가는 이유가 바로 이것이다.

단위 3-구면 위에서 versor의 한쪽 곱이 만드는 60° 회전
p ↦ q p for q = ⁠ 1 + i + j + k / 2 ⁠ on the unit 3-sphere . Note this one-sided (namely, left ) multiplication yields a 60° rotation of quaternions · 출처: 쿼터니언 — 짐벌락 없는 회전의 수학

실제 계산 예를 하나 보자. z축 둘레 90° 회전이라면 , 이므로

이고, 에 샌드위치 곱을 적용하면 이 나온다. x축 방향 벡터가 y축 방향으로 90° 돈 것이다.

회전의 합성과 비가환성

회전 을 먼저, 를 나중에 적용한 합성 회전은 단순히 곱으로 표현된다.

즉 합성 회전의 쿼터니언은 이다. 회전 행렬을 곱하는 것과 같은 구조이지만, 개 성분 대신 4개 성분만 곱하면 되고 수치 오차가 쌓여도 정규화(크기를 1로 나누기) 한 번으로 복구된다. 그리고 쿼터니언 곱이 비가환인 것처럼, 실제 3D 회전도 순서를 바꾸면 결과가 달라진다. 주사위를 앞으로 굴린 뒤 옆으로 굴리는 것과, 옆으로 굴린 뒤 앞으로 굴리는 것은 다른 면을 보여준다.

주사위 회전 순서를 바꾸면 결과가 달라지는 비가환성
Non-commutative rotation of dice · 출처: 쿼터니언 — 짐벌락 없는 회전의 수학

이중 덮개: q와 −q는 같은 회전

샌드위치 곱 공식에 를 넣어 보면 이 되어, 정확히 같은 회전을 만든다는 것을 알 수 있다. 단위 쿼터니언 전체는 4차원 공간의 단위 구면 을 이루는데, 이 구면의 마주 보는 두 점이 회전 하나에 대응한다. 이를 회전군 이중 덮개(double cover)라 한다.

회전 공간 안에서 축과 각이 모두 다른 두 회전
Two separate rotations, differing by both angle and axis, in the space of rotations. Here, the length of each axis vector is relative to the respective magnitude of the rotation about that axis. · 출처: 쿼터니언 — 짐벌락 없는 회전의 수학

리깅 실무에서 이 사실은 "쿼터니언 플립"으로 나타난다. 연속된 키프레임의 쿼터니언 부호가 어긋나 있으면 보간이 먼 쪽으로 돌아간다. 그래서 보간 전에 두 쿼터니언의 내적 를 검사해서, 값이 이면 한쪽 부호를 뒤집어 가까운 쪽 경로를 택한다.

SLERP: 뒤틀림 없는 보간

오일러 각을 성분별로 선형 보간하면 짐벌락 근처에서 경로가 휘고 속도가 출렁인다. 쿼터니언에서는 구면 선형 보간(SLERP)이 그 문제를 해결한다.

여기서 는 0에서 1로 흐르는 보간 매개변수, 는 두 단위 쿼터니언 사이의 각으로 (4차원 내적)로 구한다. 이면 , 이면 가 되고, 그 사이에서는 구면 위의 최단 호를 일정한 각속도로 따라간다. 결과적으로 관절이 두 자세 사이를 가장 짧은 경로로, 균일한 속도로 돈다. 애니메이션 소프트웨어가 내부적으로 회전 커브를 쿼터니언으로 보간하는 이유다.

정리: 리깅에서 무엇이 달라지는가

쿼터니언은 회전각의 절반을 에, 회전축을 배율의 허수부에 담은 4차원 단위 벡터다. 짐벌락이 없고, 합성이 곱셈 한 번이고, 보간이 최단 경로를 따르며, 정규화만으로 수치 오차를 복구한다. 대가는 직관성이다. 네 숫자를 사람이 직접 읽고 편집하기는 어렵기 때문에, 대부분의 DCC 툴은 편집은 오일러 각으로, 내부 연산과 보간은 쿼터니언으로 처리하는 이중 구조를 쓴다. 팔이 이상하게 뒤집히는 키프레임을 만났을 때 "쿼터니언 보간으로 전환" 옵션이 무엇을 하는지, 이제 수식 수준에서 답할 수 있을 것이다.

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

출처

광고

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

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

리깅 도구 보기