feat: Static & Mass Consideration For Rigidbodies
This commit is contained in:
parent
bd43d39367
commit
9556be6f17
|
@ -62,9 +62,31 @@ public class PhysicsEngine2D : IPhysicsEngine2D
|
||||||
|
|
||||||
if (collisionDetector.TryDetect(colliderX, colliderY, out CollisionDetectionInformation information))
|
if (collisionDetector.TryDetect(colliderX, colliderY, out CollisionDetectionInformation information))
|
||||||
{
|
{
|
||||||
Vector2D displacementVector = .5f * information.Normal * information.Penetration;
|
Vector2D displacementVector = information.Normal * information.Penetration;
|
||||||
information.Left.Transform.Position -= displacementVector;
|
|
||||||
|
|
||||||
|
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;
|
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.Left.Recalculate();
|
||||||
information.Right.Recalculate();
|
information.Right.Recalculate();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue