예제 #1
0
        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));
        }