From 7efa0a8ab2080a07a45bd9deab6d57ebcdbde74c Mon Sep 17 00:00:00 2001 From: Joe Ardent Date: Mon, 30 Jan 2023 16:05:42 -0800 Subject: [PATCH] Add system to de-intersect wheels and planet surface. --- src/action/components.rs | 27 ++++++++++--- src/action/mod.rs | 8 ++++ src/action/systems.rs | 85 +++++++++++++++++++++++++++++++++------- src/bike.rs | 19 ++++----- src/camera.rs | 4 +- 5 files changed, 112 insertions(+), 31 deletions(-) diff --git a/src/action/components.rs b/src/action/components.rs index f16fcf9..d71bdd4 100644 --- a/src/action/components.rs +++ b/src/action/components.rs @@ -1,7 +1,7 @@ use std::time::Instant; use bevy::{ - prelude::{Component, ReflectResource, Resource}, + prelude::{Component, ReflectResource, Resource, Vec3}, reflect::Reflect, }; @@ -14,6 +14,21 @@ impl Default for ActionDebugInstant { } } +#[derive(Debug, Component)] +pub(super) struct Tunneling { + pub frames: usize, + pub dir: Vec3, +} + +impl Default for Tunneling { + fn default() -> Self { + Tunneling { + frames: 15, + dir: Vec3::ZERO, + } + } +} + #[derive(Debug, Resource, Reflect)] #[reflect(Resource)] pub struct MovementSettings { @@ -27,7 +42,7 @@ impl Default for MovementSettings { Self { sensitivity: 6.0, accel: 40.0, - gravity: 7.0, + gravity: 9.8, } } } @@ -68,7 +83,7 @@ impl Default for CatControllerState { roll_prev: Default::default(), pitch_integral: Default::default(), pitch_prev: Default::default(), - decay_factor: 0.9, + decay_factor: 0.99, roll_limit: 1.5, pitch_limit: 1.2, } @@ -77,10 +92,10 @@ impl Default for CatControllerState { impl CatControllerState { pub fn decay(&mut self) { - if self.roll_integral.abs() > 0.1 { + if self.roll_integral.abs() > 0.001 { self.roll_integral *= self.decay_factor; } - if self.pitch_integral.abs() > 0.1 { + if self.pitch_integral.abs() > 0.001 { self.pitch_integral *= self.decay_factor; } } @@ -101,7 +116,7 @@ impl CatControllerState { (derivative, self.pitch_integral) } - pub fn set_limits(&mut self, roll: f32, pitch: f32) { + pub fn set_integral_limits(&mut self, roll: f32, pitch: f32) { self.roll_limit = roll; self.pitch_limit = pitch; } diff --git a/src/action/mod.rs b/src/action/mod.rs index 8646ba7..642b1ed 100644 --- a/src/action/mod.rs +++ b/src/action/mod.rs @@ -21,9 +21,17 @@ impl Plugin for CyberActionPlugin { .add_plugin(RapierPhysicsPlugin::::default()) .add_plugin(FrameTimeDiagnosticsPlugin::default()) .add_startup_system(zero_gravity) + .add_system(surface_fix) .add_system(gravity.before("cat")) .add_system(falling_cat.label("cat")) .add_system(input_forces.label("iforces").after("cat")) + .add_system( + tunnel_out + .label("tunnel") + .before("surface_fix") + .after("drag"), + ) + .add_system(surface_fix.label("surface_fix").after("cat")) .add_system(drag.label("drag").after("iforces")); } } diff --git a/src/action/systems.rs b/src/action/systems.rs index 29b5d8b..bc81bc8 100644 --- a/src/action/systems.rs +++ b/src/action/systems.rs @@ -1,35 +1,38 @@ #[cfg(feature = "inspector")] use std::time::Instant; -use bevy::prelude::{Query, Res, ResMut, Time, Transform, Vec3, With}; -use bevy_rapier3d::prelude::{ExternalForce, Friction, RapierConfiguration, Velocity}; +use bevy::prelude::{Commands, Entity, Query, Res, ResMut, Time, Transform, Vec3, With, Without}; +use bevy_rapier3d::prelude::{ + CollisionGroups, ExternalForce, Friction, Group, QueryFilter, RapierConfiguration, + RapierContext, ReadMassProperties, Velocity, +}; #[cfg(feature = "inspector")] use super::ActionDebugInstant; -use super::{CatControllerSettings, CatControllerState, MovementSettings}; +use super::{CatControllerSettings, CatControllerState, MovementSettings, Tunneling}; use crate::{ - bike::{CyberBikeBody, CyberWheel}, + bike::{CyberBikeBody, CyberWheel, BIKE_WHEEL_COLLISION_GROUP}, input::InputState, }; /// Disable gravity in Rapier. -pub(crate) fn zero_gravity(mut config: ResMut) { +pub(super) fn zero_gravity(mut config: ResMut) { config.gravity = Vec3::ZERO; } /// The gravity vector points from the cyberbike to the center of the planet. -pub(crate) fn gravity( - mut query: Query<(&Transform, &mut ExternalForce), With>, +pub(super) fn gravity( + mut query: Query<(&Transform, &mut ExternalForce, &ReadMassProperties), With>, settings: Res, ) { - let (xform, mut forces) = query.single_mut(); - let grav = xform.translation.normalize() * -settings.gravity; + let (xform, mut forces, mprops) = query.single_mut(); + let grav = xform.translation.normalize() * -settings.gravity * mprops.0.mass; forces.force = grav; forces.torque = Vec3::ZERO; } /// PID-based controller for stabilizing attitude; keeps the cyberbike upright. -pub(crate) fn falling_cat( +pub(super) fn falling_cat( mut bike_query: Query<(&Transform, &mut ExternalForce, &mut CatControllerState)>, time: Res