[Unity] 선형보간 Lerp 함수와 유니티에서의 선형보간 활용 사례(Alpha Blending, iTween)

728x90

선형보간 (Lerp)

선형 보간(Linear Interpolation)이란 두 점 a, b 사이의 값(c)를 구하기 위해 a-b 두 점을 연결한 직선을 만들어 사이 값을 계산하는 방법이다.

유니티에서 Lerp는 선형 보간을 사용하여 부드러운 움직임을 표현하기 위해 Update()에서 넣어 사용하거나, 두 image를 blend 해서 하나의 material로 만들 때 주로 사용한다.

Mathf.Lerp(float a, float b, float t)

 

Lerp는 a, b 사이의 t(0 ~ 1) 만큼 위치한 값 c를 위와 같은 선형 보간 공식을 통해 구해준다.

여기서 t는 percet의 개념(0 ~ 1)이기 때문에 t = 0이면 a, t = 1이면 b와 같다. 

 

void Update()
	a = Mathf.Lerp(a, b, 0.5f);

Lerp를 사용하여 부드러운 움직임을 만드는 방법은 t의 값을 0.5로 설정해 a-b 이동 구간의 절반만큼을 지속적으로 이동해주는 것이다. Update() 함수가 호출되는 동안 매 프레임마다 c의 위치는 위 그림과 같이 움직일 것이고, 목표 지점에 근접할 수록 더욱 부드러운 움직임을 나타내게 된다.

 

float speed = 2f;
void Update()
	a = Mathf.Lerp(a, b, Time.deltaTime * speed);

Lerp() 함수에서 t의 값은 특정한 인자가 아니라, Time.deltaTime 이용해서 선언해주기도 한다. Time.deltaTime은 단위 프레임 당 시간 변화량을 의미하는데 보통 0.016초 ~ 0.18초 사이의 값을 가진다. Update() 함수 호출 시, PC 사양과 성능 또는 인터넷 환경에 따라 일정하지 않는 프레임 간 시간 간격이 발생할 수 있다. 그런 경우 고정 인자값을 넘겼을 때 불규칙한 움직임으로 인해 간격의 오차가 발생하게 된다. 그러한 문제를 해결하기 위해 Time.deltaTime으로 각 프레임의 정확한 시간 변화량을 구해 정확한 이동 변화량을 계산하게 된다. 더욱이 speed 변수 값을 곱해주어 좀더 빠르거나 느리게 움직임을 조정할 수 있다.

 

※ t 값을 Time.deltaTime으로 받아올 경우 b 목표값(1)에 영원히 도달하지 못하고 0.9999999....에서 값이 멈추게 된다. 따라서 목표값에 도달했는지 여부를 파악하려면 " c == 1 "이 아닌, " c >= 0.99999f " 와 같이 최소한의 오차를 포함하여 판단해야 한다.    

 

Lerp의 활용도

시간에 따라 초기 위치에서 목적지까지 일정한 시간에 도달하기 위해서도 Lerp()함수를 사용하긴 한다.

currentTime += Time.deltaTime;
Vector3.Lerp(transform.position, target.position, currentTime / 2);

t 값이 100%이면 완벽하게 도달한 것을 의미한다. 즉, currentTime을 0, 1, 2처럼 계속 늘려주고 / 2 해주면 1, 결국 100%가 된다. 이런 경우 반드시 해당 시간까지 도착해야하는 경우 사용하는데 리듬게임에서 노트를 찍을 때 사용된다. 

 

알파블렌딩에서 Lerp 공식의 사용

// 알파블렌딩
(1 - a) * s + a * T

RBGA 채널에서 두가지 색을 섞을 때도 다음과 같은 Lerp 함수 공식을 사용한다. 1-a 가 0이면 기본 색이지만 점점 숫자가 커짐에 따라 두가지 색상이 섞이는 것을 표현한다. 색상을 섞을 때 몇 퍼센트 비율로 섞을 지에 대해 고민할 때 사용한다. 이를 응용하면 씬 전환 시 Fade In / Fade Out 기능으로 구현할 수 있다.

 

 

EASING IN / EASING OUT, ITWEEN을 이용한 물체의 이동

애니메이션에서 동작 움직임에서도 Lerp 함수를 응용해 다양한 이동을 표현한다.

728x90