1. 개요[편집]
| 오일러각 Euler Angles | |
|---|---|
| 정립 | 레온하르트 오일러 (1776) |
| 자유도 | 3 (최소 개수) |
| 규약 개수 | 12 × 2 (내재/외재) = 24가지 |
| 고질병 | 짐벌락(gimbal lock) |
| 대안 | 사원수, 회전행렬 |
롤·피치·요. 사람이 읽기엔 이보다 좋은 표현이 없고, 컴퓨터가 쓰기엔 이보다 나쁜 표현이 없다.
오일러각(Euler angles)은 3차원 공간의 임의의 회전을 세 좌표축 둘레의 연속된 세 번의 회전으로 분해해 각도 세 개로 나타내는 표현이다. 오일러의 회전 정리 — 강체의 임의의 방향은 고정점을 지나는 어떤 축 둘레의 단 한 번의 회전으로 도달할 수 있다 — 를 축 기준으로 다시 쪼갠 형태이며, 회전군 의 자유도가 3이라는 사실에 딱 맞는 최소 개수의 매개변수다.
문제는 최소라는 것이 공짜가 아니라는 점이다. 세 숫자로 회전을 표현하는 순간 반드시 특이점이 생기고, 그 특이점의 이름이 짐벌락이다. 사원수가 굳이 4개를 쓰는 이유, 회전행렬이 굳이 9개를 쓰는 이유가 전부 이 한 문장에서 나온다.
2. 규약의 늪[편집]
“오일러각으로 (30°, 45°, 60°)입니다”라는 말은 그 자체로는 아무 정보도 주지 않는다. 규약을 같이 말해야 한다.
축 순서는 두 계열로 나뉜다. 첫 축과 셋째 축이 같은 고유 오일러각(proper Euler, ZXZ·ZYZ·XYX 등 6가지)과, 세 축이 모두 다른 테이트-브라이언 각(Tait–Bryan, XYZ·ZYX 등 6가지)이다. 항공우주에서 쓰는 요-피치-롤은 후자이고, 결정학의 집합조직(texture) 해석에서 쓰는 번게(Bunge) 규약 는 전자의 ZXZ다.
여기에 회전축의 기준이 곱해진다.
- 외재적(extrinsic) — 매번 고정된 월드 축 둘레로 돌린다.
- 내재적(intrinsic) — 물체에 붙어 함께 돌아가는 축 둘레로 돌린다.
둘은 순서를 뒤집으면 서로 같다. 내재적 Z–Y′–X″ 회전은 외재적 X–Y–Z 회전과 정확히 동일한 결과를 준다. 12가지 축 순서 × 2가지 기준 = 24가지 규약이 존재하고, 소프트웨어마다 다른 것을 기본값으로 쓴다. 서로 다른 도구 사이에서 자세 데이터를 주고받을 때 캐릭터나 위성이 엉뚱한 방향을 보는 사고의 대부분은 여기서 난다.1
항공 표준인 내재적 Z–Y′–X″(요 , 피치 , 롤 )의 회전행렬은 이렇게 곱해진다.
행렬 곱은 교환법칙이 성립하지 않으므로, 순서를 바꾸면 완전히 다른 자세가 된다. 오일러각이 직관적이라는 평판은 사실 “각각 하나씩 볼 때만” 직관적이라는 뜻이다.
3. 짐벌락[편집]
세 축 중 가운데 회전이 특정 각에 도달하면 첫 번째 축과 세 번째 축이 공간적으로 일치해 버린다. 테이트-브라이언 계열에서는 피치가 일 때, 고유 오일러각 계열에서는 가운데 각이 또는 일 때다. 이 순간 첫 각과 셋째 각은 같은 축을 공유하므로 그 합만 의미가 있고, 자유도 하나가 통째로 사라진다. 이것이 짐벌락(gimbal lock)이다.
물리적 짐벌 장치의 은유가 아니라 수학적 사실임을 보려면 각속도 관계식을 보면 된다. 동체 좌표계 각속도 에서 오일러각 변화율로 가는 운동학 방정식은 다음과 같다.
에서 와 가 발산한다. 즉 유한한 물리적 각속도가 무한한 오일러각 변화율을 요구하게 되고, 수치 적분기는 그 근처에서 그냥 터진다. 변환 자코비안이 특이해지는 것이므로 조밀한 자코비안 행렬 관점에서는 조건수가 폭발하는 상황과 같다.
더 근본적인 이유도 있다. 은 위상적으로 3차원 실사영공간 이고 세 각이 사는 3차원 원환면 과 위상동형이 아니다. 따라서 세 개의 매개변수로 전체를 특이점 없이 덮는 전역 좌표계는 존재할 수 없다. 규약을 바꾸면 특이점의 위치가 옮겨갈 뿐 없어지지 않는다. 짐벌락은 구현의 결함이 아니라 3개짜리 표현을 선택한 대가다.
가장 유명한 사례는 아폴로 우주선의 관성항법장치다. 3축 짐벌 구조라 특정 자세에서 잠금이 발생했고, 조종사는 그 영역을 피해 비행해야 했다. 네 번째 짐벌을 넣자는 제안은 무게와 복잡도를 이유로 기각됐다.2
4. 변환[편집]
오일러각 → 사원수는 각 축 회전의 반각 사원수를 순서대로 곱하면 끝이다.
곱셈 세 번이라 싸고, 짐벌락도 이 방향에서는 문제되지 않는다. 특이점은 추출할 때 나온다. 회전행렬 에서 위 규약의 각을 뽑는 표준 절차는 이렇다.
이면 이 되어 atan2(0, 0)이 된다. 답이 없는 게 아니라 답이 무한히 많은 것이므로, 실무 코드는 이 경우 셋째 각을 0으로 고정하고 나머지 하나에 합을 몰아주는 관례를 쓴다. 그리고 asin 대신 atan2를 쓰는 것이 국룰인 이유는 asin이 근처에서 정밀도가 급격히 나빠지기 때문이다. 인자가 부동소수점 오차로 이 되면 그대로 NaN이다.
보간은 하지 마라. 두 오일러각 세트를 성분별로 선형 보간하면 경로가 회전 공간의 최단 호와 무관해지고, 경계에서 값이 감기며(wrap-around) 캐릭터가 한 바퀴 돌아버린다. 회전 보간은 사원수 slerp로 하고, 오일러각은 표시할 때만 쓰는 것이 애니메이션 블렌딩의 기본 위생 수칙이다.
5. 그래도 오일러각을 쓰는 곳[편집]
이 문서의 8할이 험담이었지만, 오일러각이 정답인 자리도 분명히 있다.
- 사람이 값을 입력하는 UI — 엔진 인스펙터에 사원수 네 칸을 노출하는 도구는 없다. 아티스트는 “Y로 90도”라고 생각하지, 이라고 생각하지 않는다. 내부는 사원수, 표시는 오일러각이 표준 구성이다.
- 비행·차량 동역학 — 받음각·옆미끄럼각 같은 공기역학 변수가 애초에 오일러각으로 정의되어 있다. 여객기가 수직 상승할 일이 없다면 특이점은 실무상 만나지 않는다. 곡예기·미사일 시뮬레이션은 그래서 사원수로 상태를 굴린다.
- 해석역학 — 팽이나 자이로스코프의 라그랑주 역학 서술에서 세차·장동·자전이 각각 오일러각 하나씩에 대응해 방정식이 물리적으로 읽힌다. 회전체 동역학의 고전 문제들이 ZXZ 규약으로 쓰인 이유다.
- 재료·결정학 — 다결정 집합조직의 배향 분포 함수는 번게 오일러각 공간에서 정의되고, ODF 등고선도 그 공간에 그린다.
6. 여담[편집]
- 짐벌락을 처음 배우는 사람이 가장 흔히 하는 오해는 “사원수를 쓰면 짐벌락이 없어진다”이다. 정확히는, 사원수로 상태를 저장하고 오일러각으로 변환하지 않으면 없다. 최종 출력을 오일러각으로 뽑는 순간 특이점은 그대로 따라온다.
- 서로 다른 두 툴의 오일러각이 안 맞을 때 각도 부호를 하나씩 뒤집어 보는 것은 나쁜 습관이다. 24가지 중 어느 규약인지 문서에서 확인하는 편이 결국 빠르다.3
- 세 각을 각각 슬라이더로 만들어 두면 QA는 반드시 가운데 슬라이더를 90도에 놓는다. 그 버그 리포트는 재현 가능하고, 원인은 3백 년 전 오일러에게 있다.
7. 관련 문서[편집]
8. Footnotes[편집]
-
널리 쓰이는 소프트웨어들만 봐도 기본 회전 순서가 제각각이다. 그래서 FBX나 glTF 같은 교환 포맷은 회전을 사원수나 행렬로 실어 나르고, 오일러각은 저작 도구 내부 표현으로만 남긴다. 파이프라인 설계의 오래된 교훈: 애매한 것은 파일에 넣지 않는다. ↩
-
NASA 엔지니어들 사이에 “크리스마스 선물로 네 번째 짐벌을 달라”는 농담이 돌았다는 일화가 전해진다. 실제 아폴로 11호 임무 중에도 짐벌락 영역 접근 경고가 발생했고, 우주비행사는 별을 다시 조준해 정렬(realign)해야 했다. ↩
-
부호를 뒤집어서 “맞아 보이게” 만들면 대개 테스트한 한 자세에서만 맞는다. 회전 규약이 틀렸다는 것은 24개 중 하나를 골랐다는 뜻이지 부호가 하나 틀렸다는 뜻이 아니다. 축 순서까지 어긋난 경우는 어떤 부호 조합으로도 복구되지 않는다. ↩