working ray-casting, no jitter

This commit is contained in:
Joe Ardent 2025-03-29 16:51:13 -07:00
parent ffbe45cf8e
commit 3498fcc5aa
2 changed files with 17 additions and 13 deletions

View file

@ -6,10 +6,10 @@ use bevy::prelude::*;
use crate::physics::CatControllerState; use crate::physics::CatControllerState;
pub const REST_DISTANCE: Scalar = 1.0;
pub const SPRING_CONSTANT: Scalar = 50.0; pub const SPRING_CONSTANT: Scalar = 50.0;
pub const DAMPING_CONSTANT: Scalar = 3.0; pub const DAMPING_CONSTANT: Scalar = 10.0;
pub const WHEEL_RADIUS: Scalar = 0.4; pub const WHEEL_RADIUS: Scalar = 0.4;
pub const REST_DISTANCE: Scalar = 1.0 + WHEEL_RADIUS;
pub const FRONT_ATTACH: Vec3 = Vec3::new(0.0, 0.0, -0.7); 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 REAR_ATTACH: Vec3 = Vec3::new(0.0, 0.0, 0.7);
@ -113,18 +113,16 @@ fn spawn_wheels(
body: Entity, body: Entity,
) { ) {
let mesh: Mesh = Sphere::new(WHEEL_RADIUS).into(); let mesh: Mesh = Sphere::new(WHEEL_RADIUS).into();
let collider = Collider::sphere(WHEEL_RADIUS);
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.57).normalize(); // about 30 degrees
let front_wheel_pos = FRONT_ATTACH + (front_rake * REST_DISTANCE); let front_wheel_pos = FRONT_ATTACH + (front_rake * REST_DISTANCE);
wheel_caster( wheel_caster(
commands, commands,
collider.clone(),
FRONT_ATTACH, FRONT_ATTACH,
Dir3::new_unchecked(front_rake), Dir3::new_unchecked(front_rake),
body, body,
REST_DISTANCE, REST_DISTANCE + WHEEL_RADIUS,
CyberWheel::Front, CyberWheel::Front,
); );
wheel_mesh( wheel_mesh(
@ -149,11 +147,10 @@ fn spawn_wheels(
wheel_caster( wheel_caster(
commands, commands,
collider,
REAR_ATTACH, REAR_ATTACH,
Dir3::new_unchecked(rear_rake), Dir3::new_unchecked(rear_rake),
body, body,
REST_DISTANCE, REST_DISTANCE + WHEEL_RADIUS,
CyberWheel::Rear, CyberWheel::Rear,
); );
wheel_mesh( wheel_mesh(
@ -180,7 +177,6 @@ fn spawn_wheels(
fn wheel_caster( fn wheel_caster(
commands: &mut ChildBuilder, commands: &mut ChildBuilder,
collider: Collider,
origin: Vec3, origin: Vec3,
direction: Dir3, direction: Dir3,
parent: Entity, parent: Entity,

View file

@ -57,12 +57,12 @@ impl CatControllerState {
mod systems { mod systems {
use std::f32::consts::{FRAC_PI_3, FRAC_PI_4}; use std::f32::consts::{FRAC_PI_3, FRAC_PI_4};
use avian3d::{math::Scalar, prelude::*}; use avian3d::prelude::*;
use bevy::prelude::*; use bevy::prelude::*;
use super::{CatControllerSettings, CatControllerState, CyberLean}; use super::{CatControllerSettings, CatControllerState, CyberLean};
use crate::{ use crate::{
bike::{CyberBikeBody, CyberWheel, WheelConfig, WheelState}, bike::{CyberBikeBody, CyberWheel, WheelConfig, WheelState, WHEEL_RADIUS},
input::InputState, input::InputState,
}; };
@ -163,7 +163,15 @@ mod systems {
} }
pub(super) fn suspension( pub(super) fn suspension(
mut bike_body_query: Query<(&Transform, &mut ExternalForce), With<CyberBikeBody>>, mut bike_body_query: Query<
(
&Transform,
&LinearVelocity,
&AngularVelocity,
&mut ExternalForce,
),
With<CyberBikeBody>,
>,
mut wheel_mesh_query: Query< mut wheel_mesh_query: Query<
( (
&mut Transform, &mut Transform,
@ -206,7 +214,7 @@ mod systems {
} }
} }
} }
let (bike_xform, mut bike_forces) = bike_body_query.single_mut(); let (bike_xform, lin_vel, ang_vel, mut bike_forces) = bike_body_query.single_mut();
for (mut xform, mut state, global_xform, config, 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 { let (caster, hits) = match wheel {
CyberWheel::Front => (front_caster, front_hits), CyberWheel::Front => (front_caster, front_hits),
@ -216,7 +224,7 @@ mod systems {
if let Some(hit) = hits.iter().next() { if let Some(hit) = hits.iter().next() {
let dist = hit.distance; let dist = hit.distance;
let cdir = caster.direction.as_vec3(); let cdir = caster.direction.as_vec3();
xform.translation = config.attach + (cdir * dist); xform.translation = config.attach + (cdir * (dist - WHEEL_RADIUS));
let displacement = config.rest_dist - dist; let displacement = config.rest_dist - dist;
let damper_vel = (state.displacement - displacement) / dt; let damper_vel = (state.displacement - displacement) / dt;