Search in sources :

Example 1 with FbxAnimCurveNode

use of com.jme3.scene.plugins.fbx.anim.FbxAnimCurveNode in project jmonkeyengine by jMonkeyEngine.

the class FbxToJmeTrack method toJmeTrackInternal.

private Track toJmeTrackInternal(int boneIndex, Transform inverseBindPose) {
    float duration = animStack.getDuration();
    FbxAnimCurveNode translationCurve = animCurves.get("Lcl Translation");
    FbxAnimCurveNode rotationCurve = animCurves.get("Lcl Rotation");
    FbxAnimCurveNode scalingCurve = animCurves.get("Lcl Scaling");
    long[] fbxTimes = getKeyTimes();
    float[] times = new float[fbxTimes.length];
    // Translations / Rotations must be set on all tracks.
    // (Required for jME3)
    Vector3f[] translations = new Vector3f[fbxTimes.length];
    Quaternion[] rotations = new Quaternion[fbxTimes.length];
    Vector3f[] scales = null;
    if (scalingCurve != null) {
        scales = new Vector3f[fbxTimes.length];
    }
    for (int i = 0; i < fbxTimes.length; i++) {
        long fbxTime = fbxTimes[i];
        float time = (float) (fbxTime * FbxAnimUtil.SECONDS_PER_UNIT);
        if (time > duration) {
            // Expand animation duration to fit the curve.
            duration = time;
            System.out.println("actual duration: " + duration);
        }
        times[i] = time;
        if (translationCurve != null) {
            translations[i] = translationCurve.getVector3Value(fbxTime);
        } else {
            translations[i] = new Vector3f();
        }
        if (rotationCurve != null) {
            rotations[i] = rotationCurve.getQuaternionValue(fbxTime);
            if (i > 0) {
                if (rotations[i - 1].dot(rotations[i]) < 0) {
                    System.out.println("rotation will go the long way, oh noes");
                    rotations[i - 1].negate();
                }
            }
        } else {
            rotations[i] = new Quaternion();
        }
        if (scalingCurve != null) {
            scales[i] = scalingCurve.getVector3Value(fbxTime);
        }
        if (inverseBindPose != null) {
            applyInverse(translations[i], rotations[i], scales != null ? scales[i] : null, inverseBindPose);
        }
    }
    if (boneIndex == -1) {
        return new SpatialTrack(times, translations, rotations, scales);
    } else {
        if (scales != null) {
            return new BoneTrack(boneIndex, times, translations, rotations, scales);
        } else {
            return new BoneTrack(boneIndex, times, translations, rotations);
        }
    }
}
Also used : SpatialTrack(com.jme3.animation.SpatialTrack) BoneTrack(com.jme3.animation.BoneTrack) Quaternion(com.jme3.math.Quaternion) Vector3f(com.jme3.math.Vector3f)

Example 2 with FbxAnimCurveNode

use of com.jme3.scene.plugins.fbx.anim.FbxAnimCurveNode in project jmonkeyengine by jMonkeyEngine.

the class FbxLoader method constructAnimations.

private void constructAnimations() {
    // In FBX, animation are not attached to any root.
    // They are implicitly global.
    // So, we need to use hueristics 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<FbxToJmeTrack, FbxToJmeTrack>();
    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()) {
        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);
        }
    }
}
Also used : BoneTrack(com.jme3.animation.BoneTrack) HashMap(java.util.HashMap) FbxAnimCurveNode(com.jme3.scene.plugins.fbx.anim.FbxAnimCurveNode) AnimControl(com.jme3.animation.AnimControl) FbxNode(com.jme3.scene.plugins.fbx.node.FbxNode) Spatial(com.jme3.scene.Spatial) Animation(com.jme3.animation.Animation) FbxToJmeTrack(com.jme3.scene.plugins.fbx.anim.FbxToJmeTrack) Skeleton(com.jme3.animation.Skeleton) Bone(com.jme3.animation.Bone) FbxLimbNode(com.jme3.scene.plugins.fbx.anim.FbxLimbNode) FbxAnimLayer(com.jme3.scene.plugins.fbx.anim.FbxAnimLayer) HashMap(java.util.HashMap) Map(java.util.Map) FbxAnimStack(com.jme3.scene.plugins.fbx.anim.FbxAnimStack)

Example 3 with FbxAnimCurveNode

use of com.jme3.scene.plugins.fbx.anim.FbxAnimCurveNode in project jmonkeyengine by jMonkeyEngine.

the class FbxNode method connectObjectProperty.

@Override
public void connectObjectProperty(FbxObject object, String property) {
    // (FbxAnimCurveNode)
    if (object instanceof FbxAnimCurveNode) {
        FbxAnimCurveNode curveNode = (FbxAnimCurveNode) object;
        if (property.equals("Lcl Translation") || property.equals("Lcl Rotation") || property.equals("Lcl Scaling")) {
            List<FbxAnimCurveNode> curveNodes = propertyToAnimCurveMap.get(property);
            if (curveNodes == null) {
                curveNodes = new ArrayList<FbxAnimCurveNode>();
                curveNodes.add(curveNode);
                propertyToAnimCurveMap.put(property, curveNodes);
            }
            curveNodes.add(curveNode);
            // Make sure the curve knows about it animating
            // this node as well. 
            curveNode.addInfluencedNode(this, property);
        } else {
            logger.log(Level.WARNING, "Animating the property ''{0}'' is not " + "supported. Ignoring.", property);
        }
    } else {
        unsupportedConnectObjectProperty(object, property);
    }
}
Also used : FbxAnimCurveNode(com.jme3.scene.plugins.fbx.anim.FbxAnimCurveNode)

Aggregations

BoneTrack (com.jme3.animation.BoneTrack)2 FbxAnimCurveNode (com.jme3.scene.plugins.fbx.anim.FbxAnimCurveNode)2 AnimControl (com.jme3.animation.AnimControl)1 Animation (com.jme3.animation.Animation)1 Bone (com.jme3.animation.Bone)1 Skeleton (com.jme3.animation.Skeleton)1 SpatialTrack (com.jme3.animation.SpatialTrack)1 Quaternion (com.jme3.math.Quaternion)1 Vector3f (com.jme3.math.Vector3f)1 Spatial (com.jme3.scene.Spatial)1 FbxAnimLayer (com.jme3.scene.plugins.fbx.anim.FbxAnimLayer)1 FbxAnimStack (com.jme3.scene.plugins.fbx.anim.FbxAnimStack)1 FbxLimbNode (com.jme3.scene.plugins.fbx.anim.FbxLimbNode)1 FbxToJmeTrack (com.jme3.scene.plugins.fbx.anim.FbxToJmeTrack)1 FbxNode (com.jme3.scene.plugins.fbx.node.FbxNode)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1