From fe8f985d2c7ea672a5f886d7d0df064f26bd2cb4 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 7 Dec 2024 15:43:00 +0100 Subject: improved physics for AI --- src/crepe/system/AISystem.cpp | 2 +- src/crepe/system/CollisionSystem.cpp | 14 --------- src/crepe/system/PhysicsSystem.cpp | 57 +++++++++++++++++------------------- 3 files changed, 28 insertions(+), 45 deletions(-) (limited to 'src/crepe/system') diff --git a/src/crepe/system/AISystem.cpp b/src/crepe/system/AISystem.cpp index 55dc14c..324ee5f 100644 --- a/src/crepe/system/AISystem.cpp +++ b/src/crepe/system/AISystem.cpp @@ -130,7 +130,7 @@ vec2 AISystem::arrive(const AI & ai) { float distance = to_target.length(); if (distance > 0.0f) { float speed = distance / ai.arrive_deceleration; - speed = std::min(speed, rigidbody.data.max_linear_velocity.length()); + speed = std::min(speed, rigidbody.data.max_linear_velocity); vec2 desired_velocity = to_target * (speed / distance); return desired_velocity - rigidbody.data.linear_velocity; diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 6b1954e..0483693 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -182,11 +182,7 @@ CollisionSystem::collision_handler(CollisionInternal & data1, CollisionInternal vec2 collider_pos2 = this->get_current_position(collider2.offset, data2.transform, data2.rigidbody); resolution = this->get_circle_box_resolution(collider1, collider2, collider_pos1, -<<<<<<< HEAD collider_pos2); -======= - collider_pos2, false); ->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4 break; } } @@ -272,12 +268,7 @@ vec2 CollisionSystem::get_circle_circle_resolution(const CircleCollider & circle vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_collider, const BoxCollider & box_collider, const vec2 & circle_position, -<<<<<<< HEAD const vec2 & box_position) const { -======= - const vec2 & box_position, - bool inverse) const { ->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4 vec2 delta = circle_position - box_position; // Compute half-dimensions of the box @@ -299,11 +290,6 @@ vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_co // Compute penetration depth float penetration_depth = circle_collider.radius - distance; -<<<<<<< HEAD - -======= - if (inverse) collision_normal = -collision_normal; ->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4 // Compute the resolution vector vec2 resolution = collision_normal * penetration_depth; diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index ebf4439..ab77b35 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -11,11 +11,12 @@ using namespace crepe; void PhysicsSystem::update() { + double dt = LoopTimer::get_instance().get_delta_time(); ComponentManager & mgr = this->mediator.component_manager; RefVector rigidbodies = mgr.get_components_by_type(); RefVector transforms = mgr.get_components_by_type(); - double gravity = Config::get_instance().physics.gravity; + float gravity = Config::get_instance().physics.gravity; for (Rigidbody & rigidbody : rigidbodies) { if (!rigidbody.active) continue; @@ -28,17 +29,27 @@ void PhysicsSystem::update() { if (rigidbody.data.gravity_scale > 0) { rigidbody.data.linear_velocity.y += (rigidbody.data.mass * rigidbody.data.gravity_scale - * gravity); + * gravity * dt); } - // Add damping + // Add coefficient rotation if (rigidbody.data.angular_velocity_coefficient > 0) { rigidbody.data.angular_velocity - *= rigidbody.data.angular_velocity_coefficient; + *= std::pow(rigidbody.data.angular_velocity_coefficient, dt); + } - if (rigidbody.data.linear_velocity_coefficient.x > 0 - && rigidbody.data.linear_velocity_coefficient.y > 0) { - rigidbody.data.linear_velocity - *= rigidbody.data.linear_velocity_coefficient; + + // Add coefficient movement horizontal + if (rigidbody.data.linear_velocity_coefficient.x > 0) + { + rigidbody.data.linear_velocity.x + *= std::pow(rigidbody.data.linear_velocity_coefficient.x, dt); + } + + // Add coefficient movement horizontal + if (rigidbody.data.linear_velocity_coefficient.y > 0) + { + rigidbody.data.linear_velocity.y + *= std::pow(rigidbody.data.linear_velocity_coefficient.y, dt); } // Max velocity check @@ -51,40 +62,26 @@ void PhysicsSystem::update() { rigidbody.data.angular_velocity = -rigidbody.data.max_angular_velocity; } - - if (rigidbody.data.linear_velocity.x - > rigidbody.data.max_linear_velocity.x) { - rigidbody.data.linear_velocity.x - = rigidbody.data.max_linear_velocity.x; - } else if (rigidbody.data.linear_velocity.x - < -rigidbody.data.max_linear_velocity.x) { - rigidbody.data.linear_velocity.x - = -rigidbody.data.max_linear_velocity.x; - } - - if (rigidbody.data.linear_velocity.y - > rigidbody.data.max_linear_velocity.y) { - rigidbody.data.linear_velocity.y - = rigidbody.data.max_linear_velocity.y; - } else if (rigidbody.data.linear_velocity.y - < -rigidbody.data.max_linear_velocity.y) { - rigidbody.data.linear_velocity.y - = -rigidbody.data.max_linear_velocity.y; + + // Set max velocity to maximum length + if(rigidbody.data.linear_velocity.length() > rigidbody.data.max_linear_velocity) { + rigidbody.data.linear_velocity.normalize(); + rigidbody.data.linear_velocity *= rigidbody.data.max_linear_velocity; } // Move object if (!rigidbody.data.constraints.rotation) { - transform.rotation += rigidbody.data.angular_velocity; + transform.rotation += rigidbody.data.angular_velocity * dt; transform.rotation = std::fmod(transform.rotation, 360.0); if (transform.rotation < 0) { transform.rotation += 360.0; } } if (!rigidbody.data.constraints.x) { - transform.position.x += rigidbody.data.linear_velocity.x; + transform.position.x += rigidbody.data.linear_velocity.x * dt; } if (!rigidbody.data.constraints.y) { - transform.position.y += rigidbody.data.linear_velocity.y; + transform.position.y += rigidbody.data.linear_velocity.y * dt; } } } -- cgit v1.2.3