I discovered a GDC talk on a topic called: Asymptotic Averaging. This is sort of a form of interpolation, and can be used to eliminate jerky motions – in particular, they focus on camera movement. Naturally, when you want to change a camera’s direction, you just set the direction. However, if you are doing this frequently or if the distance is large, it results in a jerk or jump which can be disorienting to some extent. This is demonstrated easily by having a camera follow a player character.
Here’s a video of a jerky camera from my current project:
Asymptotic means always approaching a destination but never reaching it. In math it occurs as a curve approaches an asymptote but never actually reaches it. Besides being easy to implement, we get a curve to our movement as well.
The easy to implement concept is from the following form:
//changeMultiplier = 0.01f;
void translate( const Vector3& destination ){
offsetPosition = destination - camera->currentPosition;
}
void reduce(Vector3& position) {
position = offsetPosition;
position *= changeMultiplier;
offsetPosition *= (1 - changeMultiplier);
}
void update(){
Vector3 position;
reduce(position)
camera->translate( position )
}
In this variation we are working with a translation. What happens is offsetPosition is set to the translation offset (dest-current). Then each update (frame) we call reduce, which returns a smaller amount of the translation to perform each time. This translation continues to shrink and approaches zero.
Using variations of this, it is easy to produce Trailing and Leading Asymptotic Movement.
Here’s a vid of Trailing Camera Rotation + Trailing Camera Movement:
Here’s a vid of Leading Camera Rotation + Trailing Camera Movement: