Controlling DAE animations in Papervision3d


Controlling DAE animations in Papervision3d

-Works with papervision rev 910 and below (idk how much below xD)-

I just uploaded a new version of DAEMC to the trunk. This time i had to modify more files to be able to implement a feature that i think is very nice to have. And that is: controlling the animation speed smoothly. This is usefull to make matrix like effects or just for smoothing animations.

DEMO (421Kb no loader)

Vodpod videos no longer available.

 

Project Home

http://code.google.com/p/daeanim/
 

Video tutorial HD

http://www.youtube.com/watch?v=80U3bsQkLag&feature=PlayList&p=DC06F53A3AA56289&index=0&playnext=1

 

How it works now?

Imagine the DAE timeline as a simple flash timeline, like this:

time1

with DAEMC v.1 you could change the FPS of the animation and what that did was jumping frames skipping some of them resulting in a jumping animation. Now with DAEMC2 the timeline is like this one:

tim2

and it behaves similar to a motion tween timeline in flash CS4, where you can stretch the animation making it smoother, like this:

tim3

now new frames are created between the original keyframes by interpolating them (simple linear interpolation) getting a nice and smooth animation. This is made by editing a new poperty called Xframes (read-write), for example, in the image above the Xframe whould be 3, because you had 3 frames in between each frame, so as in a motion tween timeline, you can stretch the frames all you want, but not compressing them. In the DAEMC v.1 you could change the FPS to a lower rate but i decided not to implement that because i thought that doing that was always going to result in a jumpy animation… but you can still do it if you want by using a Tween engine in the curentFrameNumber property (in theory, not tested…).

This is the biggest change in the DAEMC class, but i had to edit some core files in papervision3d to get this done: 

  • org.papervision3d.core.animation.channel.AbstractChannel3D:  added a new method updateSmoothlyToTime()
  • org.papervision3d.core.animation.channel.MatrixChannel3D: override the AbstrachtChannel3D updateSmoothlyToTime
  • org.papervision3d.objects.DisplayObject3D: this is the key element, added gotoTransform(), this method make the interpolation.
  • a brand new org.papervision3d.objects.special .DAEMC2

 

From DAEMC to DAEMC2:

  • added> get/set Xframes():uint  >  add new frames between original frames. 0 is the original frames of the animation.
  • deleted> get/set  fps(newFPS:uint):void  //now this is controlled by Xframes 
  • unchangedget totalFrames():uint
  • unchanged> get currentFrame():uint 
  • added> currentFrameNumber(frame:Number):void > curentFrameNumber is the curent frame + de decimal value is the distance between that frame and the next one… example:  1.5 will be frame 1 in the middle between frame 1 and 2.
  • unchanged> get isPlaying():Boolean
  • deleted> setFrameLabel(frame:uint, name:String = null):void 
  • deleted> gotoAndPlay(frame:Object):void 
  • deleted> gotoAndStop(frame:Object):void 
  • unchanged> addFrameScript(frame:uint, callback:Function = null):void
  • added> get/set inReverse():Boolean > Set this to true if you want the animation to play backwards

 

Probably F.A.Qs

  • How do i do a gotoAndPlay o gotoAndStop now? –you can do that by setting the fame you want .curentFrameNumber = X and then calling a .stop() or play()
  • Why you deleted addFrameLabel? -I make myself the same question… i’ll probably add it… depends on the feedback.
  • How to i change the speed of an animation at runtime? -you can set or call the Xframe property of the DAEMC2 instance.
  • Why addFrameScript take an uint but curentFrameNumber is a Number? -you can only set actions on the oiginal frames of the animation.  I could add the posibility later… dpending on the feedback is people will use it.
  • What if i want to make an animation faster? -well, i made the currentFrame get/set so you can make experiment with tween engnes… you could tween that property to mkae it go faster…
  • How would I get a model to play in reverse?  doing  model_instance.inReverse = true; take in count that any frame script will be called…
Advertisements