Log to grow

[Unity] 오브젝트의 회전에 대하여(Rotation, Quaternion, Euler) 본문

Game/Unity

[Unity] 오브젝트의 회전에 대하여(Rotation, Quaternion, Euler)

kkkrrr 2018. 8. 3. 11:49

1. Quaternion과 Euler angle

유니티에서 회전을 이해하기 위해선 먼저 Quaternion과 Euler angle을 이해할 필요가 있다. 

Euler angle은 x,y,z 3 개의 축을 기준으로 0~360도만큼 회전시키는 우리에게 친숙한 좌표계이다. 아래의 그림과 같이 유니티의 Scene View에서 회전툴을 선택했을 때 나타나는 3개의 원이 이 Euler 좌표계에 근거한 표시법이다. 




직관적이고 사용하기 편하긴 하지만 Euler angle은 Gimbal lock이라는 문제점이 존재한다. Gimbal lock이란 두 개의 회전축이 겹쳐 특정 방향의 회전이 불가능해지는 것을 말한다. (자세한 설명은 유튜브에...) 따라서, 유니티는 객체의 rotation값을 저장할 때 Quaternion이라는 개념을 사용한다. 

Quaternion이란 사원수라고 번역되며 Euler 좌표계의 Gimbal lock 현상을 해결하기 위해 고안된 좌표계이다. 이 또한 매우 복잡한 개념이다. 하지만 우리가 결국 기억해야 할 것은 유니티의 모든 Rotation에는 내부적으로 Quaternion이 사용되며 우리는 이를 우리에게 친숙한 Euler angle로 바꾸어 사용하면 된다는 것이다. 




2. Quaternion을 Euler angle로 바꾸어주는 함수 (Quaternion.Euler)

Quaternion은 사용하기 어려운 개념이지만 역시나 유니티는 친절하게 여러 함수들을 준비해주었다.

The Quaternion functions that you use 99% of the time are:

 Quaternion.LookRotationQuaternion.AngleQuaternion.EulerQuaternion.SlerpQuaternion.FromToRotation, and Quaternion.identity. (The other functions are only for exotic uses.) 

출처 : https://docs.unity3d.com/ScriptReference/Quaternion.html

위에 나온 함수가 Quaternion과 함께 사용되는 99%의 함수라고 한다. 이 중 단순하게 수치를 대입하기 위하여 사용되는 함수가 바로 Quaternion.Euler 이다. 


우리가 물체를 회전 시키기 위해 사용하는 transform.rotation은 Quaternion을 기반으로 한다.  따라서, Vector3를 대입해주면 다음과 같이 오류가 발생한다. 



이를 해결하기 위해 Quaternion.Euler가 아래와 같이 사용된다. 



풀어서 보면 x축으로 10도, y축으로 20도, z축으로 30도의 회전 값을 가지도록 객체를 회전하라는 의미이다. 이 Euler 좌표계의 값이 내부적으로 어떻게 Quaternion으로 변환되어 저장되는지는 알 수 없으나 결과적으로 객체는 x축으로 10도, y축으로 20도, z축으로 30도의 회전한다.




2. 그 밖의 회전 방법


위에서 설명한 것과 다른 방법으로는 첫 번째로 Quaternion Type의 변수를 생성한 후 이 변수의 eulerAngle을 바꿔주는 것이다. 이렇게 생성된 Quaternion을 rotation에 사용할 수 있다. 





두 번째로 Quaternion을 사용하지 않고 바로 eulerAngle을 사용하는 것이다. eulerAngle은 World Space에 대한 객체의 회전값이며, local 값을 원할 경우 localEulerAngle을 사용하면 된다. 












Comments