working ray-casting, no jitter
This commit is contained in:
parent
ffbe45cf8e
commit
3498fcc5aa
2 changed files with 17 additions and 13 deletions
12
src/bike.rs
12
src/bike.rs
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue