diff --git a/src/bike.rs b/src/bike.rs index a9c442f..6826c2f 100644 --- a/src/bike.rs +++ b/src/bike.rs @@ -22,11 +22,11 @@ pub enum CyberWheel { #[derive(Component, Clone, Copy, Debug, Reflect, Default)] #[reflect(Component)] -#[require(LinearVelocity, RigidBody(|| RigidBody::Kinematic))] pub struct WheelState { pub displacement: Scalar, pub sliding: bool, pub grounded: bool, + pub ppos: Vec3, } #[derive(Component, Clone, Copy, Debug, Reflect)] @@ -126,7 +126,7 @@ fn spawn_wheels( &mut materials, front_wheel_pos, mesh.clone(), - WheelConfig::new(FRONT_ATTACH, REST_DISTANCE, 1200., -160., 0.5), + WheelConfig::new(FRONT_ATTACH, REST_DISTANCE, 800., -160., 0.5), CyberWheel::Front, ); @@ -148,7 +148,7 @@ fn spawn_wheels( &mut materials, rear_wheel_pos, mesh, - WheelConfig::new(REAR_ATTACH, REST_DISTANCE, 1200., -160., 0.5), + WheelConfig::new(REAR_ATTACH, REST_DISTANCE, 800., -160., 0.5), CyberWheel::Rear, ); } diff --git a/src/physics.rs b/src/physics.rs index e45c57a..5bf29dc 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -163,8 +163,8 @@ mod systems { ( &mut Transform, &mut WheelState, + &GlobalTransform, &WheelConfig, - &LinearVelocity, &CyberWheel, ), Without<CyberBikeBody>, @@ -202,21 +202,23 @@ mod systems { } } let (bike_xform, mut bike_forces) = bike_body_query.single_mut(); - for (mut xform, mut state, config, velocity, wheel) in wheel_mesh_query.iter_mut() { + for (mut xform, mut state, global_xform, config, wheel) in wheel_mesh_query.iter_mut() { let (caster, hits) = match wheel { CyberWheel::Front => (front_caster, front_hits), CyberWheel::Rear => (rear_caster, rear_hits), }; let prev = &mut state.displacement; - for hit in hits.iter() { + if let Some(hit) = hits.iter().next() { let force = suspension_force(caster, hit, config, prev, dt, &mut xform); bike_forces.apply_force_at_point( force, caster.global_origin(), bike_xform.translation, ); - dbg!(velocity); + let vel = (global_xform.translation() - state.ppos) / dt; + dbg!(vel); + state.ppos = global_xform.translation(); let normal = hit.normal1; let steering = match wheel { CyberWheel::Front => normal.cross(*bike_xform.back()) * yaw, @@ -230,6 +232,8 @@ mod systems { hit.point1 + total, Color::linear_rgb(1., 1., 0.2), ); + } else { + xform.translation = config.attach + (caster.direction.as_vec3() * config.rest_dist); } } } @@ -274,6 +278,9 @@ impl Plugin for CyberPhysicsPlugin { .register_type::<CyberLean>() .add_plugins((PhysicsPlugins::default(), PhysicsDebugPlugin::default())) .insert_resource(SubstepCount(12)) + .add_systems(Startup, |mut gravity: ResMut<Gravity>| { + gravity.0 *= 0.02; + }) .add_systems( FixedUpdate, (calculate_lean, apply_lean, suspension).chain(),