Jumping backwards in Time

Hi,



I am using cinematics and trying to jump backwards in time or rewinding. For the rewind I use:



[java] if (name.equals("rewind")) {



System.out.println("Rewinding");

cinematic.setSpeed(1);

cinematic.setTime(cinematic.getTime() - 1);

printAnimationSpeed();

System.out.println("Time " + cinematic.getTime());

}[/java]



and for the Jump I use:



[java]

package mygame;





import com.jme3.animation.AnimControl;

import com.jme3.animation.AnimationFactory;

import com.jme3.animation.LoopMode;

import com.jme3.cinematic.Cinematic;

import com.jme3.cinematic.events.CinematicEvent;

import com.jme3.app.SimpleApplication;

import com.jme3.cinematic.PlayState;

import com.jme3.cinematic.events.AnimationTrack;

import com.jme3.cinematic.events.CinematicEventListener;

import com.jme3.cinematic.events.PositionTrack;

import com.jme3.input.ChaseCamera;

import com.jme3.input.controls.ActionListener;

import com.jme3.input.controls.KeyTrigger;

import com.jme3.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Quaternion;

import com.jme3.math.Vector3f;

import com.jme3.scene.Geometry;

import com.jme3.scene.Spatial;

import com.jme3.scene.shape.Box;

import java.io.File;

import java.util.concurrent.Callable;

import java.util.concurrent.ScheduledThreadPoolExecutor;

import javax.swing.JFileChooser;

import javax.swing.JOptionPane;



