private void OnACPhysics(object sender, PhysicsEventArgs e) { RaceState.ReadFromMemory(); if (RaceState.Instance.CarVelocities == null || RaceState.Instance.CarVelocities.Count == 0) { return; } if (RaceState.Instance.CarPositions == null || RaceState.Instance.CarPositions.Count == 0) { return; } var frontX = (float)((e.Physics.TyreContactPoint[0].X + e.Physics.TyreContactPoint[1].X) / 2.0); var frontY = (float)((e.Physics.TyreContactPoint[0].Y + e.Physics.TyreContactPoint[1].Y) / 2.0); var frontZ = (float)((e.Physics.TyreContactPoint[0].Z + e.Physics.TyreContactPoint[1].Z) / 2.0); var rearX = (float)((e.Physics.TyreContactPoint[2].X + e.Physics.TyreContactPoint[3].X) / 2.0); var rearY = (float)((e.Physics.TyreContactPoint[2].Y + e.Physics.TyreContactPoint[3].Y) / 2.0); var rearZ = (float)((e.Physics.TyreContactPoint[2].Z + e.Physics.TyreContactPoint[3].Z) / 2.0); frontCoordinates = new Vector3(frontX, frontY, frontZ); rearCoordinates = new Vector3(rearX, rearY, rearZ); if (!isSpeedInit) { Console.WriteLine("Resetting speed."); AntManagerState.Instance.BikeSpeedKmh = e.Physics.SpeedKmh; isSpeedInit = true; } AntManagerState.Instance.AirDensity = e.Physics.AirDensity; AntManagerState.Instance.DraftingCoefficient = (float)draftingPhysics.DraftingCoefficient(RaceState.Instance); // Console.WriteLine("Drafting : {0}", AntManagerState.Instance.DraftingCoefficient); if (useAssistLine) { if (RaceState.Instance.CarPositions.Count == 0 || RaceState.Instance.NormalizedCarPositions.Count == 0) { Console.WriteLine("No car positions.."); return; } var orientation = frontCoordinates - rearCoordinates; orientation = Vector3.Normalize(orientation); assistLineFollower.CarOrientation = orientation; assistLineFollower.CarPosition = RaceState.Instance.CarPositions[0]; assistLineFollower.CarVelocity = RaceState.Instance.CarVelocities[0]; assistLineFollower.NormalizedCarPosition = RaceState.Instance.NormalizedCarPositions[0]; assistLineFollower.Update(RaceState.Instance); if (AntManagerState.Instance.BikeSpeedKmh > assistLineFollower.SpeedLimit) { AntManagerState.Instance.BikeSpeedKmh = assistLineFollower.SpeedLimit; } joyControl.Direction(10 * assistLineFollower.Direction); // Should be ratio between steering value and angle } else { joyControl.Direction(0); } var acSpeed = e.Physics.SpeedKmh; var targetSpeed = AntManagerState.Instance.BikeSpeedKmh; var throttle = 10 * (targetSpeed - acSpeed) / (10 + targetSpeed); joyControl.Throttle(Math.Max(0, throttle)); }