package jo.vecmath.logic; import jo.vecmath.Matrix4f; import jo.vecmath.Point3f; import jo.vecmath.Tuple3f; import jo.vecmath.Vector3f; public class MoveTransformer implements ITransformer { private Point3f mPoint; private Vector3f mVelocity; // per second private Vector3f mAcceleration; // per second private boolean mReachedTarget; private long mLastTick; public MoveTransformer(Point3f point, Vector3f velocity, Vector3f acceleration) { mPoint = point; mVelocity = velocity; mAcceleration = acceleration; mLastTick = System.currentTimeMillis(); mReachedTarget = false; } @Override public Matrix4f calcTransform(Matrix4f transform) { if (mReachedTarget) { return transform; } long now = System.currentTimeMillis(); float elapsed = (now - mLastTick) / 1000f; Tuple3f v = mVelocity.scaleBy(elapsed); Point3f target = new Point3f(transform.m03, transform.m13, transform.m23); //System.out.println("At "+mPoint+", v="+mVelocity+", a="+mAcceleration+", target="+target); if (Math.abs(mPoint.x - target.x) < v.x) { mPoint.x = target.x; } else { mPoint.x += v.x * Math.signum(target.x - mPoint.x); } if (Math.abs(mPoint.y - target.y) < v.y) { mPoint.y = target.y; } else { mPoint.y += v.y * Math.signum(target.y - mPoint.y); } if (Math.abs(mPoint.z - target.z) < v.z) { mPoint.z = target.z; } else { mPoint.z += v.z * Math.signum(target.z - mPoint.z); } mVelocity.add(mAcceleration.scaleBy(elapsed)); Matrix4f newTrans = new Matrix4f(transform); newTrans.m03 = mPoint.x; newTrans.m13 = mPoint.y; newTrans.m23 = mPoint.z; if (MathUtils.isZero(mPoint.distanceL1(target))) { mReachedTarget = true; } mLastTick = now; return newTrans; } public boolean isReachedTarget() { return mReachedTarget; } }