private void constructAnimations() {
        // In FBX, animation are not attached to any root.
        // They are implicitly global.
        // So, we need to use heuristics to find which node(s) 
        // an animation is associated with, so we can create the AnimControl
        // in the appropriate location in the scene.
        Map<FbxToJmeTrack, FbxToJmeTrack> pairs = new HashMap<>();
        for (FbxAnimStack stack : animStacks) {
            for (FbxAnimLayer layer : stack.getLayers()) {
                for (FbxAnimCurveNode curveNode : layer.getAnimationCurveNodes()) {
                    for (Map.Entry<FbxNode, String> nodePropertyEntry : curveNode.getInfluencedNodeProperties().entrySet()) {
                        FbxToJmeTrack lookupPair = new FbxToJmeTrack();
                        lookupPair.animStack = stack;
                        lookupPair.animLayer = layer;
                        lookupPair.node = nodePropertyEntry.getKey();
                        
                        // Find if this pair is already stored
                        FbxToJmeTrack storedPair = pairs.get(lookupPair);
                        if (storedPair == null) {
                            // If not, store it.
                            storedPair = lookupPair;
                            pairs.put(storedPair, storedPair);
                        }
                        
                        String property = nodePropertyEntry.getValue();
                        storedPair.animCurves.put(property, curveNode);
                    }
                }
            }
        }
        
        // At this point we can construct the animation for all pairs ...
        for (FbxToJmeTrack pair : pairs.values()) {
            if (pair.countKeyframes() == 0) {
                continue;
            }
            String animName = pair.animStack.getName();
            float duration    = pair.animStack.getDuration();
            
            //System.out.println("ANIMATION: " + animName + ", duration = " + duration);
            //System.out.println("NODE: " + pair.node.getName());
            
            duration = pair.getDuration();
            
            if (pair.node instanceof FbxLimbNode) {
                // Find the spatial that has the skeleton for this limb.
                FbxLimbNode limbNode = (FbxLimbNode) pair.node;
                Bone bone = limbNode.getJmeBone();
                Spatial jmeSpatial = limbNode.getSkeletonHolder().getJmeObject();
                Skeleton skeleton = limbNode.getSkeletonHolder().getJmeSkeleton();
                
                // Get the animation control (create if missing).
                AnimControl animControl = jmeSpatial.getControl(AnimControl.class);
                if (animControl.getSkeleton() != skeleton) {
                    throw new UnsupportedOperationException();
                }
                
                // Get the animation (create if missing).
                Animation anim = animControl.getAnim(animName);
                if (anim == null) { 
                    anim = new Animation(animName, duration);
                    animControl.addAnim(anim);
                }
                
                // Find the bone index from the spatial's skeleton.
                int boneIndex = skeleton.getBoneIndex(bone);
                
                // Generate the bone track.
                BoneTrack bt = pair.toJmeBoneTrack(boneIndex, bone.getBindInverseTransform());
                
                // Add the bone track to the animation.
                anim.addTrack(bt);
            } else {
                // Create the spatial animation
                Animation anim = new Animation(animName, duration);
                anim.setTracks(new Track[]{ pair.toJmeSpatialTrack() });

                // Get the animation control (create if missing).
                Spatial jmeSpatial = pair.node.getJmeObject();
                AnimControl animControl = jmeSpatial.getControl(AnimControl.class);
                
                if (animControl == null) { 
                    animControl = new AnimControl(null);
                    jmeSpatial.addControl(animControl);
                }
                
                // Add the spatial animation
                animControl.addAnim(anim);
            }
        }
    }
Updates world transforms and bind poses for the FBX scene graph.
jme3-plugins/src/fbx/java/com/jme3/scene/plugins/fbx/FbxLoader.java