Unity 물체 회전


물체의 회전

Euler angle

Quaternion을 보기 전에 Euler angle부터 봐야 한다.

Euler angle은 x,y,z 이 세개의 축을 기준으로 0~360도 만큼 회전시키는 좌표계이다.

Quaternion

Quaternion은 회전을 표현하기 위해 사용된다.

유니티 공식 사이트 설명에는

  • 쿼터니언은 작지만, 짐벌 락(gimbal lock)에 걸리지 않고, 쉭베 보간될 수 있습니다. 유니티는 내부적으로 쿼터니언을 모든 회전을 표현하기 위해 사용합니다. *

  • Gimbal lock : 두 개의 회전축이 겹쳐 특정 방향의 회전이 불가능해지는 것

라고 되어있다. 얘는 Euler 좌표계의 Gimbal lock 현상을 해결하기 위해 고안된 좌표계라고 한다.

복잡한 개념이지만, ** 유니티의 모든 rotation에는 내부적으로 Quaternion이 사용되며, 이것을 Euler angle로 바꾸어 사용하면 된다고 이해하면 될 것 같다 **.

Quaternion을 Euler angle로 바꿔주는 함수 (Quaternion.Euler)

유니티 공식 사이트에서는

  • Quaternion.LookRotation, Quaternion.Angle, Quaternion.Euler, Quaternion.Slerp, Quaternion.FromToRotation, and Quaternion.identity. (The other functions are only for exotic uses.) 를 가장 많이 사용하는 함수라고 설명한다. 이 중 단순하게 수치를 대입하기 위해 사용하는 함수가 Quaternion.Euler라고 한다.

물체를 회전시키기 위해 사용하는 transform.rotation은 Quaternion을 기반으로 하고 있기 떄문에,

trasnform.rotation = new Vector3(0,0,0);

위와 같이 단순히 Vector3을 대입하면 오류가 발생한다.

따라서 Quaternion.Euler를 사용해야 하는데,

transform.roatation = Quaternion.Euler(10,20,30);

이렇게 Quaternion.Euler를 이용해야 한다.

위의 코드는 x축으로 10도, y축으로 20도, z축으로 30도 회전 값을 가지도록 객체를 회전하라는 의미이다.

다른 회전 방법

1. Quaternion Type의 변수 생성한 후 변수의 eulerAngle을 바꿔준다.

Quaternion quaternion = Quaternion.identitiy; //초기화
quaternion.eulerAngles = new Vector3(10,20,30); //Euler angle 지정

이렇게 생성한 Quaternion을 rotation에 이용할 수 있다고 한다.

2. 바로 eulerAngle을 사용한다.

transform.eulerAngles = new Vector3(10,20,30);

eulerAngle은 WorldSpace에 대한 객체의 회전값이고, local을 원할 경우 localEulerAngle을 사용하면 된다.

transform.Rotate vs. transform.rotation 의 차이?

  1. transform rotation 은 특정 rotation 값으로 설정한다. ()
  2. rotate는 특정 회전 값 만큼 회전을 시켜준다. (spinning, turning a car)

transform.Roate() 의 특징은

  1. 기본적으로 로컬 축을 중심으로 회전한다. 대부분의 다른 회전은 기본적으로 월드 축을 사용한다.
  2. 델타 회전이다. 객체를 특정 각도만큼 회전시킨다.

그래도 이해가 잘 안돼서 더 찾아봤다.

  1. Rotate()는 함수이며 현재 기준에서 회전할 값만 넣어서 회전을 시킨다. 회전 되어진 값은 roatation을 확인하면 된다. 벡터값을 입력해서 회전 시킨다.
  2. rotation은 property이며 현재 회전값을 의미한다. 쿼터니언 값을 적용하여 회전시킨다.

한 사이트에서 transform.rotation은 숙련자들을 위한 것이라고 되어 있는데 그럼 일단 rotate 함수를 써야 하나 싶다.