Handle pitching the camera with controller.

This commit is contained in:
Joe Ardent 2022-01-26 16:53:37 -08:00
parent 7cb70b218b
commit 3a1c4ebff8
2 changed files with 17 additions and 3 deletions

View file

@ -1,9 +1,15 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::geometry::{CyberBike, SPAWN_ALTITUDE}; use crate::{
geometry::{CyberBike, SPAWN_ALTITUDE},
input::InputState,
};
pub(crate) const CAM_DIST: f32 = 15.0; pub(crate) const CAM_DIST: f32 = 15.0;
// 85 degrees in radians
const MAX_PITCH: f32 = 1.48353;
#[derive(Component, Debug)] #[derive(Component, Debug)]
pub struct CyberCam; pub struct CyberCam;
@ -20,6 +26,7 @@ fn setup_cybercam(mut commands: Commands) {
fn follow_cyberbike( fn follow_cyberbike(
bike_query: Query<&Transform, (Without<CyberCam>, With<CyberBike>)>, bike_query: Query<&Transform, (Without<CyberCam>, With<CyberBike>)>,
mut cam_query: Query<&mut Transform, (With<CyberCam>, Without<CyberBike>)>, mut cam_query: Query<&mut Transform, (With<CyberCam>, Without<CyberBike>)>,
input: Res<InputState>,
) { ) {
let bike_xform = bike_query.single(); let bike_xform = bike_query.single();
let up = bike_xform.translation.normalize(); let up = bike_xform.translation.normalize();
@ -30,6 +37,11 @@ fn follow_cyberbike(
let mut cam_xform = cam_query.single_mut(); let mut cam_xform = cam_query.single_mut();
cam_xform.translation = cam_pos; cam_xform.translation = cam_pos;
cam_xform.look_at(look_at, up); cam_xform.look_at(look_at, up);
// handle input pitch
let angle = input.pitch.powi(3) * MAX_PITCH;
let axis = cam_xform.right();
cam_xform.rotate(Quat::from_axis_angle(axis, angle));
} }
pub struct CyberCamPlugin; pub struct CyberCamPlugin;

View file

@ -9,7 +9,7 @@ pub(crate) struct InputState {
pub yaw: f32, pub yaw: f32,
pub throttle: f32, pub throttle: f32,
pub brake: bool, pub brake: bool,
pub _pitch: f32, pub pitch: f32,
} }
fn update_input(events: Res<Events<GamepadEvent>>, mut istate: ResMut<InputState>) { fn update_input(events: Res<Events<GamepadEvent>>, mut istate: ResMut<InputState>) {
@ -32,7 +32,9 @@ fn update_input(events: Res<Events<GamepadEvent>>, mut istate: ResMut<InputState
istate.yaw = -val; istate.yaw = -val;
} }
// ignore spurious vertical movement for now // ignore spurious vertical movement for now
GamepadEventType::AxisChanged(GamepadAxisType::LeftStickY, _) => {} GamepadEventType::AxisChanged(GamepadAxisType::LeftStickY, val) => {
istate.pitch = val;
}
_ => { _ => {
info!("unhandled gamepad event: {:?}", ev); info!("unhandled gamepad event: {:?}", ev);
} }