Quaternion approach (Quaternion initialRotation, Quaternion finalRotation)
{
return (initialRotation + finalRotation)/2;
}

Oh that's great. Didnt think about that!

You tank example is very close to what i'm trying to do, except im trying to smooth out the feet of my characters on the ground when doing foot IK. Very similar.

My only worry about this technique is that im affraid its going to be a bit hard to predict how the smoothing will look using different timesteps.But it might be ok.

After posting, I started to look at the quaternion slerp math. Turns out it computes the angle between the quaternions and figures out the coefficients to use to lerp the quaternions. I wrote another version of slerp() that instead of taking a time (t) parameter, takes a maximum interpolation angle. This maximum angle is then used to clamp the angle between the quaternions and is used to compute t, if needed.

For reference, this is the barebones version of the slerp in Ogre (i removed a bunch of stuff for simplicity):

Quaternion Quaternion::Slerp (Real fT, const Quaternion& rkP, const Quaternion& rkQ)
{
Real fCos = rkP.Dot(rkQ);
Real fSin = Math::Sqrt(1 - Math::Sqr(fCos));
Radian fAngle = Math::ATan2(fSin, fCos);
Real fInvSin = 1.0f / fSin;
Real fCoeff0 = Math::Sin((1.0f - fT) * fAngle) * fInvSin;
Real fCoeff1 = Math::Sin(fT * fAngle) * fInvSin;
return fCoeff0 * rkP + fCoeff1 * rkQ;
}

And, a simplified versin of what i did:

Quaternion Quaternion::SlerpLimit (const Quaternion& rkP, const Quaternion& rkQ, Radian maxAngle)
{
Real fCos = rkP.Dot(rkQ);
Real fSin = Math::Sqrt(1 - Math::Sqr(fCos));
Radian fAngle = Math::ATan2(fSin, fCos);
// Clamp angle if needed, and figure out time parameter.
float fT = 1.0f;
if (maxAngle.valueRadians() > 0)
{
fT = std::min(1.0f, maxAngle.valueRadians() / fAngle.valueRadians());
fAngle = std::min(maxAngle, fAngle);
}
Real fInvSin = 1.0f / fSin;
Real fCoeff0 = Math::Sin((1.0f - fT) * fAngle) * fInvSin;
Real fCoeff1 = Math::Sin(fT * fAngle) * fInvSin;
return fCoeff0 * rkP + fCoeff1 * rkQ;
}

Seem to work fine so far... (fingers crossed)

-Mat