From 9556be6f1728080435ff9cdc42bc6c64d47a7f3e Mon Sep 17 00:00:00 2001 From: Syntriax Date: Sat, 27 Jan 2024 15:07:40 +0300 Subject: [PATCH] feat: Static & Mass Consideration For Rigidbodies --- Engine.Physics2D/PhysicsEngine2D.cs | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/Engine.Physics2D/PhysicsEngine2D.cs b/Engine.Physics2D/PhysicsEngine2D.cs index a471e1d..5bdec77 100644 --- a/Engine.Physics2D/PhysicsEngine2D.cs +++ b/Engine.Physics2D/PhysicsEngine2D.cs @@ -62,9 +62,31 @@ public class PhysicsEngine2D : IPhysicsEngine2D if (collisionDetector.TryDetect(colliderX, colliderY, out CollisionDetectionInformation information)) { - Vector2D displacementVector = .5f * information.Normal * information.Penetration; - information.Left.Transform.Position -= displacementVector; - information.Right.Transform.Position += displacementVector; + Vector2D displacementVector = information.Normal * information.Penetration; + + + bool isStaticLeft = information.Left.RigidBody2D?.IsStatic ?? true; + bool isStaticRight = information.Right.RigidBody2D?.IsStatic ?? true; + + if (isStaticLeft && isStaticRight) + continue; + else if (isStaticLeft) + information.Right.Transform.Position += displacementVector; + else if (isStaticRight) + information.Left.Transform.Position -= displacementVector; + else + { + float leftMass = information.Left.RigidBody2D?.Mass ?? float.Epsilon; + float rightMass = information.Right.RigidBody2D?.Mass ?? float.Epsilon; + float massSum = leftMass + rightMass; + + float leftMomentumPercentage = leftMass / massSum; + float rightMomentumPercentage = rightMass / massSum; + + information.Right.Transform.Position += leftMomentumPercentage * displacementVector; + information.Left.Transform.Position -= rightMomentumPercentage * displacementVector; + } + information.Left.Recalculate(); information.Right.Recalculate(); }