언리얼 엔진5의 선형보간 함수에는 대표적으로 Intertp와 InterpToConstantTo가 있다.
Vector, Rotation, Float등 값의 형식에 따라 VInterpTo, RInterpTo, FInterpTo 다양한 함수가 있는데 대표적으로 FInterpTo 함수 코드를 살펴보자.
두 함수의 차이는 무엇일까??
언리얼 엔진5의 코드를 보면서 차이점에 대해 알아보자.
template<typename T1, typename T2 = T1, typename T3 = T2, typename T4 = T3>
UE_NODISCARD static auto FInterpTo( T1 Current, T2 Target, T3 DeltaTime, T4 InterpSpeed )
{
using RetType = decltype(T1() * T2() * T3() * T4());
// If no interp speed, jump to target value
if( InterpSpeed <= 0.f )
{
return static_cast<RetType>(Target);
}
// Distance to reach
const RetType Dist = Target - Current;
// If distance is too small, just set the desired location
if( FMath::Square(Dist) < UE_SMALL_NUMBER )
{
return static_cast<RetType>(Target);
}
// Delta Move, Clamp so we do not over shoot.
const RetType DeltaMove = Dist * FMath::Clamp<RetType>(DeltaTime * InterpSpeed, 0.f, 1.f);
return Current + DeltaMove;
}
FInterpTo의 코드를 보면 deltatime마다 움직이는 거리는 아래와 같다.
const RetType DeltaMove = Dist * FMath::Clamp(DeltaTime x InterpSpeed, 0.f, 1.f);
DeltaMove의 값에 영향을 주는 변수를 보면 Dist와 InterpSpeed가 있다.
Dist - 현재 지점에서 목표 지점까지의 거리
InterpSpeed - 보간 속도
다시 말해 InterpSpeed와 Dist 값이 클수록 목표에 더욱 빨리 도달한다.
InterpSpeed는 [0.f, 1.f]로 제한(Clamp)되어 있기 때문에 일정 값 이상이면 무의미하다.
그러나 Dist값은 제한이 없기 때문에, Dist값이 작아질 수록 DeltaMove 즉 DeltaTime마다 움직이는 거리는 줄어든다.
빠른 초기 이동 - 거리가 멀 때 이동 속도가 빠르다.
감속 - 목표에 가까워질수록 이동 속도가 줄어든다.
자연스러운 종료: 목표에 도달하면 부드럽게 멈춘다.
-------------------------------------------------------------------------------->
FInterpTo를 사용하면 목표 지점까지 점진적으로 감속하며 도달하는 움직임을 구현할 수 있다.
template<typename T1, typename T2 = T1, typename T3 = T2, typename T4 = T3>
UE_NODISCARD static auto FInterpConstantTo( T1 Current, T2 Target, T3 DeltaTime, T4 InterpSpeed )
{
using RetType = decltype(T1() * T2() * T3() * T4());
const RetType Dist = Target - Current;
// If distance is too small, just set the desired location
if( FMath::Square(Dist) < UE_SMALL_NUMBER )
{
return static_cast<RetType>(Target);
}
const RetType Step = InterpSpeed * DeltaTime;
return Current + FMath::Clamp(Dist, -Step, Step);
}
FInterpConstantTo는 FInterpTo와 달리 거리에 비례하지 않는 고정된 속도로 목표 지점까지 이동하도록 설계된 함수이다.
만약 FInterpToConstantTo 함수를 이용한다면 이동 속도를 일정하게 유지하며, 목표 지점에 정확히 도달할 수 있다.
만약 일정 속도를 유지하면서도 지정시간 내에 목표지점에 도달하게 하고 싶다면 MoveComponentTo 함수가 더 적합하다.
FInterpTo - 부드럽게 감속하며 목표에 도달하고 싶을 때 사용.
FInterpConstantTo - 일정한 속도로 목표에 도달하고 싶을 때 사용.
MoveComponentTo - 특정 시간 안에 목표에 도달해야 할 때 적합.