From 78385180e7f26d4f6f191d3b7313399a4962434b Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Tue, 28 Nov 2023 01:22:05 -0600 Subject: [PATCH] idk why forward/backward is so much weaker than rotation --- server/src/main.rs | 78 +++++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 32 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index 4e1b5949700aed6b6a5dd352d6cdb71e71b88f54..43e846167a344eed096e28de7c811ea5e784e857 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -3,7 +3,6 @@ use std::net::Ipv4Addr; use bevy::utils::tracing; use bevy::{ecs::event::ManualEventReader, prelude::*}; use bevy::math::{vec2, vec3}; -use bevy_rapier2d::na::{Rotation2, SVector}; use bevy_rapier2d::prelude::*; use bevy_twite::{twite::frame::MessageType, ServerEvent, TwiteServerConfig, TwiteServerPlugin}; use component::*; @@ -17,8 +16,8 @@ pub mod packet; const SCALE: f32 = 10.0; const EARTH_SIZE: f32 = 1000.0; const GRAVITY: f32 = 0.02; -const PART_HALF_SIZE: f32 = 25.0 / SCALE; -const THRUSTER_FORCE: f32 = 0.001; +const PART_HALF_SIZE: f32 = 25.0; +const THRUSTER_FORCE: f32 = 0.02; fn main() { let subscriber = tracing_subscriber::FmtSubscriber::new(); @@ -40,17 +39,25 @@ fn main() { }) .add_plugins(RapierPhysicsPlugin::::pixels_per_meter(SCALE)) .add_plugins(TwiteServerPlugin) + .add_systems(Startup, setup_integration_parameters) .add_systems(Startup, spawn_planets) .add_systems(Update, on_message) .add_systems(Update, on_close) .add_systems(FixedUpdate, on_position_change) .add_systems(FixedUpdate, gravity_update) .add_systems(FixedUpdate, player_input_update) + //.insert_resource(Time::::from_seconds(1./20.)) .run(); info!("Goodbye!"); } +fn setup_integration_parameters(mut context: ResMut) { + context.integration_parameters.dt = 1./20.; + context.integration_parameters.joint_erp = 0.2; + context.integration_parameters.erp = 0.5; + context.integration_parameters.max_stabilization_iterations = 16; +} fn spawn_planets(mut commands: Commands) { info!("Spawning planets"); let earth_pos = Transform::from_xyz(0.0, 0.0, 0.0); @@ -60,7 +67,7 @@ fn spawn_planets(mut commands: Commands) { transform: TransformBundle::from(earth_pos), }) .insert(Collider::ball(EARTH_SIZE / SCALE)) - .insert(AdditionalMassProperties::Mass(10000.0)) + .insert(AdditionalMassProperties::Mass(4000.0)) .insert(ReadMassProperties::default()) .insert(RigidBody::Fixed); } @@ -106,13 +113,14 @@ fn on_message( .insert(Collider::cuboid(PART_HALF_SIZE / SCALE, PART_HALF_SIZE / SCALE)) .insert(AdditionalMassProperties::MassProperties(MassProperties { local_center_of_mass: vec2(0., 0.), - mass: 0.01, - principal_inertia: 50.0, + mass: 0.0001, + principal_inertia: 0.005, })) .insert(ExternalImpulse { impulse: Vec2::ZERO, torque_impulse: 0., }) + .insert(ExternalForce::default()) .insert(ReadMassProperties::default()) .insert(RigidBody::Dynamic) .id() @@ -352,15 +360,17 @@ fn on_position_change( } fn player_input_update( - mut player_and_body_query: Query<(Entity, &mut Player, &mut ExternalImpulse, &Transform)>, + mut player_and_body_query: Query<(Entity, &mut Player, &mut ExternalForce, &Transform)>, ) { - for (_, player, mut impulses, transform) in &mut player_and_body_query { + for (_, player, mut forces, transform) in &mut player_and_body_query { + forces.torque = 0.; + forces.force = Vec2::ZERO; if !(player.input.up || player.input.down || player.input.right || player.input.left) { continue; } - let mut fmul_bottom_left_thruster = 0.0; - let mut fmul_bottom_right_thruster = 0.0; - let mut fmul_top_left_thruster = 0.0; - let mut fmul_top_right_thruster = 0.0; + let mut fmul_bottom_left_thruster: f32 = 0.0; + let mut fmul_bottom_right_thruster: f32 = 0.0; + let mut fmul_top_left_thruster: f32 = 0.0; + let mut fmul_top_right_thruster: f32 = 0.0; if player.input.up { fmul_bottom_left_thruster -= 1.0; fmul_bottom_right_thruster -= 1.0; @@ -377,12 +387,16 @@ fn player_input_update( fmul_top_right_thruster += 1.0; fmul_bottom_left_thruster -= 1.0; } + fmul_top_left_thruster = fmul_top_left_thruster.clamp(-1.0, 1.0); + fmul_top_right_thruster = fmul_top_right_thruster.clamp(-1., 1.); + fmul_bottom_left_thruster = fmul_bottom_left_thruster.clamp(-1., 1.); + fmul_bottom_right_thruster = fmul_bottom_right_thruster.clamp(-1., 1.); let rot = transform.rotation.to_euler(EulerRot::ZYX).0; if fmul_bottom_left_thruster != 0. { // we are applying a force to the bottom left thruster, so do the math to figure out where it is - let bl_thruster_uncast = vec3(-PART_HALF_SIZE, -PART_HALF_SIZE, 0.0); + let bl_thruster_uncast = vec3(-PART_HALF_SIZE/SCALE, -PART_HALF_SIZE/SCALE, 0.0); // so it turns out nalgeba is useless. because bevy. bevy makes everything difficult for physics let bl_thruster_cast = vec2(bl_thruster_uncast.x * rot.cos() - bl_thruster_uncast.y * rot.sin(), bl_thruster_uncast.x * rot.sin() + bl_thruster_uncast.y * rot.cos()); @@ -390,47 +404,47 @@ fn player_input_update( let bl_thruster_force = fmul_bottom_left_thruster * THRUSTER_FORCE; - let bl_thruster_vec = vec2(-bl_thruster_force * rot.sin(), bl_thruster_force * rot.cos()); - let bl_impulse = ExternalImpulse::at_point(bl_thruster_vec, bl_thruster_cast, transform.translation.xy()); - impulses.impulse += bl_impulse.impulse; - impulses.torque_impulse += bl_impulse.torque_impulse; + let bl_thruster_vec = vec2(-bl_thruster_force / SCALE * rot.sin(), bl_thruster_force / SCALE * rot.cos()); + let bl_force = ExternalForce::at_point(bl_thruster_vec, bl_thruster_cast, transform.translation.xy()); + forces.force += bl_force.force; + forces.torque += bl_force.torque; } if fmul_bottom_right_thruster != 0. { - let br_thruster_uncast = vec3(PART_HALF_SIZE, -PART_HALF_SIZE, 0.0); + let br_thruster_uncast = vec3(PART_HALF_SIZE/SCALE, -PART_HALF_SIZE/SCALE, 0.0); let br_thruster_cast = vec2(br_thruster_uncast.x * rot.cos() - br_thruster_uncast.y * rot.sin(), br_thruster_uncast.x * rot.sin() + br_thruster_uncast.y * rot.cos()); let br_thruster_cast = br_thruster_cast + transform.translation.xy(); let br_thruster_force = fmul_bottom_right_thruster * THRUSTER_FORCE; - let br_thruster_vec = vec2(-br_thruster_force * rot.sin(), br_thruster_force * rot.cos()); - let br_impulse = ExternalImpulse::at_point(br_thruster_vec, br_thruster_cast, transform.translation.xy()); - impulses.impulse += br_impulse.impulse; - impulses.torque_impulse += br_impulse.torque_impulse; + let br_thruster_vec = vec2(-br_thruster_force / SCALE * rot.sin(), br_thruster_force / SCALE * rot.cos()); + let br_force = ExternalForce::at_point(br_thruster_vec, br_thruster_cast, transform.translation.xy()); + forces.force += br_force.force; + forces.torque += br_force.torque; } if fmul_top_left_thruster != 0. { - let tl_thruster_uncast = vec3(-PART_HALF_SIZE, PART_HALF_SIZE, 0.0); + let tl_thruster_uncast = vec3(-PART_HALF_SIZE/SCALE, PART_HALF_SIZE/SCALE, 0.0); let tl_thruster_cast = vec2(tl_thruster_uncast.x * rot.cos() - tl_thruster_uncast.y * rot.sin(), tl_thruster_uncast.x * rot.sin() + tl_thruster_uncast.y * rot.cos()); let tl_thruster_cast = tl_thruster_cast + transform.translation.xy(); let tl_thruster_force = fmul_top_left_thruster * THRUSTER_FORCE; - let tl_thruster_vec = vec2(-tl_thruster_force * rot.sin(), tl_thruster_force * rot.cos()); - let tl_impulse = ExternalImpulse::at_point(tl_thruster_vec, tl_thruster_cast, transform.translation.xy()); - impulses.impulse += tl_impulse.impulse; - impulses.torque_impulse += tl_impulse.torque_impulse; + let tl_thruster_vec = vec2(-tl_thruster_force / SCALE * rot.sin(), tl_thruster_force / SCALE * rot.cos()); + let tl_force = ExternalForce::at_point(tl_thruster_vec, tl_thruster_cast, transform.translation.xy()); + forces.force += tl_force.force; + forces.torque += tl_force.torque; } if fmul_top_right_thruster != 0. { - let tr_thruster_uncast = vec3(PART_HALF_SIZE, PART_HALF_SIZE, 0.0); + let tr_thruster_uncast = vec3(PART_HALF_SIZE/SCALE, PART_HALF_SIZE/SCALE, 0.0); let tr_thruster_cast = vec2(tr_thruster_uncast.x * rot.cos() - tr_thruster_uncast.y * rot.sin(), tr_thruster_uncast.x * rot.sin() + tr_thruster_uncast.y * rot.cos()); let tr_thruster_cast = tr_thruster_cast + transform.translation.xy(); let tr_thruster_force = fmul_top_right_thruster * THRUSTER_FORCE; - let tr_thruster_vec = vec2(-tr_thruster_force * rot.sin(), tr_thruster_force * rot.cos()); - let tr_impulse = ExternalImpulse::at_point(tr_thruster_vec, tr_thruster_cast, transform.translation.xy()); - impulses.impulse += tr_impulse.impulse; - impulses.torque_impulse += tr_impulse.torque_impulse; + let tr_thruster_vec = vec2(-tr_thruster_force / SCALE * rot.sin(), tr_thruster_force / SCALE * rot.cos()); + let tr_force = ExternalForce::at_point(tr_thruster_vec, tr_thruster_cast, transform.translation.xy()); + forces.force += tr_force.force; + forces.torque += tr_force.torque; } }