Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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));
        }