@Override
    protected void kinematicUpdate(float tpf) {
        assert tpf >= 0f : tpf;
        assert getRigidBody().isKinematic();

        Transform transform = new Transform();

        if (endModelTransform != null) {
            /*
             * For a smooth transition, blend the saved model transform
             * (from the start of the blend interval) into the goal transform.
             */
            transform.interpolateTransforms(startModelTransform.clone(),
                    endModelTransform, kinematicWeight());
            getControl().getSpatial().setLocalTransform(transform);
        }

        for (int mbIndex = 0; mbIndex < managedBones.length; ++mbIndex) {
            Joint managedBone = managedBones[mbIndex];
            switch (submode) {
                case Animated:
                    transform.set(managedBone.getLocalTransform());
                    break;
                case Frozen:
                    transform.set(prevBoneTransforms[mbIndex]);
                    break;
                default:
                    throw new IllegalStateException(submode.toString());
            }

            if (kinematicWeight() < 1f) { // not purely kinematic yet
                /*
                 * For a smooth transition, blend the saved bone transform
                 * (from the start of the blend interval)
                 * into the goal transform.
                 */
                transform.interpolateTransforms(
                        startBoneTransforms[mbIndex].clone(), transform,
                        kinematicWeight());
            }
            /*
             * Update the managed bone.
             */
            managedBone.setLocalTransform(transform);
            managedBone.updateModelTransforms();
        }

        super.kinematicUpdate(tpf);
    }
Update this link in blended Kinematic mode.

@param tpf the time interval between frames (in seconds, &ge;0)
jme3-jbullet/src/main/java/com/jme3/bullet/animation/TorsoLink.java