diff --git a/godot/car_player.tscn b/godot/car_player.tscn index 8fe5e07..9602b67 100644 --- a/godot/car_player.tscn +++ b/godot/car_player.tscn @@ -8,7 +8,7 @@ [ext_resource type="PackedScene" uid="uid://6qwqncti3xr2" path="res://Models/CarParts/SM_Veh_Hatch_01_Fenders_02.fbx" id="6_xu64x"] [sub_resource type="Curve" id="Curve_dpk6q"] -_data = [Vector2(0.962441, 0), 0.0, 0.0, 0, 0, Vector2(1, 1), 0.0, 0.0, 0, 0] +_data = [Vector2(0.962441, 0), 0.0, 0.0, 0, 0, Vector2(1, 0.32967), 0.0, 0.0, 0, 0] point_count = 2 [sub_resource type="Curve" id="Curve_htvme"] @@ -34,7 +34,6 @@ oversteer_curve = SubResource("Curve_dpk6q") oversteer_curve_x_scale = 40.0 understeer_curve = SubResource("Curve_htvme") understeer_curve_x_scale = 40.0 -traction_recovery_speed = 20.0 collision_layer = 7 collision_mask = 3 mass = 1000.0 @@ -45,9 +44,12 @@ custom_integrator = true continuous_cd = true max_contacts_reported = 128 contact_monitor = true +linear_damp_mode = 1 +linear_damp = 0.5 [node name="Camera3D" type="Camera3D" parent="."] -transform = Transform3D(-1, -1.36051e-08, -8.63576e-08, -2.87879e-08, 0.983969, 0.178338, 8.25469e-08, 0.178338, -0.983969, 4.58152e-07, 1.76689, -2.8478) +transform = Transform3D(-1, -2.02334e-08, -8.50491e-08, -2.87879e-08, 0.994803, 0.10182, 8.25469e-08, 0.10182, -0.994803, 4.6449e-07, 2.24116, -4.7912) +fov = 68.9128 [node name="Body" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0.687824, 0.174572) diff --git a/src/car_physics.cpp b/src/car_physics.cpp index 2fc966c..41b83e3 100644 --- a/src/car_physics.cpp +++ b/src/car_physics.cpp @@ -52,7 +52,7 @@ void CarPhysics::process_oversteer(double delta_time) { float const target = this->current_steering == 0.f ? 0.f : (this->evaluate_oversteer_curve(this->local_velocity.z) + (this->brake ? this->handbrake_oversteer : 0.f)) * Math::sign(this->current_steering); - if(Math::abs(target) >= Math::abs(this->current_oversteer) && Math::sign(target) == Math::sign(this->current_oversteer)) + if(target != 0.f && Math::abs(target) >= Math::abs(this->current_oversteer) && Math::sign(target) == Math::sign(this->current_oversteer)) this->current_oversteer = target; else this->current_oversteer = Math::move_toward(this->current_oversteer, target, float(delta_time * this->traction_recovery_speed)); @@ -77,15 +77,15 @@ void CarPhysics::_integrate_forces(PhysicsDirectBodyState3D *state) { this->last_velocity = state->get_linear_velocity(); state->set_linear_velocity( (this->is_grounded() - ? (this->local_to_world_velocity() + Vector3{0, float(-9.8f * state->get_step()), 0}) + ? (this->local_to_world_velocity() + Vector3{0, -0.05f, 0}) : (this->get_linear_velocity() + Vector3{0, float(-9.8f * state->get_step()), 0}))); } void CarPhysics::integrate_steering(PhysicsDirectBodyState3D *state) { float target_x_velocity = 0.f; if(this->local_velocity.z != 0.f) { - Vector3 const steering_angle_vel = this->get_global_basis().get_column(1) * ( - this->current_steering * Math::sign(this->local_velocity.z + this->current_oversteer * this->oversteer_steering_speed)); + Vector3 const steering_angle_vel = this->get_global_basis().get_column(1) * + (this->current_steering * Math::sign(this->local_velocity.z) + this->current_oversteer * this->oversteer_steering_speed); state->set_angular_velocity(steering_angle_vel * (1.0f-this->current_understeer)); target_x_velocity = this->current_steering * this->steering_inward_speed; } else { @@ -104,17 +104,12 @@ void CarPhysics::integrate_engine_acceleration(PhysicsDirectBodyState3D *state) this->local_velocity.z = 0.f; } - this->local_velocity.z = Math::move_toward( - this->local_velocity.z, - this->get_true_target_speed(), - float(this->get_current_acceleration() * state->get_step())); + this->local_velocity.z = Math::move_toward(this->local_velocity.z, this->get_true_target_speed(), float(this->get_current_acceleration() * state->get_step())); } void CarPhysics::integrate_oversteer(PhysicsDirectBodyState3D *state) { - this->local_velocity.x = Math::clamp( - this->local_velocity.x - this->local_velocity.z * this->current_oversteer * this->slide_speed_acceleration, - -this->max_slide_speed, - this->max_slide_speed); + this->local_velocity.x = Math::clamp(this->local_velocity.x - this->local_velocity.z * this->current_oversteer * this->slide_speed_acceleration, + -this->max_slide_speed, this->max_slide_speed); } void CarPhysics::on_body_shape_entered(RID body_rid, Node *body, int body_shape_index, int local_shape_index) { diff --git a/src/car_physics.hpp b/src/car_physics.hpp index 947a104..b909d17 100644 --- a/src/car_physics.hpp +++ b/src/car_physics.hpp @@ -93,7 +93,7 @@ private: float engine_brake_force{30.f}; float handbrake_force{40.f}; float handbrake_oversteer{1.f}; - float traction_recovery_speed{100.f}; + float traction_recovery_speed{1.f}; float max_slide_speed{20.f}; float slide_speed_acceleration{0.05f}; float oversteer_speed_penalty{5.f}; diff --git a/src/car_player.hpp b/src/car_player.hpp index f924b80..3138c32 100644 --- a/src/car_player.hpp +++ b/src/car_player.hpp @@ -25,7 +25,7 @@ private: const float max_speed{40.f}; const float max_speed_reverse{10.f}; - const float steering_factor{2.f}; + const float steering_factor{0.7f}; }; };