Unity 공부 (6)

도토코·2025년 2월 18일

Unity공부

목록 보기
6/22

Rotation

유니티에서 rotation(회전)은 오브젝트가 공간에서 어떻게 회전하는지를 나타내는 개념이다. 기본적으로 유니티에서는 Euler 각도와 Quaternion(쿼터니언) 두 가지 방식으로 회전을 다룰 수 있다.


Eular 각도(Vector3)

Euler 각도는 (X, Y, Z) 형태로 회전을 표현하는 방식이다. 우리가 흔히 사용하는 3D공간에서의 Pitch(상하), Yaw(좌우), Roll(회전) 개념과 연결된다.

transform.eulerAngles = new Vector3(0, 90, 0);

위 코드는 Y 축을 기준으로 오브젝트를 90도 회전시킨다.

Euler 각도의 문제점: 짐벌 락(Gimbal Lock)

Euler 각도 방식은 특정한 각도에서 회전 축이 겹쳐지면서 일부 축이 비활성화되는 짐벌 락(Gimbal Lock) 문제가 발생할 수 있다. 이는 특정 각도로 회전할 때 축이 하나 사라져 더 이상 올바른 회전을 적용할 수 없는 상태를 의미한다.

Euler 각도를 사용할 때의 주의점

  • 0~360도 사이의 값을 가지며, 회전 값이 초과되면 자동으로 변환된다.
  • eulerAngles 값을 직접 변경하면 짐벌 락이 발생할 수 있다.
  • 회전 순서(Order of Rotation)에 따라 결과가 달라질 수 있다.

Quaternion

쿼터니언은 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을 사용할 때의 장점

  • 짐벌 락이 발생하지 않음
  • 부드러운 회전이 가능함
  • 회전 연산이 상대적으로 빠름

Lerp(선형 보간) & Slerp(구면 선형 보간)

Lerp (Linear Interpolation)

Quaternion.Lerp()는 두 회전값 사이를 일정한 비율로 보간하여 부드러운 회전을 제공합니다. 주로 일정한 속도로 회전할 때 사용된다.

Quaternion startRotation = transform.rotation;
Quaternion targetRotation = Quaternion.Euler(0, 180, 0);
transform.rotation = Quaternion.Lerp(startRotation, targetRotation, Time.deltaTime);

위 코드에서는 Time.deltaTime 값을 이용하여 부드럽게 회전하게 만든다.

하지만 Lerp()는 회전 속도가 일정하게 유지되지 않는다는 단점이 있다. 목표 회전에 가까워질수록 점점 느려지게 된다.

Slerp (Spherical Linear Interpolation)

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구면 보간 (속도가 일정)자연스러운 캐릭터 회전, 카메라 회전

로컬 회전 vs 월드 회전

  • transform.rotation: 월드 좌표계 기준 회전
  • transform.localRotation: 부모 오브젝트 기준 로컬 좌표계 회전
transform.localRotation = Quaternion.Euler(0, 45, 0);

위 코드는 부모 오브젝트를 기준으로 회전한다.


회전과 관련된 추가 기능

LookAt() - 특정 방향 바라보기

LookAt() 함수는 특정 위치를 바라보게 할 때 사용한다.

transform.LookAt(target.position);

위 코드는 현재 오브젝트가 target을 바라보도록 설정한다.

Quaternion.LookRotation() - 특정 방향을 향하게 하기

Quaternion.LookRotation()함수는 특정 방향을 향하게 할때 사용한다.

Vector3 direction = target.position - transform.position;
transform.rotation = Quaternion.LookRotation(direction);

위 코드는 direction 방향을 향하도록 회전을 설정한다.


profile
코(딩)(꿈)나무

0개의 댓글