make your own interpolator! ;-)
here is some draft i just wrote:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| import javax.media.j3d.*; import javax.vecmath.*;
class ProjectileBehavior extends Behavior { public static final float g = 9.81; private Vector3f startPos; private Vector3f startVelocity; private TransformGroup bodyTG; private Transform3D transform = new Transform3D(); private Vector3f pos = new Vector3f(); private WakeupOnElapsedFrames wakeup = new WakeupOnElapsedFrames(0); private long t; public BallMovingBehavior(TransformGroup bodyTG, Vector3f startPos, Vector3f startVelocity) { super(); this.bodyTG = bodyTG; this.startPos = startPos; this.startVelocity = startVelocity; } public void initialize() { t = System.currentTimeMillis(); } public void setEnable(boolean state) { if (state) t = System.currentTimeMillis(); } public void processStimulus(java.util.Enumeration criteria) { pos.x = startPos.x + startVelocity.x*t/1000; pos.y = startPos.y + startVelocity.y*t/1000; pos.z = startPos.z + startVelocity.z*t/1000 - g*t^2/(2*1000^2); transform.set(pos); bodyTG.set(transform); this.wakeupOn(wakeup); this.wakeupOn(wakeup); }
} |
considering gravity downards the z axis.
And all this is of course very approximative...
It could also be done by extending an interpolator and computing the pos based on the alpha value. The resuting effect would be quite different, in this example the movement depends of "absolute" time, with an alpha object, it depends on "relative time" of the alpha object.
cheers.