Unity

헷갈리는 오브젝트 회전 방법 Part 2 (Lerp, Slerp, RotateTowards)

코샵 2023. 11. 22. 10:55
반응형

Quaternion.Lerp()

Quaternion.Lerp() 메서드는 두 쿼터니언 사이의 선형 보간을 수행합니다. 이는 사이를 직선으로 연결하는 것과 유사합니다. 방법은 보간 속도가 일정하기 때문에 빠르지만, 이러한 선형 보간은 짧은 거리에서는 작동하지만 거리에서는 비현실적으로 보일 있습니다.

Quaternion.Lerp() 메서드의 구문은 다음과 같습니다.

Quaternion.Lerp(Quaternion from, Quaternion to, float t);
// from 시작 쿼터니언
// to 목표 쿼터니언
// t 보간 비율 0 - 1

Quaternion.Lerp() 메서드는 다음과 같이 작동합니다.

  1. 시작 쿼터니언과 종료 쿼터니언의 차이를 구합니다.
  2. 차이를 보간 비율 (t)만큼 곱합니다.
  3. 결과를 시작 쿼터니언에 더합니다.

Quaternion.Lerp() 메서드는 부드럽게 회전하기 위해 사용할 수 있습니다. 예를 들어, 다음과 같이 코드를 작성하면 원래 쿼터니언에서 타겟 쿼터니언으로 부드럽게 회전할 수 있습니다.

Quaternion rotation = Quaternion.Lerp(originalRotation, targetRotation, Time.deltaTime);

 

Quaternion.Slerp()

Quaternion.Slerp() 메서드는 두 쿼터니언 사이를 구형으로 보간합니다. 이는 보간이 사이의 가장 짧은 경로를 따르도록 보장하므로, 보간이 자연스럽게 보이는 효과가 있습니다. 하지만 방법은 계산이 복잡해서 Lerp보다 느릴 있습니다.

Quaternion.Slerp(Quaternion from, Quaternion to, float t);
// from 시작 쿼터니언
// to 목표 쿼터니언 
// t 보간 비율 0 -1

 

Quaternion.Slerp() 메서드는 다음과 같이 작동합니다.

  1. 시작 쿼터니언과 종료 쿼터니언의 차이를 구합니다.
  2. 차이를 로그 스플라인 함수로 변환합니다.
  3. 변환된 차이를 보간 비율 (t)만큼 곱합니다.
  4. 결과를 로그 스플라인 함수로 역변환합니다.
  5. 결과를 시작 쿼터니언에 더합니다.

Quaternion.RotateTowards()

이전 포스팅에서 설명한 부분은 생략하겠습니다.

 

Quaternion.RotateTowards() 메서드는 다음과 같이 작동합니다.

  1. 시작 쿼터니언과 종료 쿼터니언의 차이를 구합니다.
  2. 차이의 크기가 maxAngle보다 작으면, 종료 쿼터니언을 반환합니다.
  3. 차이의 크기가 maxAngle보다 크면, 다음과 같은 과정을 반복합니다.
  4. 생성된 쿼터니언을 반환합니다.

Quaternion.RotateTowards() 메서드는 두 회전 사이를 보간하면서 프레임당 최대 각도를 지정할 있습니다. 이는 회전 속도를 제한하는 유용합니다. 예를 들어, 공이 플레이어를 바라보도록 회전하게 하고 싶지만, 공이 즉시 회전하는 것을 원하지 않는 경우에 사용할 있습니다.

 

각 메서드의 특징 

메서드 특징
Lerp 빠른 속도  
Slerp Lerp보다 느린 속도 회전이 부드러움
RotateTowards 가장 빠른 속도  회전 속도 제한 가능

 

어떤 메서드를 사용해야 할까요?

어떤 메서드를 사용할지는 게임의 특성에 따라 다릅니다.

  • 회전이 부드럽게 이루어져야 하는 경우 Quaternion.Slerp() 메서드를 사용합니다.
  • 회전이 부드럽지 않아도 되는 경우 Quaternion.Lerp() 메서드나 Quaternion.RotateTowards() 메서드를 사용합니다.
  • 속도가 중요한 경우 Quaternion.RotateTowards() 메서드를 사용합니다.

예를 들어, 캐릭터가 부드럽게 회전해야 하는 경우에는 Quaternion.Slerp() 메서드를 사용합니다. 반면, 캐릭터가 빠르게 회전해야 하는 경우에는 Quaternion.RotateTowards() 메서드를 사용합니다.