본문 바로가기

프로그래밍/공부관련

오일러 각

** Euler Angles **
copyrightⓒ 김성완(찐빵귀신) [1999년 6월 23일]

Euler Angles는 3차원 공간에서 물체가 취할 수 있는 방향을 나타내는데 사용되는 세개의 각도 값의 조합을 말합니다.

18세기 수학자 오일러가 착안한 것으로 3차원 공간에서는 3차원 직교 좌표계의 좌표축인 x, y, z 축에 대한 회전을 적당히 조합하면 임의의 방향을 나타낼 수 있다는 사실입니다.

2차원 평면에서 물체의 방향을 지정해주려면 단지 하나의 각도 값이면 충분하지만 3차원 공간에서는 최소한 세개의 각도값이 있어야 하죠.
유의할 점은 오일러 앵글은 특정 회전축의 조합 하나를 말하는게 아니라 3차원 공간에서 임의의 방향을 나타낼 수 있는 조합이라면 어떤 조합도 다 오일러 앵글입니다.

회전을 물체의 회전으로 보느냐? 아니면 좌표계의 회전으로 보느냐? 에 따라서 도 달라질 수 있고, 기준축을 어느것으로 할지에 따라서도 달라질 수 있으므로 사용하려는 목적에 맞는 가장 편리하고 직관적인 조합을 사용하는 것이 좋죠.
보통의 경우 많이 쓰이는 조합이 있는데 3차원 그래픽의 경우 X, Y, Z축 회전을 차례대로 조합한 걸 많이 사용하고, 물리의 강체역학에서는 Z, X, Z축 회전 조합을 많이 사용합니다.
저는 개인적으로 Y, X, Z축 회전 조합을 좋아합니다.

각설하고 임의의 3차원 방향을 나타내는데 문제가 없는 조합이면 다 오일러 앵글입니다.
그런데 문제는 수학적인 견지에서 볼때 이러한 임의의 세 각도 값이 서로 독립적이지 않다는 겁니다.
그래서 실제 로보트 팔을 제어하거나 할때 어떤 축의 회전이 하나마나 한 경우가 생기는데 이걸 Gimbal Lock이라고 합니다.
그리고 임의의 방향을 설정할때 세축의 회전을 조합해야 하는데 이게 얼른 직관적으로 되질 않고, 현재의 특정 방향에서 다른 방향으로 바꾸려고 할때 각 회전 값을 얼만큼 변화시키면 되는지가 애매합니다.
이게 오일러 앵글의 치명적인 약점입니다.
일견 기본 좌표축에 대한 회전의 조합이라서 편하기도 하지만..

위치의 경우 :
 임의의 위치 = X축 위치성분 + Y축 위치성분 + Z축 위치성분
<<x, y, z 성분은 서로 완전히 독립적>>

방향의 경우 :
 임의의 방향 = X축 회전행렬*Y축 회전행렬*Z축 회전행렬(오일러 앵글)
<<위치와는 달리 서로 독립적이지 않다는 것이죠.>>

그래서 이런 문제를 피하기 위해서 오일러 앵글 대신에..

Angular displacement
= (임의의 회전축을 나타내는 벡터) + (그 축에 대한 회전각)
을 사용하기도 합니다.

Angular displacement는 각도성분 하나, 벡터성분 세개 해서 (Theta, Vx, Vy, Vz) 식으로 네개의 값으로 구성되고, 이 네 값은 다행히도 서로 독립적입니다(OpenGL 의 경우도 이 방법을 씁니다).
그래서 오일러 앵글과는 달리 애매한 경우는 생기지 않지만 키프레임 에니메이션을 구현하려 할 때 문제가 있습니다.
키프레임으로 지정된 두개의 방향을 서로 보간 하려고 할때 단순히 네 값의 차이를 서로 선형 보간하면 될 것 같지만 그렇지가 않다는 것이죠.

이건 Quaternion이란 복소수를 확장한 수학적 양을 도입해서 해결하는데 쿼터니온에 대해서는 따로 적지요.


http://www.g-matrix.pe.kr/feature/3dengine/eulerangle.htm