Alright so I found a free 3DS and got it working. Here is the download for anyone else interested.
http://www.turbosquid.com/FullPreview/Index.cfm/ID/312341A few things. There are 650 frames of animation. That translates to about 19MG as a 3DS export. Say goodbye to your heap!
I started messing around with selecting the short walk sequence (frames 0-30) in 3DS max and exporting that. 900KB.
I then used the handy "Select Objects" button to thin out the selection to every other frame and then finally every 3rd frame.
Selecting every 3rd frame gave me my target 300KB and the animation was surprising smooth - equivalent to my MD2 animations I downloaded somewhere.
So in case this will help anybody:
I could not find any definitive forum posts validating this for certain - you can use a single 3DS file for your animations just like an MD2. Works exactly the same. You could surely export it frame by frame but you don't need to. Is there some advantage or something? I like the single file thing because it is consistent with the MD2 approach.
To export the single 3DS file:
1. Tools->Snapshot...
select 0 - 30 and 30 copies (for the model above that is).
2. Edit->Select By->Name
Select the items you want in the export file - for me it was "monster01", "monster04"..."monster28". Every 3rd
frame resulting in a 10 frame animation sequence. Hit the Select Button before leaving!
3. File->Export Selected
Here is the working code:
private void testLoad3DS(){
try{
Loader.setVertexOptimization(false);
TextureManager tm = TextureManager.getInstance();
Texture t = new Texture("models/3ds/monster.jpg");
tm.addTexture("monster2", t);
Object3D[] animArray=Loader.load3DS("models/3ds/animate/monster_c.3DS", 1f);
monster2=animArray[0];
monster2.build();
monster2.setTexture("monster2");
monster2.rotateX((float)-Math.PI/2);
monster2.setRotationMatrix(new Matrix());
monster2.translate(new SimpleVector(0, -30, 0));
monster2.createTriangleStrips(2);
monster2.setCollisionMode(Object3D.COLLISION_CHECK_OTHERS);
monster2.setCollisionOptimization(Object3D.COLLISION_DETECTION_OPTIMIZED);
theWorld.addObject(monster2);
System.out.println("MoveTest::testLoad3DS() array size is: " + animArray.length);
Animation anim=new Animation(animArray.length);
int iseq = anim.createSubSequence("walk");
for (int i=0; i<animArray.length; i++) {
animArray[i].build();
Object3D o = animArray[i];
o.rotateX((float)-Math.PI/2);
anim.addKeyFrame(o.getMesh().cloneMesh(false));
}
System.out.println("MoveTest::testLoad3DS() setting animation sequence...");
monster2.setAnimationSequence(anim);
System.out.println("MoveTest::testLoad3DS() sequence id is: " + iseq);
}catch(Exception e){
System.err.println("MoveTest::testLoad3DS() " + e.getMessage());
e.printStackTrace();
}
}
And then the game loop calls this (I know I need to use a better timer - its just a test!)
private void checkAnimate3DS(){
try{
long ltime = System.currentTimeMillis();
if((ltime - _last3DSms) > 60){
_last3DSms = ltime;
if(_anim3DS > 1)
_anim3DS=0;
else
_anim3DS+=0.05f;
monster2.animate(_anim3DS, 1);
}
}catch(Exception e){
System.err.println("MoveTest::checkAnimate3DS() " + e.getMessage());
e.printStackTrace();
}
}