public class TimeTest extends SimpleApplication {



private Spatial model;

private Spatial podModel;



private Cinematic cinematic;

private ChaseCamera chaseCam;

private ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(2);





public static void main(String[] args) {

TimeTest app = new TimeTest();

app.start();



}



@Override

public void simpleInitApp() {



createScene();



cinematic = new Cinematic(rootNode, 1000);

stateManager.attach(cinematic);



AnimationFactory factory = new AnimationFactory(10, "animation");

factory.addTimeTranslation(0, new Vector3f(0, 0, 0));

factory.addTimeTranslation(10, new Vector3f(5, 0, 0));



AnimControl control = model.getControl(AnimControl.class);

if( control == null){

control = new AnimControl();

model.addControl(control);

}



control.addAnim(factory.buildAnimation());



cinematic.addCinematicEvent(0, new AnimationTrack(model, "animation"));



AnimationFactory factory2 = new AnimationFactory(10, "animation2");

factory2.addTimeTranslation(0, new Vector3f(5, 0, 0));

factory2.addTimeTranslation(5, new Vector3f(0, 0, 0));



AnimControl control2 = model.getControl(AnimControl.class);

if( control2 == null){

control2 = new AnimControl();

model.addControl(control2);

}



control2.addAnim(factory2.buildAnimation());



cinematic.addCinematicEvent(10.1f, new AnimationTrack(model, "animation2"));





AnimationFactory factory3 = new AnimationFactory(3, "animation3");

factory3.addTimeTranslation(0, new Vector3f(0, 0, 1));

factory3.addTimeTranslation(3, new Vector3f(5, 0, 1));



AnimControl control3 = podModel.getControl(AnimControl.class);

if( control3 == null){

control3 = new AnimControl();

podModel.addControl(control3);

}



control3.addAnim(factory3.buildAnimation());



cinematic.addCinematicEvent(8.1f, new AnimationTrack(podModel, "animation3"));



cinematic.addListener(new CinematicEventListener() {



public void onPlay(CinematicEvent s) {

chaseCam.setEnabled(false);

System.out.println("play");

System.out.println("Animation Speed: " + cinematic.getSpeed());

System.out.println("Animation State: " + cinematic.getPlayState());

System.out.println("Animation Time: " + cinematic.getTime());

}



public void onPause(CinematicEvent cinematic) {

chaseCam.setEnabled(false);

System.out.println("pause");

System.out.println("Animation Speed: " + cinematic.getSpeed());

System.out.println("Animation State: " + cinematic.getPlayState());

System.out.println("Animation Time: " + cinematic.getTime());

}



public void onStop(CinematicEvent cinematic) {

chaseCam.setEnabled(false);

// fade.setValue(1);

System.out.println("stop");

}

});



flyCam.setEnabled(false);

chaseCam = new ChaseCamera(cam, model, inputManager);



initInputs();

cinematic.setSpeed(1);



}





Callable jumpBackwards = new Callable() {



public Object call() throws Exception {

try {

final float value = Float.parseFloat(JOptionPane.showInputDialog(null,

"Enter Time",

"Choose Desired Jump Time",

JOptionPane.QUESTION_MESSAGE));



TimeTest.this.enqueue(new Callable<Void>() {



public Void call() throws Exception {

cinematic.setTime(value);

return null;

}

});



} catch (Exception nFE) {

// do nothing just cancel command

}

return null;

}

};







private void createScene() {



Box pod = new Box(new Vector3f(0, 0, 1f), 1, .25f, .5f);

podModel = new Geometry("pod #", pod);

Material mat2 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");

mat2.setColor("Color", ColorRGBA.Blue);

podModel.setMaterial(mat2);



Box drive_unit = new Box(new Vector3f(0, 0, 0), 1, .25f, .5f); // must take from config xml file (TODO)

model = new Geometry("Drive #", drive_unit);

Material mat1 = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");

mat1.setColor("Color", ColorRGBA.Orange);

model.setMaterial(mat1);



model.center();

//podModel.center();



rootNode.attachChild(model);

rootNode.attachChild(podModel);



//jumpBackwards();



Material matSoil = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");

matSoil.setBoolean("UseMaterialColors", true);

matSoil.setColor("Ambient", ColorRGBA.Gray);

matSoil.setColor("Diffuse", ColorRGBA.Green);

matSoil.setColor("Specular", ColorRGBA.Black);



}



private void initInputs() {

inputManager.addMapping("togglePause", new KeyTrigger(keyInput.KEY_RETURN));

inputManager.addMapping("jump", new KeyTrigger(keyInput.KEY_J));

inputManager.addMapping("increaseSpeed", new KeyTrigger(keyInput.KEY_EQUALS));

ActionListener acl = new ActionListener() {



public void onAction(String name, boolean keyPressed, float tpf) {

if (name.equals("togglePause") && keyPressed) {

if (cinematic.getPlayState() == PlayState.Playing) {

cinematic.pause();

} else {

cinematic.play();

}

}



if (name.equals("jump") && keyPressed) {

System.out.println("Time skipped to t = "

  • cinematic.getTime());



    exec.submit(jumpBackwards);



    }



    else if (name.equals("increaseSpeed") && keyPressed) {



    //pause to maintain animation accuracy

    cinematic.pause();

    // exec.submit(increaseSpeed);

    // increase animation speed by 1x

    //cinematic.setSpeed(cinematic.getSpeed() + 1);

    }





    }

    };

    inputManager.addListener(acl, "togglePause");

    inputManager.addListener(acl, "jump");

    inputManager.addListener(acl, "increaseSpeed");

    }



    /** Jump time function. Allows user to jump
  • in time during the animation (forward/backward)

    /

    Callable jumpTime = new Callable() {



    public Object call() throws Exception {

    try {



    //setPauseOnLostFocus(false);

    final float value = 2;

    /


    Float.parseFloat(JOptionPane.showInputDialog(null,

    “Enter Time”,

    “Choose Desired Jump Time”,

    JOptionPane.QUESTION_MESSAGE));

    */



    TimeTest.this.enqueue(new Callable<Void>() {



    public Void call() throws Exception {

    cinematic.setTime(value);

    System.out.println("Jumping to time: "+cinematic.getTime());

    return null;

    }

    });



    } catch (Exception nFE) {

    // do nothing just cancel command

    System.out.println(“Exception: Jumping in time failed”);

    }

    return null;

    }

    };

    }

    [/java]



    as this works perfectly forwarding and jumping forward, it does not work backwards.



    1- does Cinematics allow you to go backwards cz I don’t see why not.



    2- If so, Is there anything I am missing in my code?



    PS: the time variable when I output it does jump back and rewind , however the animation continues normally or sometimes freezes



    Cheers

@nehon looks like a bug in cinematics I prepared a testCase below (written in JMP):



Instructions:



1- press escape when you run it and then press J (shortcut) and put let’s say 10 - it will jump successfully to time 10

2- press J again and put 1 - it won’t go back (bug?)



[java]

package mygame;



import com.jme3.cinematic.Cinematic;

