Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
 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());
 }