well, target vector - source vector will give you a direction and distance vector. So with this distance vector you can scale it for how far you want to move by using speed and tpf. Then add this distance vector to you source vector and voila!
Well, if you store the start point than it's just a simple interpolation from point A to point B. If not, then you could define 'speed', say 1 jME unit per second, so the distance you WANT to travel is 'speed * tpf', we'll call this value 'dist'. Knowing the distance/direction vector from your current location to the destination (target - source), it is a simple division of 'dist / (target - source)' to get the fraction of movement along that vector, then multiply the result against your direction vector to get the actual movement.
Psuedo…
float speed = 1.0f;
Vector3f target = getTargetLocation();
update(float tpf) {
float dist = speed * tpf;
Vector3f direction = target - getCurrentLocation();
Vector3f newLoc = (dist / direction) * direction;
setLocation(newLoc);
}
Obviously you wouldn't want to create all those vectors every time, maybe use a class temp and make use of the *Local arithmetic functions of Vector3f. This should be mathematically correct.
Get the general idea of multiplying the dist ( distance travelled per frame ) by the scale of the point, that way it treats it like a ratio. Think the last beer has finally put the brain to sleep.
its the line
Vector3f newLoc = (dist / direction) * direction;
dividing by direction and then multiplying it gives the same result.
Ill get a test case ready in the morning ----> sleeeeep