fix de-penetrator

This commit is contained in:
Joe Ardent 2023-02-02 17:26:28 -08:00
parent 1d9ba17911
commit a5b9e549db
4 changed files with 108 additions and 97 deletions

View file

@ -122,7 +122,7 @@ pub(super) fn surface_fix(
cgroups.memberships = Group::NONE; cgroups.memberships = Group::NONE;
cgroups.filters = Group::NONE; cgroups.filters = Group::NONE;
commands.entity(entity).insert(Tunneling { commands.entity(entity).insert(Tunneling {
frames: 5, frames: 6,
dir: -hit.1.normal, dir: -hit.1.normal,
}); });
} }
@ -135,22 +135,24 @@ pub(super) fn tunnel_out(
( (
Entity, Entity,
&mut Tunneling, &mut Tunneling,
&mut CollisionGroups,
&mut ExternalForce, &mut ExternalForce,
&mut CollisionGroups,
), ),
With<CyberWheel>, With<CyberWheel>,
>, >,
mprops: Query<&ReadMassProperties, With<CyberBikeBody>>,
settings: Res<MovementSettings>, settings: Res<MovementSettings>,
) { ) {
for (entity, mut tunneling, mut cgroups, mut force) in wheel_query.iter_mut() { let mprops = mprops.single();
for (entity, mut tunneling, mut force, mut cgroups) in wheel_query.iter_mut() {
if tunneling.frames == 0 { if tunneling.frames == 0 {
commands.entity(entity).remove::<Tunneling>(); commands.entity(entity).remove::<Tunneling>();
cgroups.memberships = BIKE_WHEEL_COLLISION_GROUP.0; force.force = Vec3::ZERO;
cgroups.filters = BIKE_WHEEL_COLLISION_GROUP.1; (cgroups.memberships, cgroups.filters) = BIKE_WHEEL_COLLISION_GROUP;
continue; continue;
} }
tunneling.frames -= 1; tunneling.frames -= 1;
force.force += tunneling.dir * settings.gravity * 1.1; force.force = tunneling.dir * settings.gravity * 1.5 * mprops.0.mass;
#[cfg(feature = "inspector")] #[cfg(feature = "inspector")]
dbg!(&tunneling); dbg!(&tunneling);
} }

86
src/bike/body.rs Normal file
View file

@ -0,0 +1,86 @@
use bevy::{
prelude::{AssetServer, BuildChildren, Commands, Quat, Res, SpatialBundle, Transform, Vec3},
scene::SceneBundle,
};
use bevy_rapier3d::prelude::{
Ccd, Collider, ColliderMassProperties, CollisionGroups, Damping, ExternalForce, Friction,
ReadMassProperties, Restitution, RigidBody, Sleeping, TransformInterpolation, Velocity,
};
use super::{spawn_tires, CyberBikeBody, Meshterial, WheelConfig, BIKE_BODY_COLLISION_GROUP};
use crate::{action::CatControllerState, planet::PLANET_RADIUS};
pub(super) fn spawn_cyberbike(
mut commands: Commands,
asset_server: Res<AssetServer>,
wheel_conf: Res<WheelConfig>,
mut meshterials: Meshterial,
) {
let altitude = PLANET_RADIUS - 220.0;
let mut xform = Transform::from_translation(Vec3::X * altitude)
.with_rotation(Quat::from_axis_angle(Vec3::Z, -89.0f32.to_radians()));
//.with_rotation(Quat::from_axis_angle(Vec3::X, 140.0f32.to_radians()));
let right = xform.right() * 350.0;
xform.translation += right;
let damping = Damping {
angular_damping: 2.0,
linear_damping: 0.1,
};
let friction = Friction {
coefficient: 0.3,
..Default::default()
};
let restitution = Restitution {
coefficient: 0.0,
..Default::default()
};
let mass_properties = ColliderMassProperties::Density(0.9);
let (membership, filter) = BIKE_BODY_COLLISION_GROUP;
let bike_collision_group = CollisionGroups::new(membership, filter);
let scene = asset_server.load("cb-no-y_up.glb#Scene0");
let spatialbundle = SpatialBundle {
transform: xform,
..Default::default()
};
let bike = commands
.spawn(RigidBody::Dynamic)
.insert(spatialbundle)
.insert((
Collider::capsule(Vec3::new(0.0, 0.0, -1.0), Vec3::new(0.0, 0.0, 1.0), 0.50),
bike_collision_group,
mass_properties,
damping,
restitution,
friction,
Sleeping::disabled(),
Ccd { enabled: true },
ReadMassProperties::default(),
))
.insert(TransformInterpolation {
start: None,
end: None,
})
.insert(Velocity::zero())
.insert(ExternalForce::default())
.with_children(|rider| {
rider.spawn(SceneBundle {
scene,
..Default::default()
});
})
.insert(CyberBikeBody)
.insert(CatControllerState::default())
.id();
spawn_tires(&mut commands, &xform, bike, &wheel_conf, &mut meshterials);
}

View file

@ -1,15 +1,21 @@
mod body;
mod components; mod components;
mod systems; mod wheels;
use bevy::prelude::{App, Plugin, StartupStage}; use bevy::prelude::{App, Assets, Mesh, Plugin, ResMut, StandardMaterial, StartupStage};
use bevy_rapier3d::prelude::Group; use bevy_rapier3d::prelude::Group;
pub use self::components::*; pub(crate) use self::components::*;
use self::systems::spawn_cyberbike; use self::{body::spawn_cyberbike, wheels::spawn_tires};
pub const BIKE_BODY_COLLISION_GROUP: (Group, Group) = (Group::GROUP_1, Group::GROUP_1); pub const BIKE_BODY_COLLISION_GROUP: (Group, Group) = (Group::GROUP_1, Group::GROUP_1);
pub const BIKE_WHEEL_COLLISION_GROUP: (Group, Group) = (Group::GROUP_10, Group::GROUP_10); pub const BIKE_WHEEL_COLLISION_GROUP: (Group, Group) = (Group::GROUP_10, Group::GROUP_10);
type Meshterial<'a> = (
ResMut<'a, Assets<Mesh>>,
ResMut<'a, Assets<StandardMaterial>>,
);
pub struct CyberBikePlugin; pub struct CyberBikePlugin;
impl Plugin for CyberBikePlugin { impl Plugin for CyberBikePlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {

View file

@ -1,96 +1,13 @@
use bevy::prelude::{shape::UVSphere as Tire, *}; use bevy::prelude::{shape::UVSphere as Tire, *};
use bevy_rapier3d::prelude::{ use bevy_rapier3d::prelude::{
Ccd, Collider, ColliderMassProperties, CollisionGroups, Damping, ExternalForce, Friction, Ccd, Collider, ColliderMassProperties, CollisionGroups, Damping, ExternalForce, Friction,
MultibodyJoint, PrismaticJointBuilder, ReadMassProperties, Restitution, RigidBody, Sleeping, MultibodyJoint, PrismaticJointBuilder, Restitution, RigidBody, Sleeping,
TransformInterpolation, Velocity, TransformInterpolation,
}; };
use super::{ use super::{CyberWheel, Meshterial, WheelConfig, BIKE_WHEEL_COLLISION_GROUP};
CyberBikeBody, CyberWheel, WheelConfig, BIKE_BODY_COLLISION_GROUP, BIKE_WHEEL_COLLISION_GROUP,
};
use crate::{action::CatControllerState, planet::PLANET_RADIUS};
type Meshterial<'a> = ( pub fn spawn_tires(
ResMut<'a, Assets<Mesh>>,
ResMut<'a, Assets<StandardMaterial>>,
);
pub(super) fn spawn_cyberbike(
mut commands: Commands,
asset_server: Res<AssetServer>,
wheel_conf: Res<WheelConfig>,
mut meshterials: Meshterial,
) {
let altitude = PLANET_RADIUS - 220.0;
let mut xform = Transform::from_translation(Vec3::X * altitude)
.with_rotation(Quat::from_axis_angle(Vec3::Z, -89.0f32.to_radians()));
//.with_rotation(Quat::from_axis_angle(Vec3::X, 140.0f32.to_radians()));
let right = xform.right() * 350.0;
xform.translation += right;
let damping = Damping {
angular_damping: 2.0,
linear_damping: 0.1,
};
let friction = Friction {
coefficient: 0.0,
..Default::default()
};
let restitution = Restitution {
coefficient: 0.0,
..Default::default()
};
let mass_properties = ColliderMassProperties::Density(0.9);
let (membership, filter) = BIKE_BODY_COLLISION_GROUP;
let bike_collision_group = CollisionGroups::new(membership, filter);
let scene = asset_server.load("cb-no-y_up.glb#Scene0");
let spatialbundle = SpatialBundle {
transform: xform,
..Default::default()
};
let bike = commands
.spawn(RigidBody::Dynamic)
.insert(spatialbundle)
.insert((
Collider::capsule(Vec3::new(0.0, 0.0, -1.0), Vec3::new(0.0, 0.0, 1.0), 0.50),
bike_collision_group,
mass_properties,
damping,
restitution,
friction,
Sleeping::disabled(),
Ccd { enabled: true },
ReadMassProperties::default(),
))
.insert(TransformInterpolation {
start: None,
end: None,
})
.insert(Velocity::zero())
.insert(ExternalForce::default())
.with_children(|rider| {
rider.spawn(SceneBundle {
scene,
..Default::default()
});
})
.insert(CyberBikeBody)
.insert(CatControllerState::default())
.id();
spawn_tires(&mut commands, &xform, bike, &wheel_conf, &mut meshterials);
}
fn spawn_tires(
commands: &mut Commands, commands: &mut Commands,
xform: &Transform, xform: &Transform,
bike: Entity, bike: Entity,