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.

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 )

Page Links


Special Pages


Wikis

?

Render Time: 42ms

DB GetPage 4
Generate Html 14
SaveChanges (1) 9
Render Body 0
Render Sidebar 12