Often times in game development, you have situations where you want an object to move from one place to another, you want something to grow or shrink from one size to another, you want a color to change from A to B, or any other one of the myriad tasks where you want to do something from A to B over time (or over distance).
That’s pretty abstract but let’s take some examples:
- You want to move a camera along a straight line from A to B
- You want to raise the lighting from dark to bright in a room
- When the player clicks an icon, you want to grow a window from small to big
- You want to cross fade one skeletal animation to another via the blend weights of the animations (an example from my Anatomy of a Skeletal Animation System articles)
- You want to use a gradient in a shader for some effect.
When you are doing these things, it’s real easy to take a percent based on time or distance and just use that percent raw to make a linear effect. Often times a linear effect just isn’t good enough though because it looks or feels mechanical instead of organic, and unpolished.
Often times the way these things are softened and made more organic is by giving a content creator a curve editor so that they can soften the edges, speed up or slow down the processes over time or distance.
Many game engines don’t come with curve editors that can be easily used for these purposes, and other times you just want to deal with it in code for one reason or another, so don’t have the luxury of giving a content creator carte blanche with a curve editor.
There are a couple techniques for handling these situations but I want to talk to you about 2 of my favorite techniques, which are Ken Perlin’s bias and gain functions. I actually use Christophe Schlick’s faster approximation functions (as seen in game programming gems 2), but the end result is the same thing.
If you want to skip ahead and see these things in action, I made an interactive demonstration about these functions, check em out! HTML5 Bias and gain
Bias – Not as in bigotry
The bias function takes in a number between 0 and 1 as input (I like to think of this as the percent) and also takes a number between 0 and 1 as the “tuning parameter” which defines how the function will bend your curve.
With a value of 0.5, the percent you put in is the percent you get out (so is linear), but if you put in a number > 0.5 or < 0.5, that’s when the interesting things happen.
Shown here are graphs of the bias function with parameters of 0.5, 0.25, 0.75 and 0.97:
return (time / ((((1.0/bias) - 2.0)*(1.0 - time))+1.0));
Gain – Not as in my weight during the holidays
The gain function is like bias in that it takes in both a 0 to 1 input (I think of this as the percent as well) and also takes a number between 0 and 1 as the “tuning parameter”.
Again, with a value of 0.5, the percent you put in is the percent you get out (again, this makes it linear) but if you put in other numbers, you get interesting curves.
Here are graphs of the gain function with the same parameters of 0.5, 0.25, 0.75 and 0.97:
if(time < 0.5) return GetBias(time * 2.0,gain)/2.0; else return GetBias(time * 2.0 - 1.0,1.0 - gain)/2.0 + 0.5; }
Well that's about it, pretty straightforward stuff. Wherever you find yourself using a percent in your code, you can try passing it through a bias / gain function (and optionally exposing the tuning parameter to content creators) and see if you can make things feel a little more organic and polished.
Sometimes its the little things that make the biggest difference!
One again, the link to the interactive example of these things is at:
HTML5 Bias and Gain