예제 #1
0
        /// <summary>
        /// Interpolates this transform to the other `transform` by `weight`.
        /// </summary>
        /// <param name="transform">The other transform.</param>
        /// <param name="weight">A value on the range of 0.0 to 1.0, representing the amount of interpolation.</param>
        /// <returns>The interpolated transform.</returns>
        public Transform3D InterpolateWith(Transform3D transform, real_t weight)
        {
            /* not sure if very "efficient" but good enough? */

            Vector3    sourceScale    = basis.Scale;
            Quaternion sourceRotation = basis.GetRotationQuaternion();
            Vector3    sourceLocation = origin;

            Vector3    destinationScale    = transform.basis.Scale;
            Quaternion destinationRotation = transform.basis.GetRotationQuaternion();
            Vector3    destinationLocation = transform.origin;

            var interpolated = new Transform3D();

            interpolated.basis.SetQuaternionScale(sourceRotation.Slerp(destinationRotation, weight).Normalized(), sourceScale.Lerp(destinationScale, weight));
            interpolated.origin = sourceLocation.Lerp(destinationLocation, weight);

            return(interpolated);
        }