Trying to get the flight physics to feel right
parent
a6c4ebff39
commit
ae19b8bb93
|
@ -68,19 +68,41 @@ const KEY_DOWN: usize = KEY_UP + 1;
|
|||
|
||||
struct ControllerState {
|
||||
keys: Vec <bool>,
|
||||
|
||||
trigger_left: i16,
|
||||
trigger_right: i16,
|
||||
}
|
||||
|
||||
impl ControllerState {
|
||||
pub fn from_sdl_keyboard (k: &sdl2::keyboard::KeyboardState) -> Self {
|
||||
let f = |c| k.is_scancode_pressed (c);
|
||||
pub fn new (
|
||||
k: &sdl2::keyboard::KeyboardState,
|
||||
c: &Option <sdl2::controller::GameController>
|
||||
) -> Self {
|
||||
use sdl2::controller::*;
|
||||
|
||||
let f = |code| k.is_scancode_pressed (code);
|
||||
let b = |code| match c {
|
||||
None => false,
|
||||
Some (c) => c.button (code),
|
||||
};
|
||||
|
||||
let key_or_gamepad = |key, button| f (key) || b (button);
|
||||
|
||||
Self {
|
||||
keys: vec! [
|
||||
f (Scancode::Left),
|
||||
f (Scancode::Right),
|
||||
f (Scancode::Up),
|
||||
f (Scancode::Down),
|
||||
key_or_gamepad (Scancode::Left, Button::DPadLeft),
|
||||
key_or_gamepad (Scancode::Right, Button::DPadRight),
|
||||
key_or_gamepad (Scancode::Up, Button::DPadUp),
|
||||
key_or_gamepad (Scancode::Down, Button::DPadDown),
|
||||
],
|
||||
trigger_left: match c {
|
||||
None => 0,
|
||||
Some (c) => c.axis (Axis::TriggerLeft),
|
||||
},
|
||||
trigger_right: match c {
|
||||
None => 0,
|
||||
Some (c) => c.axis (Axis::TriggerRight),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -187,6 +209,19 @@ struct FlightState {
|
|||
spin_speed: i32,
|
||||
}
|
||||
|
||||
impl Default for FlightState {
|
||||
fn default () -> Self {
|
||||
Self {
|
||||
airplane: Airplane {
|
||||
pos: (0.0, -10.0, 20.0).into (),
|
||||
vel: (0.0, 0.0, 0.0).into (),
|
||||
ori: Default::default (),
|
||||
},
|
||||
spin_speed: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl FlightState {
|
||||
pub fn handle_event (&mut self, _event: &sdl2::event::Event) {
|
||||
|
||||
|
@ -209,10 +244,12 @@ impl FlightState {
|
|||
|
||||
let object_space_dir = airplane.ori.conjugate ().mul_vec3 (direction);
|
||||
|
||||
let throttle = 1.0 + (controller.trigger_right as f32 - controller.trigger_left as f32) / 32767.0;
|
||||
|
||||
// Forces
|
||||
let gravity = Vec3::from ((0.0, 0.0, -0.25));
|
||||
let thrust = nose;
|
||||
let laminar_drag = 0.5 * speed * -object_space_dir.y () * nose;
|
||||
let thrust = nose * throttle;
|
||||
let laminar_drag = 0.25 * speed * -object_space_dir.y () * nose;
|
||||
|
||||
let turbulent_dir = Vec3::from ((0.5 * object_space_dir.x (), 0.0, object_space_dir.z ()));
|
||||
let turbulent_drag = -speed * speed * airplane.ori.mul_vec3 (turbulent_dir);
|
||||
|
@ -231,11 +268,15 @@ impl FlightState {
|
|||
|
||||
// Gauges
|
||||
let alti = airplane.pos.z () * 100.0;
|
||||
let airspeed = speed * 100.0;
|
||||
let air_speed = speed * 100.0;
|
||||
let ground_vel = Vec3::from ((airplane.vel.x (), airplane.vel.y (), 0.0));
|
||||
let ground_speed = ground_vel.length () * 100.0;
|
||||
|
||||
println! ("Alti: {}, Airspeed: {}",
|
||||
println! ("Alti: {}, Airspeed: {}, Groundspeed: {}, Throttle: {}",
|
||||
alti as i32,
|
||||
airspeed as i32
|
||||
air_speed as i32,
|
||||
ground_speed as i32,
|
||||
(throttle * 100.0) as i32
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -295,14 +336,7 @@ impl WorldState {
|
|||
},
|
||||
spin_speed: 0,
|
||||
},
|
||||
flight: FlightState {
|
||||
airplane: Airplane {
|
||||
pos: (0.0, -0.5, 0.125).into (),
|
||||
vel: (0.0, 0.0, 0.0).into (),
|
||||
ori: Default::default (),
|
||||
},
|
||||
spin_speed: 0,
|
||||
},
|
||||
flight: Default::default (),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -898,8 +932,8 @@ impl GameGraphics {
|
|||
|
||||
fn main () {
|
||||
let sdl_context = sdl2::init ().unwrap ();
|
||||
let video_subsystem = sdl_context.video ().unwrap ();
|
||||
|
||||
let video_subsystem = sdl_context.video ().unwrap ();
|
||||
let window = video_subsystem.window ("OpenGL? In my Rust?", 1280, 720)
|
||||
.position_centered ()
|
||||
.opengl ()
|
||||
|
@ -924,6 +958,9 @@ fn main () {
|
|||
|
||||
let mut graphics_frames = 0;
|
||||
|
||||
let controller_subsystem = sdl_context.game_controller ().unwrap ();
|
||||
let controller = controller_subsystem.open (0).ok ();
|
||||
|
||||
let mut event_pump = sdl_context.event_pump ().unwrap ();
|
||||
'running: loop {
|
||||
let frames_to_do = time_step.step ();
|
||||
|
@ -940,7 +977,10 @@ fn main () {
|
|||
}
|
||||
}
|
||||
|
||||
let controller = ControllerState::from_sdl_keyboard (&event_pump.keyboard_state ());
|
||||
let controller = ControllerState::new (
|
||||
&event_pump.keyboard_state (),
|
||||
&controller
|
||||
);
|
||||
|
||||
for _ in 0..frames_to_do {
|
||||
state.step (&controller);
|
||||
|
|
Loading…
Reference in New Issue