Lerp에 대해 알아보러 가기
1. Slerp을 사용하는 이유
Lerp의 경우 계산이 빠르지만 두 점 사이 직선을 통과하기 때문에 회전 경로가 부드럽지 못하다. 위 그림에서 보면 Lerp에서 t를 일정하게 증가 시킬때 호의 길이가 제각각 다른 것을 확인 할 수 있다.
이를 보완하기 위해서 Slerp을 사용한다.
2. Slerp(Spherical Linear Interpolation)
Lerp을 3차원 공간으로 확장한 것이다. 보간 결과로 만들어지는 방향을 반환한다.
그림은 반지름의 1인 원이다.
slerp 식
01 r = nb + ma
우리가 구해야할 r은 nb + ma이다. n과 m을 통해서 a벡터와 b벡터의 크기를 조정하면서 중간 값을 찾아 나간다.
02 n 구하기
1) h = nsinΩ
sinΩ = h / n이기 때문에 아래와 같이 쓸 수 있다.
2) h = sin(1-t)Ω
sin(1-t)Ω = h / 1 이기 때문에 아래와 같이 쓸 수 있다.
3) 최종 n에 대한 식
아래와 위의 식을 종합해서 n에대해 정리한 식이다.
02 m 구하기
1) h = msinΩ
sinΩ = h / m이기 때문에 아래와 같이 쓸 수 있다.
2) h = sin(t)Ω
그림을 확인해보면 sin(t)Ω = h / 1 이기 때문에 아래와 같이 쓸 수 있다.
3) 최종 m에 대한 식
아래와 위의 식을 종합해서 m에대해 정리한 식이다.
03 최종식
위에서 구한 n과 m에 대한 식을 대입 하면
최종식이 나온다.
3. Unity에서의 Slerp
Slerp을 사용하면 오브젝트를 부드럽게 회전시킬 수 있다.
public static Quaternion Slerp (Quaternion a, Quaternion b, float t);
매개변수
a - 시작 Quaternion 회전 값
b - 도착 Quaternion 회전 값
t - 보간 값(0~1) t가 0에 가까울수록 a에가까워지며 1에 가까울수록 b에 가까워 진다.
반환
보간 결과로 만들어지는 방향을 나타내는 Quaternion
예시
Quaternion.Slerp(transform.rotation, targetRotation, 0.2f);
현재 오브젝트의 회전 값 transform.rotation에서 targetRotation까지 보간(interpolate)하여 새로운 회전 값을 생성한다.
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - Quaternion.LookRotation() (0) | 2023.05.09 |
---|---|
Unity - 오일러(Euler) vs 쿼터니언(Quaternion) (2) | 2023.05.08 |
Unity- Vector3.ProjectOnPlane() (2) | 2023.05.08 |
Unity- Mathf.Lerp() (0) | 2023.05.07 |
Unity- Update vs FixedUpdate vs LateUpdate (0) | 2023.05.07 |
댓글