static CollisionData ShapeProjectionOverlapWithPoint(IShapeVertices shape, Vector3 point, Vector3 projectionTo) { projectionTo = projectionTo.normalized; shape.MinMaxVertexProjection(projectionTo, out float min, out float max); float pointProjection = Vector3.Dot(point, projectionTo); return(new CollisionData(pointProjection > min && pointProjection < max, pointProjection - min, projectionTo)); }
static CollisionData IsShapeCollisedWithPoint(IShapeVertices shape, Vector3 point) { if (shape == null) { return(new CollisionData(false, 0)); } Vector3 dirctionProjection = ShapePosition(shape) - point; Vector3[] shapeEdgeNormals = shape.ShapeEdgeNoraml.ToArray(); return(CollidedCheck(dirctionProjection, shapeEdgeNormals, (Vector3 projectionTo) => ShapeProjectionOverlapWithPoint(shape, point, projectionTo))); }
//Projection static CollisionData ShapesProjectionOverlap(IShapeVertices shapeA, IShapeVertices shapeB, Vector3 projectionTo) { shapeA.MinMaxVertexProjection(projectionTo, out float minA, out float maxA); shapeB.MinMaxVertexProjection(projectionTo, out float minB, out float maxB); bool shapeOrder = shapeA.ShapePositionProjection(projectionTo) > shapeB.ShapePositionProjection(projectionTo); if (shapeOrder) { return(new CollisionData(maxB > minA, maxB - minA, projectionTo)); } else { return(new CollisionData(maxA > minB, maxA - minB, -projectionTo)); } }
//Collision public static CollisionData IsShapesCollided(IShapeVertices shapeA, IShapeVertices shapeB) { if (shapeA == null || shapeB == null) { return(new CollisionData(false, 0)); } if (shapeA == shapeB) { return(new CollisionData(false, 0)); } Vector3 dirctionProjection = PrjectionShapeDirction(shapeA, shapeB); Vector3[] shapeEdgeNormals = shapeA.ShapeEdgeNoraml.Union(shapeB.ShapeEdgeNoraml).ToArray(); return(CollidedCheck(dirctionProjection, shapeEdgeNormals, (Vector3 projectionTo) => ShapesProjectionOverlap(shapeA, shapeB, projectionTo))); }
static Vector3 ShapePosition(IShapeVertices shape) { return(shape.PositioningMatrix.MultiplyPoint3x4(Vector3.zero)); }
//Calculate Function static Vector3 PrjectionShapeDirction(IShapeVertices shapeA, IShapeVertices shapeB) { return((ShapePosition(shapeA) - ShapePosition(shapeB)).normalized); }
static bool ShapeDirctionOfRayCast(IShapeVertices shape, Vector3 rayOrigin, Vector3 rayDirction) { Vector3 shapeDirction = (ShapePosition(shape) - rayOrigin).normalized; return(Vector3.Dot(shapeDirction, rayDirction) > 0); }