3차원에서의 회전에 대해서 알아보자
에디터에서 회전을 나타낼 때는 오일러 각(Euler Angle)으로 표시한다. 오일러 각은 X, Y, Z를 사용해 회전을
표시하며, 이 값은 각 축에 대한 회전 각도(단위: 도)를 나타낸다. 오일러 각 회전은 3개의 축에 대해 차례대로 3번의 회전을 수행한다.* eulerAngles를 이용하면 오일러 각을 얻거나 수정할 수 있다.
오일러 각은 3차원 공간의 회전에 대해서 직관적인 인터페이스를 제공하고, 회전을 위한 데이터도 3개면 충분하므로 경제적이라고 할 수 있다. 단, 치명적인 약점이 있는데 바로 짐벌락(Gimbal lock)이다.
짐벌락은 2개의 축이 겹쳐버려 3차원 공간의 회전에 제약이 생긴 것을 의미한다. 예시는 여기서 확인하자. 결국 짐벌락 문제는 3개의 축에 대한 회전을 3번에 걸쳐서 계산하기 때문에 일어나는 것이다.
이를 해결하기 위해 3차원 공간의 회전은 사원수를 사용한다.
사원수(Quaternion)는 4개의 복소수 체계를 의미한다. 사원수를 이용하면 3차원에서의 회전을 단 한 번만 수행하여 나타낼 수 있기 때문에 짐벌락 현상이 발생하지 않는다. 따라서 Unity에서 실제 회전은 사원수로 수행된다.*
다만, 수학적으로 쉽지 않은 개념이기에 Unity에서는 사원수를 쉽게 사용할 수 있도록 여러 API를 제공한다. rotation을 통해 게임오브젝트의 회전을 얻을 수 있다.
오일러 각에서 사원수로 변환을 하고 싶다면 Quaternion.eulerAngles와 Quaternion.Euler()를 사용하면 된다.
회전을 생성하려면 LookRotation(), Angle(), AngleAxis(), FromToRotation()을 사용하면 된다.
회전을 조작하기 위해 Slerp(), Inverse(), RotateTowards(), * 연산자를 사용할 수 있다.
편하게 사용하기 위해 Transform의 Rotate(), RotateAround()를 사용할 수 있다.