오일러 트랜스폼에는 문제가 존재한다. 이 문제가 무엇이고 이를 개선시킨 방안인 Quaternions에 대해 살펴보자.
오일러 앵글로 회전을 할 때는 x,y,z 축을 기준으로 회전을 했다. 그런데 만약 임의의 축을 기준으로 회전하고 싶으면 어떻게 할까?
오일러 회전은 순서가 굉장히 중요했다! 명시적으로 어떤 순서로 회전을 할 것인지 설정을 해주었어야 했다.
아래 사진처럼 회전 순서를 바꾸면 결과가 완전히 달라지게 된다.
오일러 회전의 문제에 대해 알기 위해 Keyframe Animation을 살펴보고자 한다.
✔ Keyframe Animation in 2D
✔ Keyframe Animation in 3D
Sampling between keyframes.
샘플링하여 보간된 데이터를 얻어와 사이의 애니메이션을 생성한다
Animation smoothing
Euler angles is intuitive and easy to use!
하지만! 두개의 서로 다른 Euler Rotation을 인터폴레이션을 할 때 생각보다 스무스하게 되지 않는다
→ 뭔가 미묘하게 정확히 인터폴레이션 같지 않게 나타난다
💡 왜 이런 문제가 발생할까?
Euler rotation 은 물체가 특정 축을 기준으로 회전을 하는 것이다.
✔ 오일러 트랜스폼의 문제 1
Euler angle rotates object only along the axis.
(60, 30, 45) 회전하며 축이 꼬이게 된다.
→ x y z가 모두 한번에 회전하게 된다.
✔ 오일러 트랜스폼의 문제 2
회전 축 두개가 겹치면서 한 축에 대한 회전을 구현할 수 없는 상태가 되어버린다. gimbal lock이 발생하면 DoF를 잃는다.
→ 이를 해결하기 위해 예전에는 90도 회전을 막고 89도 회전을 시키기도 했다.
A quaternion is an extended complex number.
Gimbal lock의 해결책
- Quaternions are more compact, efficient, and numerically stable compared to Euler Rotation
오일러 회전에 비해 장점들이 많지만- However, quaternions look more complex and difficult to understand
이해하기 어렵고 복잡하다- 연속으로 다른 쿼터니언으로 회전을 시킬 때 손쉽게 합칠 수 있다.
✔ Hamilton Product
두개의 Quaternion p와 q의 product
✔ Conjugation of the quaternion
✔ Unit Quaternion
magnitude
of a quaternion pQuaternion : 회전 상태를 말한다. 회전 시키는 것이 아니라
→ key frame 0 에서 큐브의 쿼터니언이 있고 key1에서 큐브의 쿼터니언이 있는 것이다
Quaternion interpolation
→ 오일러에 비해 자연스럽게 잘 된다.
→ slerp이라는 함수를 사용한다.
Unity는 기본적으로 쿼터니언을 사용한다.
매트릭스 형태로도 쿼터니언을 표현할 수 있고 반대로 매트릭스가 주어졌을 때 쿼터니언을 역산할 수도 있다.
해당 포스트는 강형엽 교수님의 게임그래픽프로그래밍 [GGP-23-1] 수업을 수강하고 정리한 내용입니다. 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다😊
[Gimbal Lock] https://en.wikipedia.org/wiki/Gimbal_lock