Quaternion.Lerp()
Quaternion.Lerp() 메서드는 두 쿼터니언 사이의 선형 보간을 수행합니다. 이는 두 점 사이를 직선으로 연결하는 것과 유사합니다. 이 방법은 보간 속도가 일정하기 때문에 빠르지만, 이러한 선형 보간은 짧은 거리에서는 잘 작동하지만 긴 거리에서는 비현실적으로 보일 수 있습니다.
Quaternion.Lerp() 메서드의 구문은 다음과 같습니다.
Quaternion.Lerp(Quaternion from, Quaternion to, float t);
// from 시작 쿼터니언
// to 목표 쿼터니언
// t 보간 비율 0 - 1
Quaternion.Lerp() 메서드는 다음과 같이 작동합니다.
- 시작 쿼터니언과 종료 쿼터니언의 차이를 구합니다.
- 차이를 보간 비율 (t)만큼 곱합니다.
- 결과를 시작 쿼터니언에 더합니다.
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() 메서드는 다음과 같이 작동합니다.
- 시작 쿼터니언과 종료 쿼터니언의 차이를 구합니다.
- 차이를 로그 스플라인 함수로 변환합니다.
- 변환된 차이를 보간 비율 (t)만큼 곱합니다.
- 결과를 로그 스플라인 함수로 역변환합니다.
- 결과를 시작 쿼터니언에 더합니다.
Quaternion.RotateTowards()
이전 포스팅에서 설명한 부분은 생략하겠습니다.
Quaternion.RotateTowards() 메서드는 다음과 같이 작동합니다.
- 시작 쿼터니언과 종료 쿼터니언의 차이를 구합니다.
- 차이의 크기가 maxAngle보다 작으면, 종료 쿼터니언을 반환합니다.
- 차이의 크기가 maxAngle보다 크면, 다음과 같은 과정을 반복합니다.
- 생성된 쿼터니언을 반환합니다.
Quaternion.RotateTowards() 메서드는 두 회전 사이를 보간하면서 한 프레임당 최대 각도를 지정할 수 있습니다. 이는 회전 속도를 제한하는 데 유용합니다. 예를 들어, 공이 플레이어를 바라보도록 회전하게 하고 싶지만, 공이 즉시 회전하는 것을 원하지 않는 경우에 사용할 수 있습니다.
각 메서드의 특징
메서드 | 특징 | |
Lerp | 빠른 속도 | |
Slerp | Lerp보다 느린 속도 | 회전이 부드러움 |
RotateTowards | 가장 빠른 속도 | 회전 속도 제한 가능 |
어떤 메서드를 사용해야 할까요?
어떤 메서드를 사용할지는 게임의 특성에 따라 다릅니다.
- 회전이 부드럽게 이루어져야 하는 경우 Quaternion.Slerp() 메서드를 사용합니다.
- 회전이 부드럽지 않아도 되는 경우 Quaternion.Lerp() 메서드나 Quaternion.RotateTowards() 메서드를 사용합니다.
- 속도가 중요한 경우 Quaternion.RotateTowards() 메서드를 사용합니다.
예를 들어, 캐릭터가 부드럽게 회전해야 하는 경우에는 Quaternion.Slerp() 메서드를 사용합니다. 반면, 캐릭터가 빠르게 회전해야 하는 경우에는 Quaternion.RotateTowards() 메서드를 사용합니다.
'Unity' 카테고리의 다른 글
간단하게 오브젝트 간의 각도 구하는 방법 (0) | 2023.11.24 |
---|---|
Vector3 : Lerp, SmoothDamp, MoveTowards 비교 (0) | 2023.11.23 |
시야 범위에 타켓 오브젝트가 들어와 있는지 확인하는 방법 (0) | 2023.11.21 |
C# 프로젝트 파일이 열리지 않을 때 (VSCode) (0) | 2023.11.21 |
헷갈리는 오브젝트 회전 방법 Part 1 (LookRotation, LookAt, RotateTowards) (0) | 2023.11.20 |