From eaba0edcd2aa1533b18ce0caaa529f1a6f21c0db Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Sun, 6 Apr 2025 16:52:21 -0700 Subject: [PATCH] add drag, bias power to front --- src/bike.rs | 16 ++++++------- src/physics.rs | 63 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/bike.rs b/src/bike.rs index 558a514..3b9a62a 100644 --- a/src/bike.rs +++ b/src/bike.rs @@ -6,13 +6,13 @@ use bevy::prelude::*; use crate::physics::CatControllerState; -pub const SPRING_CONSTANT: Scalar = 50.0; +pub const SPRING_CONSTANT: Scalar = 60.0; pub const DAMPING_CONSTANT: Scalar = 10.0; pub const WHEEL_RADIUS: Scalar = 0.4; -pub const REST_DISTANCE: Scalar = 1.0 + WHEEL_RADIUS; -pub const FRICTION_COEFF: Scalar = 0.8; -pub const FRONT_ATTACH: Vec3 = Vec3::new(0.0, 0.0, -0.7); -pub const REAR_ATTACH: Vec3 = Vec3::new(0.0, 0.0, 0.7); +pub const REST_DISTANCE: Scalar = 1.5 + WHEEL_RADIUS; +pub const FRICTION_COEFF: Scalar = 0.9; +pub const FRONT_ATTACH: Vec3 = Vec3::new(0.0, 0.0, -0.5); +pub const REAR_ATTACH: Vec3 = Vec3::new(0.0, 0.0, 0.5); #[derive(Component)] pub struct CyberBikeBody; @@ -92,7 +92,7 @@ fn spawn_bike( SleepingDisabled, CyberBikeBody, CatControllerState::default(), - ColliderDensity(0.6), + ColliderDensity(1.2), AngularDamping(0.2), LinearDamping(0.1), ExternalForce::ZERO.with_persistence(false), @@ -120,7 +120,7 @@ fn spawn_wheels( ) { let mesh: Mesh = Sphere::new(WHEEL_RADIUS).into(); - let front_rake = Vec3::new(0.0, -1.0, -0.57).normalize(); // about 30 degrees + let front_rake = Vec3::new(0.0, -1.0, -0.9).normalize(); // about 30 degrees let front_wheel_pos = FRONT_ATTACH + (front_rake * REST_DISTANCE); wheel_caster( @@ -148,7 +148,7 @@ fn spawn_wheels( CyberWheel::Front, ); - let rear_rake = Vec3::new(0.0, -1.0, 0.57).normalize(); + let rear_rake = Vec3::new(0.0, -1.0, 0.9).normalize(); let rear_wheel_pos = REAR_ATTACH + (rear_rake * REST_DISTANCE); wheel_caster( diff --git a/src/physics.rs b/src/physics.rs index 03a0feb..e397544 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -1,6 +1,8 @@ -use avian3d::prelude::*; +use avian3d::{math::Scalar, prelude::*}; use bevy::prelude::*; +const DRAG_COEFF: Scalar = 0.1; + #[derive(Resource, Default, Debug, Reflect)] #[reflect(Resource)] struct CyberLean { @@ -18,9 +20,9 @@ pub struct CatControllerSettings { impl Default for CatControllerSettings { fn default() -> Self { Self { - kp: 15.0, - kd: 1.5, - ki: 0.5, + kp: 16.0, + kd: 2.0, + ki: 0.9, } } } @@ -29,7 +31,6 @@ impl Default for CatControllerSettings { pub struct CatControllerState { pub roll_integral: f32, pub roll_prev: f32, - decay_factor: f32, roll_limit: f32, } @@ -38,7 +39,6 @@ impl Default for CatControllerState { Self { roll_integral: Default::default(), roll_prev: Default::default(), - decay_factor: 0.99, roll_limit: 1.5, } } @@ -60,7 +60,7 @@ mod systems { use avian3d::prelude::*; use bevy::prelude::*; - use super::{CatControllerSettings, CatControllerState, CyberLean}; + use super::{CatControllerSettings, CatControllerState, CyberLean, DRAG_COEFF}; use crate::{ bike::{CyberBikeBody, CyberWheel, WheelConfig, WheelState, WHEEL_RADIUS}, input::InputState, @@ -272,7 +272,7 @@ mod systems { let bike_vel = bike_vel.0; let dt = time.delta().as_secs_f32(); - let max_thrust = 1000.0; + let max_thrust = 2000.0; let yaw_angle = -yaw_to_angle(input.yaw); for (mut state, config, wheel) in wheels.iter_mut() { @@ -283,9 +283,10 @@ mod systems { let rot = Quat::from_axis_angle(normal, yaw_angle); let forward = normal.cross(*bike_xform.right()); + let thrust_mag = input.throttle * max_thrust * dt; let (thrust_dir, thrust_force) = match wheel { - CyberWheel::Rear => (forward, input.throttle * max_thrust * dt), - CyberWheel::Front => (rot * forward, 0.0), + CyberWheel::Rear => (forward, thrust_mag * 0.1), + CyberWheel::Front => (rot * forward, thrust_mag), }; let thrust = thrust_force * thrust_dir; @@ -295,16 +296,12 @@ mod systems { CyberWheel::Rear => normal.cross(*bike_xform.forward()), }; - // bevy::log::debug!( - // "{wheel:?}, thrust_dir: {thrust_dir:?}, friction_dir: {friction_dir:?}, dot: {}", - // thrust_dir.dot(friction_dir) - // ); - let vel = bike_body.velocity_at_point(contact_point - bike_xform.translation); let friction_factor = -0.025 * vel.dot(friction_dir); let friction = (friction_factor / dt) * friction_dir; - bevy::log::debug!("{wheel:?}: vel diff: {:?}", bike_vel - vel); + let diff = bike_vel - vel; + bevy::log::debug!("{wheel:?}: vel diff: {diff:?} ({})", diff.length(),); let mut force = thrust + friction; force *= dt * 50.0; @@ -312,7 +309,6 @@ mod systems { if force_mag > max_force_mag { state.sliding = true; force = force.normalize_or_zero() * max_force_mag; - //bevy::log::info!("clamping {wheel:?} to {max_force_mag}: {friction_factor}"); } else { state.sliding = false; } @@ -332,6 +328,35 @@ mod systems { } } + pub(super) fn drag( + mut bike_query: Query< + (&Transform, &LinearVelocity, &mut ExternalForce), + With, + >, + mut gizmos: Gizmos, + time: Res