public static Quaternion SlerpExtraSpins(double t, Quaternion p, Quaternion q, int extraSpins) { var cos = p.Dot(q); var angle = System.Math.Acos(cos); if (System.Math.Abs(angle) > 0) { var sin = System.Math.Sin(angle); var phase = System.Math.PI * extraSpins * t; var invSin = 1 / sin; var coeff0 = System.Math.Sin((1 - t) * angle - phase) * invSin; var coeff1 = System.Math.Sin(t * angle + phase) * invSin; return p.Mult(coeff0).Add(q.Mult(coeff1)); } return p; }
public static Quaternion Slerp(double t, Quaternion p, Quaternion q) { var cos = p.Dot(q); var angle = System.Math.Acos(cos); if (System.Math.Abs(angle) > 0) { var sin = System.Math.Sin(angle); var invSin = 1 / sin; var coeff0 = System.Math.Sin((1 - t) * angle) * invSin; var coeff1 = System.Math.Sin(t * angle) * invSin; return p.Mult(coeff0).Add(q.Mult(coeff1)); } return p; }