Beispiel #1
0
        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));
        }
Beispiel #2
0
        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)));
        }
Beispiel #3
0
        //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));
            }
        }
Beispiel #4
0
        //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)));
        }
Beispiel #5
0
 static Vector3 ShapePosition(IShapeVertices shape)
 {
     return(shape.PositioningMatrix.MultiplyPoint3x4(Vector3.zero));
 }
Beispiel #6
0
 //Calculate Function
 static Vector3 PrjectionShapeDirction(IShapeVertices shapeA, IShapeVertices shapeB)
 {
     return((ShapePosition(shapeA) - ShapePosition(shapeB)).normalized);
 }
Beispiel #7
0
        static bool ShapeDirctionOfRayCast(IShapeVertices shape, Vector3 rayOrigin, Vector3 rayDirction)
        {
            Vector3 shapeDirction = (ShapePosition(shape) - rayOrigin).normalized;

            return(Vector3.Dot(shapeDirction, rayDirction) > 0);
        }