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; }
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 Immediate(Quaternion q0, Quaternion q1, Quaternion q2) { // assert: Q0, Q1, Q2 all unit-length var q1inv = q1.Conjugate(); var p0 = q1inv.Mult(q0); var p2 = q1inv.Mult(q2); var arg = (p0.Log().Add(p2.Log())).Mult(-0.25); return q1.Mult(arg.Exp()); }