From ffbe45cf8e617260b7d59c5455fef2abf55ec2d5 Mon Sep 17 00:00:00 2001 From: Joe Ardent <code@ardent.nebcorp.com> Date: Sat, 29 Mar 2025 16:30:06 -0700 Subject: [PATCH] use a raycast instead of shapecast --- src/bike.rs | 2 +- src/physics.rs | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/bike.rs b/src/bike.rs index d671f8d..3e03068 100644 --- a/src/bike.rs +++ b/src/bike.rs @@ -187,7 +187,7 @@ fn wheel_caster( rest_dist: Scalar, wheel: CyberWheel, ) { - let caster = ShapeCaster::new(collider, origin, Quat::IDENTITY, direction) + let caster = RayCaster::new(origin, direction) .with_max_distance(rest_dist) .with_max_hits(1) .with_query_filter(SpatialQueryFilter::from_excluded_entities([parent])); diff --git a/src/physics.rs b/src/physics.rs index a32d6ba..e9c2f72 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -174,7 +174,7 @@ mod systems { ), Without<CyberBikeBody>, >, - caster_query: Query<(&ShapeCaster, &ShapeHits, &CyberWheel)>, + caster_query: Query<(&RayCaster, &RayHits, &CyberWheel)>, time: Res<Time>, input: Res<InputState>, mut gizmos: Gizmos, @@ -188,11 +188,11 @@ mod systems { let yaw = input.yaw * max_yaw; let dt = time.delta().as_secs_f32(); - let mut front_caster = &ShapeCaster::default(); - let mut rear_caster = &ShapeCaster::default(); + let mut front_caster = &RayCaster::default(); + let mut rear_caster = &RayCaster::default(); - let mut front_hits = &ShapeHits::default(); - let mut rear_hits = &ShapeHits::default(); + let mut front_hits = &RayHits::default(); + let mut rear_hits = &RayHits::default(); for (caster, hits, wheel) in caster_query.iter() { match wheel { @@ -225,12 +225,16 @@ mod systems { let mag = config.konstant * displacement - config.damping * damper_vel; let mag = mag.max(0.0); - //let fdir = -caster.global_direction().as_vec3(); - let fdir = hit.normal1; + + let fdir = hit.normal; let force = fdir * mag; - //dbg!(fdir, force); - let p = hit.point1 + (hit.normal1 * config.radius); - gizmos.arrow(p, p + force, Color::linear_rgb(1., 0.5, 0.2)); + + let hit_point = caster.global_origin() + caster.global_direction() * dist; + gizmos.arrow( + hit_point, + hit_point + force, + Color::linear_rgb(1., 0.5, 0.2), + ); bike_forces.apply_force_at_point( force, @@ -240,7 +244,7 @@ mod systems { //let vel = (global_xform.translation() - state.ppos) / dt; state.ppos = global_xform.translation(); - let normal = hit.normal1; + let normal = hit.normal; let steering = match wheel { CyberWheel::Front => normal.cross(*bike_xform.back()) * yaw, CyberWheel::Rear => Vec3::ZERO, @@ -248,12 +252,8 @@ mod systems { }; let thrust = normal.cross(*bike_xform.right()) * thrust; let total = (thrust + steering) * dt; - bike_forces.apply_force_at_point(total, hit.point1, bike_xform.translation); - gizmos.arrow( - hit.point1, - hit.point1 + total, - Color::linear_rgb(1., 1., 0.2), - ); + bike_forces.apply_force_at_point(total, hit_point, bike_xform.translation); + gizmos.arrow(hit_point, hit_point + total, Color::linear_rgb(1., 1., 0.2)); } else { xform.translation = config.attach + (caster.direction.as_vec3() * config.rest_dist); }