feat: Basic Shape to Circle Collision Detection
This commit is contained in:
parent
ac09b78edd
commit
2bfd391286
|
@ -2,6 +2,7 @@ using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
using Syntriax.Engine.Core;
|
using Syntriax.Engine.Core;
|
||||||
using Syntriax.Engine.Physics2D.Abstract;
|
using Syntriax.Engine.Physics2D.Abstract;
|
||||||
|
using Syntriax.Engine.Physics2D.Primitives;
|
||||||
|
|
||||||
namespace Syntriax.Engine.Physics2D;
|
namespace Syntriax.Engine.Physics2D;
|
||||||
|
|
||||||
|
@ -30,9 +31,9 @@ public class CollisionDetector : ICollisionDetector
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool DetectCircleShape(ICircleCollider2D circleCollider, IShapeCollider2D shapeCollider, out CollisionDetectionInformation? collisionInformation)
|
private static bool DetectCircleShape(ICircleCollider2D circleCollider, IShapeCollider2D shapeCollider, out CollisionDetectionInformation? collisionInformation)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
return DetectShapeCircle(shapeCollider, circleCollider, out collisionInformation);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool DetectShapeShape(IShapeCollider2D left, IShapeCollider2D right, out CollisionDetectionInformation? collisionInformation)
|
private static bool DetectShapeShape(IShapeCollider2D left, IShapeCollider2D right, out CollisionDetectionInformation? collisionInformation)
|
||||||
|
@ -42,7 +43,39 @@ public class CollisionDetector : ICollisionDetector
|
||||||
|
|
||||||
private static bool DetectShapeCircle(IShapeCollider2D shapeCollider, ICircleCollider2D circleCollider, out CollisionDetectionInformation? collisionInformation)
|
private static bool DetectShapeCircle(IShapeCollider2D shapeCollider, ICircleCollider2D circleCollider, out CollisionDetectionInformation? collisionInformation)
|
||||||
{
|
{
|
||||||
throw new System.NotImplementedException();
|
collisionInformation = default;
|
||||||
|
|
||||||
|
{
|
||||||
|
Vector2D shapeToCircleProjectionVector = shapeCollider.Transform.Position.FromTo(circleCollider.CircleWorld.Center).Normalized;
|
||||||
|
|
||||||
|
Projection shapeProjection = shapeCollider.ShapeWorld.ToProjection(shapeToCircleProjectionVector);
|
||||||
|
Projection circleProjection = circleCollider.CircleWorld.ToProjection(shapeToCircleProjectionVector);
|
||||||
|
|
||||||
|
if (!shapeProjection.Overlaps(circleProjection, out float depth))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (collisionInformation == default || Math.Abs(collisionInformation.Penetration) > Math.Abs(depth))
|
||||||
|
collisionInformation = new(shapeCollider, circleCollider, shapeToCircleProjectionVector, depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
var vertices = shapeCollider.ShapeWorld.Vertices;
|
||||||
|
int count = vertices.Count;
|
||||||
|
|
||||||
|
for (int indexProjection = 0; indexProjection < count; indexProjection++)
|
||||||
|
{
|
||||||
|
Vector2D projectionVector = vertices[indexProjection].FromTo(vertices[(indexProjection + 1) % count]).Perpendicular().Normalized;
|
||||||
|
|
||||||
|
Projection shapeProjection = shapeCollider.ShapeWorld.ToProjection(projectionVector);
|
||||||
|
Projection circleProjection = circleCollider.CircleWorld.ToProjection(projectionVector);
|
||||||
|
|
||||||
|
if (!shapeProjection.Overlaps(circleProjection, out float depth))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (collisionInformation == default || Math.Abs(collisionInformation.Penetration) > Math.Abs(depth))
|
||||||
|
collisionInformation = new(shapeCollider, circleCollider, projectionVector, depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool DetectCircleCircle(ICircleCollider2D left, ICircleCollider2D right, out CollisionDetectionInformation? collisionInformation)
|
private static bool DetectCircleCircle(ICircleCollider2D left, ICircleCollider2D right, out CollisionDetectionInformation? collisionInformation)
|
||||||
|
|
Loading…
Reference in New Issue