diff --git a/src/bike.rs b/src/bike.rs index 6826c2f..0999f66 100644 --- a/src/bike.rs +++ b/src/bike.rs @@ -6,8 +6,10 @@ use bevy::prelude::*; use crate::physics::CatControllerState; -pub const REST_DISTANCE: f32 = 1.0; -pub const WHEEL_RADIUS: f32 = 0.4; +pub const REST_DISTANCE: Scalar = 1.0; +pub const SPRING_CONSTANT: Scalar = 50.0; +pub const DAMPING_CONSTANT: Scalar = 3.0; +pub const WHEEL_RADIUS: Scalar = 0.4; 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); @@ -38,6 +40,7 @@ pub struct WheelConfig { pub konstant: Scalar, pub damping: Scalar, pub friction: Scalar, + pub radius: Scalar, } impl WheelConfig { @@ -47,6 +50,7 @@ impl WheelConfig { konstant: Scalar, damping: Scalar, friction: Scalar, + radius: Scalar, ) -> Self { WheelConfig { attach, @@ -54,6 +58,7 @@ impl WheelConfig { konstant, damping, friction, + radius, } } } @@ -79,9 +84,11 @@ fn spawn_bike( SleepingDisabled, CyberBikeBody, CatControllerState::default(), - ColliderDensity(20.0), - LinearVelocity::ZERO, - AngularVelocity::ZERO, + ColliderDensity(0.5), + AngularDamping(0.9), + LinearDamping(0.2), + // LinearVelocity::ZERO, + // AngularVelocity::ZERO, ExternalForce::ZERO.with_persistence(false), ExternalTorque::ZERO.with_persistence(false), )) @@ -114,7 +121,7 @@ fn spawn_wheels( wheel_caster( commands, collider.clone(), - Transform::from_translation(FRONT_ATTACH), + FRONT_ATTACH, Dir3::new_unchecked(front_rake), body, REST_DISTANCE, @@ -126,7 +133,14 @@ fn spawn_wheels( &mut materials, front_wheel_pos, mesh.clone(), - WheelConfig::new(FRONT_ATTACH, REST_DISTANCE, 800., -160., 0.5), + WheelConfig::new( + FRONT_ATTACH, + REST_DISTANCE, + SPRING_CONSTANT, + DAMPING_CONSTANT, + 0.5, + WHEEL_RADIUS, + ), CyberWheel::Front, ); @@ -136,7 +150,7 @@ fn spawn_wheels( wheel_caster( commands, collider, - Transform::from_translation(REAR_ATTACH), + REAR_ATTACH, Dir3::new_unchecked(rear_rake), body, REST_DISTANCE, @@ -148,7 +162,14 @@ fn spawn_wheels( &mut materials, rear_wheel_pos, mesh, - WheelConfig::new(REAR_ATTACH, REST_DISTANCE, 800., -160., 0.5), + WheelConfig::new( + REAR_ATTACH, + REST_DISTANCE, + SPRING_CONSTANT, + DAMPING_CONSTANT, + 0.5, + WHEEL_RADIUS, + ), CyberWheel::Rear, ); } @@ -160,14 +181,15 @@ fn spawn_wheels( fn wheel_caster( commands: &mut ChildBuilder, collider: Collider, - xform: Transform, + origin: Vec3, direction: Dir3, parent: Entity, rest_dist: Scalar, wheel: CyberWheel, ) { - let caster = ShapeCaster::new(collider, xform.translation, Quat::IDENTITY, direction) + let caster = ShapeCaster::new(collider, origin, Quat::IDENTITY, direction) .with_max_distance(rest_dist) + .with_max_hits(1) .with_query_filter(SpatialQueryFilter::from_excluded_entities([parent])); commands.spawn((caster, wheel)); @@ -191,12 +213,18 @@ fn wheel_mesh( let xform = Transform::from_translation(position); + let name = match wheel { + CyberWheel::Front => "front tire", + CyberWheel::Rear => "rear tire", + }; + commands.spawn(( - Name::new("tire"), + Name::new(name), config, Mesh3d(meshes.add(tire_mesh)), MeshMaterial3d(materials.add(wheel_material.clone())), xform, + TransformInterpolation, wheel, )); } @@ -205,6 +233,8 @@ pub struct CyberBikePlugin; impl Plugin for CyberBikePlugin { fn build(&self, app: &mut App) { + app.register_type::(); + app.register_type::(); app.add_systems(Startup, spawn_bike); } } diff --git a/src/camera.rs b/src/camera.rs index 75a51c9..cd8c03e 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -56,14 +56,9 @@ fn update_camera_pos(mut offset: ResMut, mut keys: ResMut