본문 바로가기
Unity 유니티

unity 회전, Euler와 Quaternion

by 지나팩 2022. 9. 19.

unity에서 게임 오브젝트를 회전시키려면 보통 transform 컴포넌트에 있는 Vector3로 표현된 rotation값을 활용합니다. 하지만 이는 어디까지나 unity 에디터에서 제어할 때의 얘기이고, 코드를 통해 제어하려하면 Vector3의 x, y, z값으로 제어가 안되어 당혹스러움을 감출 수가 없습니다. 

 

이유인 즉슨 rotation 자체는 Vecto3가 아니라 Quternion이기 때문입니다. 형식이 다르니 당연히 문제가 생기는거죠. 아니 그냥 Vector3 x,y,z 축만 써도 충분한데 왜 굳이 rotation을 Quaternion형식으로 만들어놨을까요??

 

우리가 unity에서 쓰고 있는 Vector3를 통한 회전은 수학자 Euler에 의해 고안된 Euler방식을 쓰고 있습니다. 물론 이 Euler써도 회전을 컨트롤 할 순 있지만 아주 큰 문제가 자리잡고 있습니다. 바로 짐벌락이라는 녀석인데. 쉽게 말하자면 두 축이 겹쳐지면서 하나의 축이 사라져버리는 것입니다.

이미지 보듯 물체가 회전하며 y축과 z축이 겹쳐지며 하나의 축이 사라지게 됩니다. 이로인해 y축을 회전시키든 z축을 회전시키든 똑같이 회전하게 됩니다. 이게 Euler회전 방식이 가지고 있는 한계점인데 회전 시 모든 축을 동시에 계산하는 것이 아닌 x, y, z축의 순서로 계산하다보니 위 이미지처럼 축이 겹치게 되는 상황이 발생하게 됩니다. 그래서 이를 보완하기 위해 나온 것이 Quaternion입니다.

 

Quaternion은 모든 축을 동시에 계산함으로써 짐벌락 문제를 해결할 수 있습니다. 그렇다고 해서 마냥 문제가 없는 것은 아닌데 이 Quaternion은 사용자가 Quaternion을 깊이 이해하고 있지 않다면 직접 rotation을 제어하기가 쉽지 않고, 더불어 180도를 넘어서는 값을 표현할 수 없다는 한계점이 있습니다. 그래서 unity에선 Euler값을 Quaternion값으로 변환해주는 함수 Quaternion.Euler() 제공하고 있습니다. 

 

transform.roation = Quaternion.Euler(new Vector3(120,60,100)); 이런식으로 Euler. Vector3의 x,y,z값을 Quaternion값으로 변환해서 값을 반환해줍니다. 

댓글