본문 바로가기
유니티 공부/Unity

Unity- Quaternion.Slerp()

by 코딩하는 돼징 2023. 5. 8.
반응형

Lerp에 대해 알아보러 가기

 

유니티 - Mathf.Lerp()

1. Lerp(Linear Interpolation) 두 값을 선형 보간(linear interpolation)하여 새로운 값을 계산 매개변수 a : 시작 값 b : 종료 값 t : a와 b 실수 값 사이의 보간 비율 반환값 a + ( b - a ) * t 예시) a = 0, b = 10, t = 0.5

code-piggy.tistory.com


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)하여 새로운 회전 값을 생성한다.

 

반응형

댓글