public FollowBox(Simulator sim, final TrafficCar vehicle, FollowBoxSettings settings) { this.sim = sim; this.vehicle = vehicle; this.settings = settings; waypointList = settings.getWayPoints(); maxDistance = settings.getMaxDistance(); motionPath = new MotionPath(); motionPath.setCycle(settings.isPathCyclic()); for (Waypoint wayPoint : waypointList) motionPath.addWayPoint(wayPoint.getPosition()); motionPath.setPathSplineType(SplineType.CatmullRom); // --> default: CatmullRom motionPath.setCurveTension(settings.getCurveTension()); if (settings.isPathVisible()) motionPath.enableDebugShape(sim.getAssetManager(), sim.getSceneNode()); motionPath.addListener( new MotionPathListener() { public void onWayPointReach(MotionTrack control, int wayPointIndex) { // set speed limit for next way point int index = wayPointIndex % waypointList.size(); float speed = waypointList.get(index).getSpeed(); setSpeed(speed); // if last way point reached if (motionPath.getNbWayPoints() == wayPointIndex + 1) { // reset vehicle to first way point if not cyclic if (!motionPath.isCycle()) setToWayPoint(0); } } }); followBox = createFollowBox(); motionControl = new MotionTrack(followBox, motionPath); // get start way point int startWayPointIndex = settings.getStartWayPointIndex(); // set start speed float initialSpeed = waypointList.get(startWayPointIndex).getSpeed(); setSpeed(initialSpeed); // set start position setToWayPoint(startWayPointIndex); // move object along path considering rotation motionControl.setDirectionType(MotionTrack.Direction.PathAndRotation); // loop movement of object motionControl.setLoopMode(LoopMode.Loop); // rotate moving object // motionControl.setRotation(new Quaternion().fromAngleNormalAxis(-FastMath.HALF_PI, // Vector3f.UNIT_Y)); // set moving object to position "20 seconds" // motionPath.interpolatePath(20, motionControl); // start movement // motionControl.play(); // already contained in update method }