public Controller Step(Ball ball, float dt, float currentTime) { float delta_t = ArrivalTime - currentTime; Vector3 A = CalculateCourse(Car, Target, delta_t); Controller c = new Controller(); Vector3 dir = Vector3.Normalize(A); if (doubleJump != null && !doubleJump.Finished) { c = doubleJump.Step(); } else { Quaternion t; Vector3 predicted = Car.Position + Car.Velocity * delta_t + 0.5f * -650f * delta_t * delta_t * Vector3.UnitZ; if ((predicted - Target).Length() > 50) { t = MathUtility.LookAt(dir, Car.Up); } else { Vector3 d = ball.Position - Car.Position; Vector3 r = new Vector3(d.Y, -d.X, 0); t = MathUtility.LookAt(Vector3.Normalize(Vector3.Cross(d, r)), -Vector3.Normalize(d)); } Vector3 inputs = RotationController.GetInputs(Car, t, dt); c.Roll = inputs.X; c.Pitch = inputs.Y; c.Yaw = inputs.Z; if (MathUtility.Angle(Car.Rotation, MathUtility.LookAt(dir, Car.Up)) < 0.4f) { c.Boost = true; } if (Car.CanDodge) { Finished = true; } } if (currentTime > ArrivalTime) { Finished = true; } return(c); }
public Controller Step(Ball ball, float dt, float currentTime) { Vector3 A = CalculateCourse(Car, Target, ArrivalTime - currentTime); Controller c = new Controller(); Vector3 dir = Vector3.Normalize(A); if (doubleJump != null && !doubleJump.Finished) { c = doubleJump.Step(); } else { Quaternion t; Car test = new Car(Car); for (int i = 0; i < (int)((ArrivalTime - currentTime) / 0.016667f); i++) { test.Simulate(new Controller(), 0.016667f); } if ((Target - test.Position).Length() > 120) { t = MathUtility.LookAt(dir, Car.Up); } else { t = MathUtility.LookAt(Vector3.Normalize(ball.Position - Car.Position), Car.Up); } Vector3 inputs = RotationController.GetInputs(Car, t, dt); c.Roll = inputs.X; c.Pitch = inputs.Y; c.Yaw = inputs.Z; if (MathUtility.Angle(Car.Rotation, MathUtility.LookAt(dir, Car.Up)) < 0.4f) { c.Boost = true; } } if (currentTime > ArrivalTime || A.Length() > 1050) { Finished = true; } return(c); }
public Controller Step(float dt) { Finished = car.HasWheelContact; Vector3 inputs = RotationController.GetInputs(car, targetRotation, dt); Controller controller = new Controller(); controller.Roll = inputs.X; controller.Pitch = inputs.Y; controller.Yaw = inputs.Z; return(controller); }