Garry's Mod Wiki

Lerp

  number Lerp( number t, number from, number to )

Description

Performs a linear interpolation from the start number to the end number.

This function provides a very efficient and easy way to smooth out movements.

See also math.ease for functions that allow to have non linear animations using linear interpolation.

This function is not meant to be used with constant value in the first argument if you're dealing with animation! Use a value that changes over time. See example for proper usage of Lerp for animations.

Arguments

1 number t
The fraction for finding the result. This number is clamped between 0 and 1. Shouldn't be a constant.
2 number from
The starting number. The result will be equal to this if delta is 0.
3 number to
The ending number. The result will be equal to this if delta is 1.

Returns

1 number
The result of the linear interpolation, from + (to - from) * t.

Example

Example of simple Lerp usage for animations.

local start = SysTime() hook.Add( "HUDPaint", "LerpAnimation", function() draw.RoundedBox( 4, 100, 100, Lerp( SysTime() - start, 0, 100 ), 20, color_white ) if SysTime() - start > 2 then start = SysTime() end end )

Example

Advanced example of Lerp animation: A health bar that will smooth the health change over 0.5 seconds to reach new health value from the previous value.

local start, oldhp, newhp = 0, -1, -1 local barW = 200 local animationTime = 0.5 -- seconds hook.Add( "HUDPaint", "LerpAnimation", function() -- Local player still loading, do nothing if ( !IsValid( LocalPlayer() ) ) then return end local hp = LocalPlayer():Health() local maxhp = LocalPlayer():GetMaxHealth() -- The values are not initialized yet, do so right now if ( oldhp == -1 and newhp == -1 ) then oldhp = hp newhp = hp end -- You can use a different smoothing function here local smoothHP = Lerp( ( SysTime() - start ) / animationTime, oldhp, newhp ) -- Health was changed, initialize the animation if newhp ~= hp then -- Old animation is still in progress, adjust if ( smoothHP ~= hp ) then -- Pretend our current "smooth" position was the target so the animation will -- not jump to the old target and start to the new target from there newhp = smoothHP end oldhp = newhp start = SysTime() newhp = hp end draw.RoundedBox( 4, 100, 200, barW, 100, color_black ) draw.RoundedBox( 4, 100, 200, math.max( 0, smoothHP ) / maxhp * barW, 100, color_white ) end )