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;
|
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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue