Go to IndexWhen you have some value, name it
current, and want to increment it with some constant, name it
step, you'd normally do something as simple as this:
1 | current = current + step; |
If you wanted to make sure it doesn't step further once it has reached some
target value you would do this:
07 | current = current + step; |
Not a big deal. But once I stumbled upon such piece of code:
07 | float delta = fabs (target - current) + 0.0001f; |
08 | float t = Clamp(step / delta); |
09 | current = Lerp(current, target, t); |
Turns out this code, at first glance looking quite complicated, does the same thing. So, why did the author of that code preferred it this way instead of something more simple as the solution presented in the beginning of this post? I'm not sure. Maybe because this code works correctly when we arbitrarily change
target value? For instance, the first solution won't work when
target is smaller than
current. But we can easily handle this case as well.
Anyway, I was curious to find out that if from mathematical standpoint these two approaches were identical. Here's the proof:
\begin{eqnarray}
a &=& current \cr
b &=& target \cr
s &=& step \cr
t &=& \frac{s}{b-a} \cr
\end{eqnarray}
\begin{eqnarray}
Lerp(a, b, t) = (1-t)a + tb &=& \cr
(a - \frac{s}{b-a}a) + (\frac{s}{b-a}b) &=& \cr
\frac{(b-a)a - sa + sb}{b-a} &=& \cr
\frac{(b-a)a+s(b-a)}{b-a} &=& \cr
a + s
\end{eqnarray}
So, to sum up, the lerp way results in simple incrementation of
a with
s.
No comments:
Post a Comment