public static Quaternion Slerp( Real time, Quaternion quatA, Quaternion quatB, bool useShortestPath )
{
Real cos = quatA.Dot( quatB );
Real angle = (Real)Utility.ACos( cos );
if ( Utility.Abs( angle ) < EPSILON )
{
return quatA;
}
Real sin = Utility.Sin( angle );
Real inverseSin = 1.0f / sin;
Real coeff0 = Utility.Sin( ( 1.0f - time ) * angle ) * inverseSin;
Real coeff1 = Utility.Sin( time * angle ) * inverseSin;
Quaternion result;
if ( cos < 0.0f && useShortestPath )
{
coeff0 = -coeff0;
// taking the complement requires renormalisation
Quaternion t = coeff0 * quatA + coeff1 * quatB;
t.Normalize();
result = t;
}
else
{
result = ( coeff0 * quatA + coeff1 * quatB );
}
return result;
}