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;
pub const REST_DISTANCE: Scalar = 1.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 REST_DISTANCE: Scalar = 1.0 + WHEEL_RADIUS;
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);
@ -113,18 +113,16 @@ fn spawn_wheels(
body: Entity,
) {
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_wheel_pos = FRONT_ATTACH + (front_rake * REST_DISTANCE);
wheel_caster(
commands,
collider.clone(),
FRONT_ATTACH,
Dir3::new_unchecked(front_rake),
body,
REST_DISTANCE,
REST_DISTANCE + WHEEL_RADIUS,
CyberWheel::Front,
);
wheel_mesh(
@ -149,11 +147,10 @@ fn spawn_wheels(
wheel_caster(
commands,
collider,
REAR_ATTACH,
Dir3::new_unchecked(rear_rake),
body,
REST_DISTANCE,
REST_DISTANCE + WHEEL_RADIUS,
CyberWheel::Rear,
);
wheel_mesh(
@ -180,7 +177,6 @@ fn spawn_wheels(
fn wheel_caster(
commands: &mut ChildBuilder,
collider: Collider,
origin: Vec3,
direction: Dir3,
parent: Entity,

View file

@ -57,12 +57,12 @@ impl CatControllerState {
mod systems {
use std::f32::consts::{FRAC_PI_3, FRAC_PI_4};
use avian3d::{math::Scalar, prelude::*};
use avian3d::prelude::*;
use bevy::prelude::*;
use super::{CatControllerSettings, CatControllerState, CyberLean};
use crate::{
bike::{CyberBikeBody, CyberWheel, WheelConfig, WheelState},
bike::{CyberBikeBody, CyberWheel, WheelConfig, WheelState, WHEEL_RADIUS},
input::InputState,
};
@ -163,7 +163,15 @@ mod systems {
}
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 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() {
let (caster, hits) = match wheel {
CyberWheel::Front => (front_caster, front_hits),
@ -216,7 +224,7 @@ mod systems {
if let Some(hit) = hits.iter().next() {
let dist = hit.distance;
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 damper_vel = (state.displacement - displacement) / dt;