Unity에서 게임 오브젝트를 회전 시키려면 GameObject의 Transform에 Rotation 값을 활용하여 회전 시킨다.

에디터에서 Rotation 값을 변경하면 정상적으로 제어가 가능하지만, 코드를 통해 Rotation 값을 변경하려면 정상적으로 제어가 안되는데 Rotation 자체는 Vector3가 아니라 Quternion이기 때문이다.

Quternion을 쓰는 이유는 짐벌락 때문이다.

https://blog.kakaocdn.net/dn/kXRTk/btrMwY8tY6G/zryTERk1Z0McksOfc9MaF0/img.png

https://blog.kakaocdn.net/dn/deTBCv/btrMnLbL993/zKF7Kc6uL8kAV3MJlfsC70/img.png

짐벌락은 두축이 겹치면서 하나의 축이 사라지는 것을 말한다.

위의 이미지 처럼 물체가 회전하면서 y축과 z축이 겹치면서 하나의 축이 사라지게 된다.

이로 인해 y축을 회전시키든, z축을 회전시키든 똑같이 회전되게 되는데 회전시 모든축을 동시에 계산하는 것이 아니라 x,y,z축의 순서대로 계산하다보니 이러한 현상이 나타나는 것이다.

그래서 이를 보완하기 위해서 나온것이 쿼터니언(Quaternion)이다.

쿼터니언은 모든축을 동시에 계산함으로써 이문제를 해결한다.

유니티엔진에서는 Vector3 Euler값을 Quaternion값으로 변경해주는 Quaternion.Euler() 함수를 제공하고 있다.

someThingObject.transform.rotation = Quaternion.Euler(new Vector3(120.0f, 60.0f, 100.0f));
// 이런식으로 Euler Vector3값을 Quaternion 값으로 반환해주는 함수를 제공한다