import com.jme3.animation.LoopMode;

import com.jme3.cinematic.events.CinematicEvent;

import com.jme3.cinematic.events.MotionTrack;

import com.jme3.cinematic.MotionPath;

import com.jme3.app.SimpleApplication;

import com.jme3.asset.AssetManager;

import com.jme3.cinematic.events.AbstractCinematicEvent;

import com.jme3.cinematic.PlayState;

import com.jme3.cinematic.events.CinematicEventListener;

import com.jme3.cinematic.events.PositionTrack;

import com.jme3.cinematic.events.RotationTrack;

import com.jme3.input.ChaseCamera;

import com.jme3.input.controls.ActionListener;

import com.jme3.input.controls.KeyTrigger;

import com.jme3.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Vector3f;

import com.jme3.post.FilterPostProcessor;

import com.jme3.post.filters.FadeFilter;

import com.jme3.scene.CameraNode;

import com.jme3.scene.Geometry;

import com.jme3.scene.Spatial;

import com.jme3.scene.shape.Box;

import com.jme3.system.JmeSystem;

import javax.swing.JOptionPane;









public class Main extends SimpleApplication {



private Spatial model;

private MotionPath path;

private MotionTrack cameraMotionTrack;

private Cinematic cinematic;

private ChaseCamera chaseCam;

private double counter;



public static void main(String[] args) {

Main app = new Main();

app.start();



}





@Override

public void simpleInitApp() {



createScene();



cinematic = new Cinematic(rootNode, 20);

//cinematic.bindUi(“Interface/Nifty/CinematicTest.xml”);

stateManager.attach(cinematic);



// createCameraMotion()



cinematic.addCinematicEvent(0, new AbstractCinematicEvent() {



@Override

public void onPlay() {

// fade.setValue(0);

// fade.fadeIn();

}



@Override

public void onUpdate(float tpf) {



counter += tpf;

System.out.println("Simulation Timer: "+counter);





}



@Override

public void onStop() {

}



@Override

public void onPause() {

}

});

cinematic.addCinematicEvent(0, new PositionTrack(model, new Vector3f(5, 0, 0), 4));

float[] rotation = {0, 3, 0};

float[] rotation2 = {0, 4.5f, 0};

//cinematic.addCinematicEvent(4, new RotationTrack(model, rotation, 1));

cinematic.addCinematicEvent(5, new PositionTrack(model, new Vector3f(-5, 0, 0), 3));

//cinematic.addCinematicEvent(8, new RotationTrack(model, rotation2, 1));

cinematic.addCinematicEvent(9, new PositionTrack(model, new Vector3f(-5, 0, 5), 2));

cinematic.addCinematicEvent(11, new PositionTrack(model, new Vector3f(-5, 0, 10), 2));

cinematic.addCinematicEvent(13, new PositionTrack(model, new Vector3f(-5, 0, 20), 2));

//cinematic.addCinematicEvent(13, new RotationTrack(model, rotation, 2));





cinematic.addListener(new CinematicEventListener() {



public void onPlay(CinematicEvent cinematic) {

chaseCam.setEnabled(false);

System.out.println(“play”);

System.out.println("Animation Speed: "+cinematic.getSpeed());

System.out.println("Animation State: "+cinematic.getPlayState());

System.out.println("Animation Time: "+cinematic.getTime());

}



public void onPause(CinematicEvent cinematic) {

chaseCam.setEnabled(false);

System.out.println(“pause”);

System.out.println("Animation Speed: "+cinematic.getSpeed());

System.out.println("Animation State: "+cinematic.getPlayState());

System.out.println("Animation Time: "+cinematic.getTime());

}



public void onStop(CinematicEvent cinematic) {

chaseCam.setEnabled(false);

// fade.setValue(1);

System.out.println(“stop”);

}

});



flyCam.setEnabled(false);

chaseCam = new ChaseCamera(cam, model, inputManager);

initInputs();

cinematic.setSpeed(3);



}



private void createCameraMotion() {



CameraNode camNode = cinematic.bindCamera(“topView”, cam);

camNode.setLocalTranslation(new Vector3f(0, 50, 0));

camNode.lookAt(model.getLocalTranslation(), Vector3f.UNIT_Y);



CameraNode camNode2 = cinematic.bindCamera(“aroundCam”, cam);

path = new MotionPath();

path.setCycle(true);

path.addWayPoint(new Vector3f(20, 3, 0));

path.addWayPoint(new Vector3f(0, 3, 20));

path.addWayPoint(new Vector3f(-20, 3, 0));

path.addWayPoint(new Vector3f(0, 3, -20));

path.setCurveTension(0.83f);

cameraMotionTrack = new MotionTrack(camNode2, path);

cameraMotionTrack.setLoopMode(LoopMode.Loop);

cameraMotionTrack.setLookAt(model.getWorldTranslation(), Vector3f.UNIT_Y);

cameraMotionTrack.setDirectionType(MotionTrack.Direction.LookAt);



}



private void createScene() {



Box drive_unit = new Box(new Vector3f(0, 0, 0), 1, .25f, .5f); // must take from config xml file (TODO)

model = new Geometry(“Drive #”, drive_unit );



if(assetManager == null)

{

System.out.println(“Asset Manager is null”);

}



AssetManager assetManager = null;

assetManager = JmeSystem.newAssetManager(Thread.currentThread().getContextClassLoader().getResource(“com/jme3/asset/Desktop.cfg”));

Material mat1 = new Material(assetManager, “Common/MatDefs/Misc/Unshaded.j3md”);

mat1.setColor(“Color”, ColorRGBA.Orange);

model.setMaterial(mat1);





model.center();



rootNode.attachChild(model);





jumpBackwards();





Material matSoil = new Material(assetManager, “Common/MatDefs/Light/Lighting.j3md”);

matSoil.setBoolean(“UseMaterialColors”, true);

matSoil.setColor(“Ambient”, ColorRGBA.Gray);

matSoil.setColor(“Diffuse”, ColorRGBA.Green);

matSoil.setColor(“Specular”, ColorRGBA.Black);



}



private void initInputs() {

inputManager.addMapping(“togglePause”, new KeyTrigger(keyInput.KEY_RETURN));

inputManager.addMapping(“jump”, new KeyTrigger(keyInput.KEY_J));

ActionListener acl = new ActionListener() {

public void onAction(String name, boolean keyPressed, float tpf) {

if (name.equals(“togglePause”) && keyPressed) {

if (cinematic.getPlayState() == PlayState.Playing) {

cinematic.pause();

} else {

cinematic.play();

}

}



if (name.equals(“jump”) && keyPressed) {

System.out.println("Time skipped to t = "

  • cinematic.getTime());

    jumpBackwards();

    }



    }

    };

    inputManager.addListener(acl, "togglePause");

    inputManager.addListener(acl, "jump");

    }



    private void jumpBackwards() {



    try {

    int value = Integer.parseInt(JOptionPane.showInputDialog(null,

    "Enter Time",

    "Choose Desired Jump Time",

    JOptionPane.QUESTION_MESSAGE));



    // get jumpTime form user input

    Float jumpTime = new Float(value);

    cinematic.setTime(jumpTime);



    System.out.println("Time skipped to t = "
  • cinematic.getTime());



    }

    catch(NumberFormatException nFE) {

    // do nothing just cancel command

    }

    }

    }

