Lerp
선형 보간에 대해서 공부하고 유니티의 Lerp()에 대해서 정리했습니다.
Unity로 개발을 했다면 물체의 이동이나 회전을 Lerp()를 사용하여 부드럽게 만들어본 경험이 있을 것이다.
Lerp는 Linear Interpolation의 약자로 선형 보간을 의미한다.
선형 보간은 직선 상의 두 점이 주어졌을 때 그 사이의 값을 선형적으로 추론하는 방법이다.
선형 보간의 유도
다음과 같이 $(2, 2)$와 $(7, 4)$에 두 점이 주어지고 $(5.1, b)$의 $b$값을 알고 싶다고 하자.
이를 위해 먼저 구하려고 하는 점의 $x$축 비율을 알아야 한다.
$x$축 비율: $\cfrac{5.1 - 2}{7 - 2} = \cfrac{3.1}{5} = 0.62$
다음으로 $b$의 위치 비율을 알아내보자.
$b$의 위치 비율은 전체 $y$ 거리에서 $b$까지의 거리를 나눔으로써 알 수 있다.
$b$의 비율: $\cfrac{b - 2}{4 - 2} = \cfrac{b - 2}{2}$
그리고 $b$의 비율은 선형의 특징 때문에 앞서 구한 $x$축의 비율과 일치해야 한다.
$\cfrac{b-2}{2} = 0.62$
$\therefore b = 3.24$
이렇게 $b$의 값이 $3.24$임을 구할 수 있다.
사실 위에서 $b$값을 구한 과정은 선형 보간이 아닌 선형 보간의 역산이다.
하지만 위의 과정에서 선형 보간이 포함된다.
아래의 $b$값을 구하는 과정을 좀 더 일반화시켜보자.
$\cfrac{b - 2}{4 - 2} = 0.62$
여기서 $0.62$라는 비율을 $t$로 치환하고 시작 $y$값을 $u$로 끝 $y$값을 $v$로 치환해보자.
$\cfrac{b - u}{v - u} = t$
위의 식을 $b$에 대해서 정리해보자.
$b = u + (v - u)t$
그리고 이 식을 깔끔하게 정리하면 다음의 선형 보간 공식을 얻는다.
$b = (1-t)\cdot u + t \cdot v$
위에서 정리한 식에서 비율 $t$를 $[0, 1]$로 제한하면 아핀 결합의 형태를 이룬다.
아핀 결합의 정의는 다음과 같다.
$\sum_{i}\lambda_i P_i \quad with \quad \sum_{i}\lambda_i = 1$
아핀 결합으로 만들어지는 결과는 아핀 부분 공간 내부에 존재한다는 특징이 있다.
여기서 아핀 부분 공간은 두 점이 만드는 선분이므로 선형 보간의 결과는 항상 선분 위에 존재한다.
선형 보간의 구현
선형 보간은 매우 간단하게 구현할 수 있다.
앞에서 구한 다음의 식을 코드로 나타내면 된다.
$b = (1-t)\cdot u + t \cdot v$
1
2
3
4
double Lerp(double begin, double end, double t)
{
return (1 - t) * begin + t * end;
}
실제 엔진 내부에서는 이를 변형하여 다음과 같이 구현한다.
아래와 같이 구현하게 되면 연산이 줄어든다. 수학적으로는 동일하다.
1
2
3
4
double Lerp(double begin, double end, double t)
{
return begin + (end - begin) * t;
}
Unity의 선형 보간
Unity에서는 다음과 같은 다양한 선형 보간 메서드를 제공한다.
1
2
3
4
5
6
Mathf.Lerp(a, b, t);
Color.Lerp(a, b, t);
Color32.Lerp(a, b, t);
Vector2.Lerp(a, b, t);
Vector3.Lerp(a, b, t);
Vector4.Lerp(a, b, t);
실제로 아래는 Mathf.Lerp()에 대한 Unity 공식 문서를 가져온 것이다.
살펴보면 위에서 설명한 내용과 정확히 동일함을 알 수 있다.
마무리
Lerp()는 선형 보간 함수로 두 값 사이의 선형 값을 추론한다.
수학적으로는 아핀 결합의 한 형태다.
Unity에서는 부드러운 위치, 회전, 색상 변경, UI 애니메이션 등에 활용된다.


