@Override
    public void getDataAtTime(double t, Transform transform) {
        float time = (float) t;

        int lastFrame = times.length - 1;
        if (time < 0 || lastFrame == 0) {
            if (translations != null) {
                translations.get(0, transform.getTranslation());
            }
            if (rotations != null) {
                rotations.get(0, transform.getRotation());
            }
            if (scales != null) {
                scales.get(0, transform.getScale());
            }
            return;
        }

        int startFrame = 0;
        int endFrame = 1;
        float blend = 0;
        if (time >= times[lastFrame]) {
            // extrapolate beyond the final keyframe of the animation
            startFrame = lastFrame;

            float inferredInterval = times[lastFrame] - times[lastFrame - 1];
            if (inferredInterval > 0f) {
                blend = (time - times[startFrame]) / inferredInterval;
            }

        } else {
            // use lastFrame so we never overflow the array
            int i;
            for (i = 0; i < lastFrame && times[i] < time; i++) {
                startFrame = i;
                endFrame = i + 1;
            }
            blend = (time - times[startFrame])
                    / (times[endFrame] - times[startFrame]);
        }

        FrameInterpolator fi = (interpolator == null)
                ? FrameInterpolator.getThreadDefault() : interpolator;
        Transform interpolated = fi.interpolate(
                blend, startFrame, translations, rotations, scales, times);

        if (translations != null) {
            transform.setTranslation(interpolated.getTranslation());
        }
        if (rotations != null) {
            transform.setRotation(interpolated.getRotation());
        }
        if (scales != null) {
            transform.setScale(interpolated.getScale());
        }
    }
Sets the translations, rotations, and/or scales.

@param times        the desired time for each keyframe,
                    or null to leave the times unchanged
@param translations the desired translation of the target for each
                    keyframe (same length as times)
                    or null to leave the translations unchanged
@param rotations    the desired rotation of the target for each keyframe
                    (same length as times)
                    or null to leave the rotations unchanged
@param scales       the desired scale of the target for each keyframe
                    (same length as times)
                    or null to leave the scales unchanged
jme3-core/src/main/java/com/jme3/anim/TransformTrack.java