    [/java]



    thanks!!

Thanks i’ll look into it.



What version of JME do you use?



I changed the way time is computed recently and it may be fixing this issue…or causing it depending on what version you use :stuck_out_tongue:

Product Version: jMonkeyEngine SDK 3.0beta

Java: 1.6.0_21; Java HotSpot™ Server VM 17.0-b17

System: Windows 7 version 6.1 running on x86; Cp1252; en_US (jmonkeyplatform)



running the SVN as of yeterday

I also encoutered some problem with setTime a while ago. I ended up not using it.

@nehon let me know when the issue is resolved so I can update the code and give it a shot.



thanks for the help - CINEMATICS ROCKS

I am designing a game where I’ll be using cinematics and time, before proceeding is there a bug? is it fixed? which version/build did it work for you before updating?



@wasd what did you use instead in order to jump backwards in time?

Ok. i just made a commit that fixes your issue…somehow.



“Somehow” because there were indeed issues with time seeking that are now fixed, but your test case does not work right away.

The reason is that you use PositionTrack that is deprecated, and that does not seem to work with time seeking.

I won’t spend time to fix something that is gonna be removed from the engine anyway, so please use SpatialAnimation instead of PositionTrack.

Here is the equivalent code for your test case with spatial animation and AnimationFactory.



[java]

package mygame;



import com.jme3.animation.AnimControl;

import com.jme3.animation.AnimationFactory;

import com.jme3.cinematic.Cinematic;

import com.jme3.cinematic.events.CinematicEvent;

import com.jme3.app.SimpleApplication;

import com.jme3.cinematic.PlayState;

import com.jme3.cinematic.events.AnimationTrack;

import com.jme3.cinematic.events.CinematicEventListener;

import com.jme3.input.ChaseCamera;

import com.jme3.input.controls.ActionListener;

import com.jme3.input.controls.KeyTrigger;

import com.jme3.material.Material;

import com.jme3.math.ColorRGBA;

import com.jme3.math.Vector3f;

import com.jme3.scene.Geometry;

import com.jme3.scene.Spatial;

import com.jme3.scene.shape.Box;

import javax.swing.JOptionPane;



public class Main extends SimpleApplication {



private Spatial model;

private Cinematic cinematic;

private ChaseCamera chaseCam;



public static void main(String[] args) {

Main app = new Main();

app.start();



}



@Override

public void simpleInitApp() {



createScene();



cinematic = new Cinematic(rootNode, 20);

stateManager.attach(cinematic);



AnimationFactory factory = new AnimationFactory(15, “animation”);

factory.addTimeTranslation(0, new Vector3f(0, 0, 0));

factory.addTimeTranslation(4, new Vector3f(5, 0, 0));

factory.addTimeTranslation(5, new Vector3f(5, 0, 0));

factory.addTimeTranslation(8, new Vector3f(-5, 0, 0));

factory.addTimeTranslation(9, new Vector3f(-5, 0, 0));

factory.addTimeTranslation(11, new Vector3f(-5, 0, 5));

factory.addTimeTranslation(13, new Vector3f(-5, 0, 10));

factory.addTimeTranslation(15, new Vector3f(-5, 0, 20));





AnimControl control = new AnimControl();

control.addAnim(factory.buildAnimation());

model.addControl(control);



cinematic.addCinematicEvent(0, new AnimationTrack(model, “animation”));



cinematic.addListener(new CinematicEventListener() {



public void onPlay(CinematicEvent s) {

chaseCam.setEnabled(false);

System.out.println(“play”);

System.out.println("Animation Speed: " + cinematic.getSpeed());

System.out.println("Animation State: " + cinematic.getPlayState());

System.out.println("Animation Time: " + cinematic.getTime());

}



public void onPause(CinematicEvent cinematic) {

chaseCam.setEnabled(false);

System.out.println(“pause”);

System.out.println("Animation Speed: " + cinematic.getSpeed());

System.out.println("Animation State: " + cinematic.getPlayState());

System.out.println("Animation Time: " + cinematic.getTime());

}



public void onStop(CinematicEvent cinematic) {

chaseCam.setEnabled(false);

// fade.setValue(1);

System.out.println(“stop”);

}

});



flyCam.setEnabled(false);

chaseCam = new ChaseCamera(cam, model, inputManager);



initInputs();

cinematic.setSpeed(3);



}



private void createScene() {



Box drive_unit = new Box(new Vector3f(0, 0, 0), 1, .25f, .5f); // must take from config xml file (TODO)

model = new Geometry(“Drive #”, drive_unit);



if (assetManager == null) {

System.out.println(“Asset Manager is null”);

}



Material mat1 = new Material(assetManager, “Common/MatDefs/Misc/Unshaded.j3md”);

mat1.setColor(“Color”, ColorRGBA.Orange);

model.setMaterial(mat1);



model.center();



rootNode.attachChild(model);



jumpBackwards();



Material matSoil = new Material(assetManager, “Common/MatDefs/Light/Lighting.j3md”);

matSoil.setBoolean(“UseMaterialColors”, true);

matSoil.setColor(“Ambient”, ColorRGBA.Gray);

matSoil.setColor(“Diffuse”, ColorRGBA.Green);

matSoil.setColor(“Specular”, ColorRGBA.Black);



}



private void initInputs() {

inputManager.addMapping(“togglePause”, new KeyTrigger(keyInput.KEY_RETURN));

inputManager.addMapping(“jump”, new KeyTrigger(keyInput.KEY_J));

ActionListener acl = new ActionListener() {



public void onAction(String name, boolean keyPressed, float tpf) {

if (name.equals(“togglePause”) && keyPressed) {

if (cinematic.getPlayState() == PlayState.Playing) {

cinematic.pause();

} else {

cinematic.play();

}

}



if (name.equals(“jump”) && keyPressed) {

System.out.println("Time skipped to t = "

  • cinematic.getTime());



    jumpBackwards();



    }



    }

    };

    inputManager.addListener(acl, "togglePause");

    inputManager.addListener(acl, "jump");

    }



    private void jumpBackwards() {



    try {

    float value = Float.parseFloat(JOptionPane.showInputDialog(null,

    "Enter Time",

    "Choose Desired Jump Time",

    JOptionPane.QUESTION_MESSAGE));



    // get jumpTime form user input

    cinematic.setTime(value);



    System.out.println("Time skipped to t = "
  • cinematic.getTime() + " -> " + value);



    } catch (Exception nFE) {

    // do nothing just cancel command

    }

    }

    }

