유니티에서 rotation(회전)은 오브젝트가 공간에서 어떻게 회전하는지를 나타내는 개념이다. 기본적으로 유니티에서는 Euler 각도와 Quaternion(쿼터니언) 두 가지 방식으로 회전을 다룰 수 있다.
Euler 각도는 (X, Y, Z) 형태로 회전을 표현하는 방식이다. 우리가 흔히 사용하는 3D공간에서의 Pitch(상하), Yaw(좌우), Roll(회전) 개념과 연결된다.
transform.eulerAngles = new Vector3(0, 90, 0);
위 코드는 Y 축을 기준으로 오브젝트를 90도 회전시킨다.
Euler 각도의 문제점: 짐벌 락(Gimbal Lock)
Euler 각도 방식은 특정한 각도에서 회전 축이 겹쳐지면서 일부 축이 비활성화되는 짐벌 락(Gimbal Lock) 문제가 발생할 수 있다. 이는 특정 각도로 회전할 때 축이 하나 사라져 더 이상 올바른 회전을 적용할 수 없는 상태를 의미한다.
Euler 각도를 사용할 때의 주의점
쿼터니언은 x, y, z, w 네 개의 값을 사용하여 회전을 표현하는 방식이다. 수학적으로 복잡하지만, 짐벌 락 문제가 발생하지 않는다는 장점이 있다.
transform.rotation = Quaternion.Euler(0, 90, 0);
이렇게 하면 eulerAngles를 사용한 것과 동일한 효과를 낼 수 있다.
Quaternion을 활용한 회전 방법
transform.rotation = Quaternion.AngleAxis(90, Vector3.up);
위 코드는 Y 축을 기준으로 90도 회전시킨다.
Quaternion startRotation = transform.rotation;
Quaternion endRotation = Quaternion.Euler(0, 180, 0);
transform.rotation = Quaternion.Lerp(startRotation, endRotation, 0.5f);
위 코드는 현재 회전과 목표 회전값 사이에서 50% 정도 회전하는 효과를 낸다.
Quaternion을 사용할 때의 장점
Quaternion.Lerp()는 두 회전값 사이를 일정한 비율로 보간하여 부드러운 회전을 제공합니다. 주로 일정한 속도로 회전할 때 사용된다.
Quaternion startRotation = transform.rotation;
Quaternion targetRotation = Quaternion.Euler(0, 180, 0);
transform.rotation = Quaternion.Lerp(startRotation, targetRotation, Time.deltaTime);
위 코드에서는 Time.deltaTime 값을 이용하여 부드럽게 회전하게 만든다.
하지만 Lerp()는 회전 속도가 일정하게 유지되지 않는다는 단점이 있다. 목표 회전에 가까워질수록 점점 느려지게 된다.
Quaternion.Slerp()는 회전 벡터를 구면 공간에서 일정한 속도로 보간하는 방식이다. 회전 속도가 일정하게 유지되기 때문에 자연스러운 회전을 만들 때 사용된다.
Quaternion startRotation = transform.rotation;
Quaternion targetRotation = Quaternion.Euler(0, 180, 0);
transform.rotation = Quaternion.Slerp(startRotation, targetRotation, Time.deltaTime);
위 코드에서는 Lerp와 동일한 방식으로 작동하지만, 회전 속도가 일정하게 유지되기 때문에 더 자연스럽다.
Lerp vs Slerp 차이점
| 메서드 | 속성 | 사용 예시 |
|---|---|---|
| Lerp | 선형 보간 (속도가 점점 느려짐) | UI 요소 회전, 간단한 회전 애니메이션 |
| Slerp | 구면 보간 (속도가 일정) | 자연스러운 캐릭터 회전, 카메라 회전 |
transform.localRotation = Quaternion.Euler(0, 45, 0);
위 코드는 부모 오브젝트를 기준으로 회전한다.
LookAt() 함수는 특정 위치를 바라보게 할 때 사용한다.
transform.LookAt(target.position);
위 코드는 현재 오브젝트가 target을 바라보도록 설정한다.
Quaternion.LookRotation()함수는 특정 방향을 향하게 할때 사용한다.
Vector3 direction = target.position - transform.position;
transform.rotation = Quaternion.LookRotation(direction);
위 코드는 direction 방향을 향하도록 회전을 설정한다.