rotation

오일러각

하나의 회전을 X축 Y축 Z축으로 얼마나 회전할지로 표현하는것. 숫자 3개로 표현되므로 메모리는 제일 적게 든다. 회전은 순서에 따라 달라지므로, 오일러각을 XYZ순서로 할지 ZYX순으로 할지 순서를 정하는게 필요하다. 짐벌락 현상이 있음. 이건 첫 회전은 두 축을 같이 회전시키지만, 두번째 회전은 첫 회전축을 보전하면서 세번째 회전축을 움직이는데, 이때 첫 회전축과 세번째 회전축이 겹치게 되면 세번째 축에서의 회전은 첫번째 축에서의 회전과 동일하므로 자유도를 상실하게 됨.

회전행렬

쿼터니언에 비해 선형대수정도만 알면 이해하기 쉽다. 많은 좌표계/카메라 강의자료도 이걸 설명해준다.

R: right, default = (1,0,0)

U: up, default = (0,1,0)

L: lookat, default = (0,0,1)

[R.x U.x L.x
R.y U.y L.y
R.z U.z L.z]

즉 어떤 직교좌표계로의 변환행렬은 그 직교기저 3개를 행렬로 표현해주면 된다는, 굉장히 깔끔하게 정리가 된다. 최소한 3x3 행렬을 관리해야하므로 쿼터니언보다 무겁다. 최소한 3x3이라고 했지만, 사실 lookat과 up을 관리해주면 right를 뽑아낼 수 있기 때문에 숫자6개면 충분하다. 다만, 하나의 회전을 두 벡터 lookat과 up의 회전으로 구현해야하고, 회전하다보면 오차때문에 직교성이 깨져서 주기적으로 직교화해줘야 하는 귀찮음이 있다.

단위사원수

임의의 축 회전, 회전끼리의 보간, 순차적 회전표현 등이 행렬표현보다 간단하고 빠르다. 메모리도 숫자4개면 충분하므로 더 효율적이다. 다만 수학적인 해석이 어렵다. black box로 사용하면 됨. 직접 구현해서 써보니까, 곱하다보면 단위사원수가 아니게 되는 수치적인 문제는 차치하고 애니메이션의 node들 transform matrix에서 unit quaternion뽑아오는게 좀 수치적으로 불안정하고 좋은자료도 부족하다(넷상에서 발견한 대부분의 자료는 rotation matrix가 단위직교인걸 가정하는데 애니메이션 작업을 하다보면 그렇지 않은 경우가 많다;). 그래서 속편하게 glm::quaternion과 glm::matrix_decompose로 갈아탔다.

See Also

https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Comparison_with_other_representations_of_rotations