def rotate(self, car: Car, target: vec3, dt) -> SimpleControllerState: # up = vec3(*[self.car.theta[i, 2] for i in range(3)]) target_rotation = look_at(self.target, vec3(0, 0, 1)) action = AerialTurn(car) action.target = target_rotation action.step(dt) controls = action.controls return controls
def moving_ball_dodge_contact(game_info): ''' Returns dodge duration and delay so the car can reach contact_height ''' ball = game_info.ball contact_height = ball.pos.z - 20 hitbox_class = game_info.me.hitbox_class car_copy = RLU_Car(game_info.utils_game.my_car) turn = RLU_AerialTurn(car_copy) turn.target = roll_away_from_target(ball.pos, pi / 4, game_info) box = update_hitbox(car_copy, hitbox_class) time = 0 dt = 1 / 60 ball_contact = has_ball_contact(time, box, ball, game_info.team_sign) closest_point = ball_contact[1] while closest_point[2] < contact_height and not ball_contact[0]: time += dt ball = game_info.ball_prediction.state_at_time(game_info.game_time + time) turn.step(dt) contact_height = ball.pos.z - 30 controls = turn.controls if time <= 0.20: controls.jump = 1 controls.boost = 1 car_copy.step(controls, dt) box = update_hitbox(car_copy, hitbox_class) ball_contact = has_ball_contact(time, box, ball, game_info.team_sign) closest_point = ball_contact[1] if time >= 1.45: #Max dodge time return None, None, Simulation() if not ball_contact[0]: return None, None, Simulation() if time < 0.2: duration = time delay = duration + 2 * dt else: duration = 0.2 delay = time delay -= 0.05 #Window to dodge just before ball contact return duration, delay, Simulation(ball_contact=True, car=car_copy, hitbox=box, time=time)
def stationary_ball_dodge_contact(game_info, contact_height): ''' Returns dodge duration and delay so the car can reach contact_height ''' ball = game_info.ball hitbox_class = game_info.me.hitbox_class car_copy = RLU_Car(game_info.utils_game.my_car) turn = RLU_AerialTurn(car_copy) turn.target = roll_away_from_target(ball.pos, pi / 4, game_info) box = update_hitbox(car_copy, hitbox_class) time = 0 dt = 1 / 60 ball_contact = has_ball_contact(time, box, ball, game_info.team_sign) intended_contact_point = ball_contact[1] while intended_contact_point[2] < contact_height and not ball_contact[0]: time += dt turn.step(dt) controls = turn.controls if time <= 0.20: controls.jump = 1 controls.boost = 1 car_copy.step(controls, dt) box = update_hitbox(car_copy, hitbox_class) ball_contact = has_ball_contact(time, box, ball, game_info.team_sign) intended_contact_point = ball_contact[1] if time >= 1.45: #Max dodge time return None, None, Simulation() if not ball_contact[0]: return None, None, Simulation() if time < 0.2: duration = time delay = duration + 2 * dt else: duration = 0.2 delay = time delay -= 0.05 #How long before we hit the ball is acceptable to dodge return duration, delay, Simulation(ball_contact=True, car=car_copy, hitbox=box, time=time)
from rlutilities.linear_algebra import vec3, axis_to_rotation, look_at from rlutilities.mechanics import AerialTurn from rlutilities.simulation import Car c = Car() c.time = 0.0 c.location = vec3(0, 0, 500) c.velocity = vec3(0, 0, 0) c.angular_velocity = vec3(0.1, -2.0, 1.2) c.rotation = axis_to_rotation(vec3(1.7, -0.5, 0.3)) c.on_ground = False turn = AerialTurn(c) turn.target = look_at(vec3(1, 0, 0), vec3(0, 0, 1)) turn.step(0.0166) print(turn.controls.roll) print(turn.controls.pitch) print(turn.controls.yaw) simulation = turn.simulate() print(simulation.time)