/// <summary> /// Linear Interpolation /// </summary> /// <param name="start">Start</param> /// <param name="end">End</param> /// <param name="interpolation">Value from 0 to 1</param> /// <returns>Matrix</returns> public static Matrix Lerp(AnimationData start, AnimationData end, float interpolation) { Quaternion q = Quaternion.Slerp(start.Rotation, end.Rotation, interpolation); Vector3 s = Vector3.Lerp(start.Scaling, end.Scaling, interpolation); Vector3 t = Vector3.Lerp(start.Translation, end.Translation, interpolation); return Matrix.Scaling(s) * Matrix.RotationQuaternion(q) * Matrix.Translation(t); }
/// <summary> /// Bezier Interpolation /// </summary> /// <param name="start">Start</param> /// <param name="end">End</param> /// <param name="tangent_in">Input Tangent</param> /// <param name="tangent_out">Output Tangent</param> /// <param name="interpolation">Value from 0 to 1</param> /// <returns>Matrix</returns> public static Matrix Bezier(AnimationData start, AnimationData end, AnimationData tangent_in, AnimationData tangent_out, float interpolation) { //F=P0*(1-s)^3 + 3C0 s(1-s)^2 + 3C1 s^2(1-s) + Ps^3 float p0 = (1 - interpolation) * (1 - interpolation) * (1 - interpolation); float p1 = 3 * interpolation * (1 - interpolation) * (1 - interpolation); float p2 = 3 * interpolation * interpolation * (1 - interpolation); float p3 = interpolation * interpolation * interpolation; Quaternion q = p0 * start.Rotation + p1 * tangent_out.Rotation + p2 * tangent_in.Rotation + p3 * end.Rotation; Vector3 s = p0 * start.Scaling + p1 * tangent_out.Scaling + p2 * tangent_in.Scaling + p3 * end.Scaling; Vector3 t = p0 * start.Translation + p1 * tangent_out.Translation + p2 * tangent_in.Translation + p3 * end.Translation; return Matrix.Scaling(s) * Matrix.RotationQuaternion(q) * Matrix.Translation(t); }
/// <summary> /// Bezier Interpolation /// </summary> /// <param name="start">Start</param> /// <param name="end">End</param> /// <param name="tangent_in">Input Tangent</param> /// <param name="tangent_out">Output Tangent</param> /// <param name="interpolation">Value from 0 to 1</param> /// <returns>Matrix</returns> public static Matrix Bezier(AnimationData start, AnimationData end, AnimationData tangent_in, AnimationData tangent_out, float interpolation) { //F=P0*(1-s)^3 + 3C0 s(1-s)^2 + 3C1 s^2(1-s) + Ps^3 float p0 = (1 - interpolation) * (1 - interpolation) * (1 - interpolation); float p1 = 3 * interpolation * (1 - interpolation) * (1 - interpolation); float p2 = 3 * interpolation * interpolation * (1 - interpolation); float p3 = interpolation * interpolation * interpolation; Quaternion q = p0 * start.Rotation + p1 * tangent_out.Rotation + p2 * tangent_in.Rotation + p3 * end.Rotation; Vector3 s = p0 * start.Scaling + p1 * tangent_out.Scaling + p2 * tangent_in.Scaling + p3 * end.Scaling; Vector3 t = p0 * start.Translation + p1 * tangent_out.Translation + p2 * tangent_in.Translation + p3 * end.Translation; return(Matrix.Scaling(s) * Matrix.RotationQuaternion(q) * Matrix.Translation(t)); }