Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }