diff --git a/src/camera.rs b/src/camera.rs new file mode 100644 index 0000000..f4a121b --- /dev/null +++ b/src/camera.rs @@ -0,0 +1,63 @@ +use bevy::prelude::*; + +use crate::{geometry::CyberBike, input::InputState, physics::MovementSettings}; + +pub(crate) const CAM_DIST: f32 = 50.0; + +#[derive(Component, Debug)] +pub struct CyberCam; + +fn setup_cybercam(mut commands: Commands) { + use crate::geometry::PLAYER_DIST; + commands + .spawn_bundle(PerspectiveCameraBundle { + transform: Transform::from_xyz(PLAYER_DIST + CAM_DIST, 0.0, 0.0) + .looking_at(Vec3::ZERO, Vec3::Y), + ..Default::default() + }) + .insert(CyberCam); +} + +fn follow_player( + bike_query: Query<(&Transform, &CyberBike), Without>, + mut cam_query: Query<(&mut Transform, &CyberCam), Without>, +) { + let (bike_xform, _) = bike_query.single(); + let up = bike_xform.translation.normalize(); + + let look_at = bike_xform.translation; + let cam_pos = bike_xform.translation + (bike_xform.back() * CAM_DIST * 1.3) + (up * CAM_DIST); + + let (mut cam_xform, _) = cam_query.single_mut(); + cam_xform.translation = cam_pos; + cam_xform.look_at(look_at, up); +} + +fn player_look( + settings: Res, + windows: Res, + time: Res