package jo.vecmath.logic; import java.util.Random; import jo.vecmath.Matrix4f; import jo.vecmath.Point3f; public class BrownianTransformer implements ITransformer { private Random mRND; private Point3f mLocation; private Point3f mTarget; private float mVelocity; // per second private float mRadius; private long mLastTick; public BrownianTransformer(float velocity, float radius) { mVelocity = velocity; mRadius = radius; mRND = new Random(); mLastTick = System.currentTimeMillis(); mLocation = new Point3f(0, 0, 0); newTarget(); } private void newTarget() { mTarget = new Point3f(newDelta(), newDelta(), newDelta()); } private float newDelta() { return (mRND.nextFloat() - .5f) * mRadius * 2; } @Override public Matrix4f calcTransform(Matrix4f transform) { long now = System.currentTimeMillis(); float elapsed = (now - mLastTick) / 1000f; float traverse = elapsed * mVelocity; for (;;) { float dist = mTarget.distance(mLocation); if (traverse < dist) { break; } traverse -= dist; mLocation.set(mTarget); newTarget(); } Point3f delta = new Point3f(); delta.sub(mTarget, mLocation); Point3fLogic.normalize(delta); delta.scale(traverse); mLocation.add(delta); Matrix4f newTrans = new Matrix4f(transform); newTrans.m03 += mLocation.x; newTrans.m13 += mLocation.y; newTrans.m23 += mLocation.z; mLastTick = now; return newTrans; } }