    [/java]

I guess you’re right , it’s time to update as I use RotationTrack and PositionTrack and they are both deprecated.



But what surprises me is that it was working on the Jan 24th 2012 build right after you did the 1st fix. So for now, I tried to revert back to that version and same thing it doesn’t work although I tested it at the time and it worked like a charm.



Thanks a lot for the help

Something doesn’t add up here. You are saying that it used to work fine on the Jan 24th SVN. Did you test it well? if it used to work fine why don’t you just REVERT BACK to that version. It should work as it was at the time. Right @nehon?



are you sure you didn’t break the time by adding some other functionality?

The change that was made on the 24th january is not optional, it did break things, but it should be fixed now.



I test everything i commit with the test cases in the repo.

Anyway are you still having issue with current svn? if yes provide the test case and i’ll fix any issue.

I know I am having an issue with the current svn.



What I don’t get is that prior to that how were things working and when I reverted back to a prior date things are still not working using PositionTrack and RotationTrack.



So I am stuck in this dilemma where PositionTrack and RotationTrack are not working well with “time” (meaning I cannot jump back in time for fastforward and rewind)



and changing like you suggested to use AnimationTrack does not work when being called several times like I mentioned to you in another thread and attached you a testCase. In case you didn’t see it the testCase is here:



http://hub.jmonkeyengine.org/groups/general-2/forum/topic/using-animationfactory-in-my-animation/?_wpnonce=a532d338c2

@nehon sorry to bug you, but did you have time to look at the testCase? just making sure you got it and not waiting for me.



thanks

nope, but i added it to my todo list.

sorry to spam your post but just before I start designing my project:



1- Is cinematics the way to go in case I want to read from trace file and animate?



2- I need to do some transformations (rotations, accelerations, etc) should I create my own tracks or use animations? I know RotationTrack and PositionTrack are deprecated.



3- Is there issues with the time seeking? the whole point of my game is allow users to jump to different times efficiently, would that work well with Cinemtics? If so, what should I use?





thanks!!

@nehon sorry to bug you again, but it’s been 1 month and I am not sure if the approach is right. Would the animationTrack be the only solution for the time seeking issue? As I need to eventually implement accelerateTrack, rotation and linear movement (which you alrady posted) do I use these as part of the animationTrack or as abstractEvents? I am just worried that I’ll wait so long and evnetually end up with the same issue (not being able to use the time variable effectively)



thanks

can anyone answer me :(?



like I am not sure for example how can I do a rotation using animationTrack…

there u go:[java] factory.addTimeRotation(duration, rotation_angle);[/java]





read the JavaDoc & API man

AnimationTrack use an existing animation in the animControl of a spatial.

To create your own animation you can use the animationFactory, that will build an animation by interpolating between keyframes.



Look at TestCinematic, i use this for the teapot animation.

Thanks @nehon! but before starting to go deeper into implementing animationTrack in my code I downloaded some of @garnaout code from his testCase (good artists copy great artists STEAL lol) and I am in fact getting the same bug he’s getting. Is there issues with the time variable?



I am referring to this post: http://hub.jmonkeyengine.org/groups/general-2/forum/topic/bug-in-animationtrack-and-time-seeking-variable/