Пример #1
0
    /*WORKING*/
    public static HullCollision2D detectCollisionResponse(CircleHull2D circle, AABBHull2D square)
    {
        float   dist = Vector2.Distance(circle.position, square.GetClosestPoint(circle.position));
        Vector2 squareClosestPoint = square.GetClosestPoint(circle.position);
        Vector2 circleClosestPoint = circle.GetClosestPoint(squareClosestPoint); //need to do second

        Debug.DrawLine(squareClosestPoint, circleClosestPoint);
        if (circle.radius > dist)
        {
            Vector2 pen     = squareClosestPoint - circleClosestPoint;
            Vector2 penNorm = pen.normalized;
            if (penNorm.x > penNorm.y)
            {
                pen.y = 0.0f;
            }
            else
            {
                pen.x = 0.0f;
            }
            HullCollision2D collision;
            collision = new HullCollision2D(circle, square, penNorm.normalized, pen.magnitude);
            return(collision);
        }
        return(null);
    }
Пример #2
0
    public static HullCollision2D detectCollisionResponse(AABBHull2D a, AABBHull2D b)
    {
        Dictionary <Vector2, float> axisValues = new Dictionary <Vector2, float>(); //norm to the overlap value

        axisValues.Add(Vector2.up, checkAxisPenetration(a, b, Vector2.up));
        axisValues.Add(Vector2.right, checkAxisPenetration(a, b, Vector2.right));
        Dictionary <Vector2, float> .Enumerator enumerator = axisValues.GetEnumerator();
        enumerator.MoveNext();
        KeyValuePair <Vector2, float> bestPenetration = enumerator.Current; //need to set one to compare too, no null value to just allow all checking in the for loop

        if (bestPenetration.Value == 0.0f)
        {
            return(null);
        }
        while (enumerator.MoveNext())
        {
            if (Mathf.Abs(enumerator.Current.Value) < Mathf.Abs(bestPenetration.Value))
            {
                bestPenetration = enumerator.Current;
            }
            if (bestPenetration.Value == 0.0f)
            {
                return(null);
            }
        }
        HullCollision2D collision;

        collision = new HullCollision2D(a, b, bestPenetration.Key, Mathf.Abs(bestPenetration.Value));
        return(collision);
    }
Пример #3
0
    public static HullCollision2D detectCollisionResponse(CircleHull2D a, CircleHull2D b)
    {
        float dist = Vector2.Distance(a.position, b.position);

        if (a.radius + b.radius > dist)
        {
            Vector2         penetration = (a.position - b.position).normalized;
            float           penAmount   = (a.radius + b.radius) - Vector2.Distance(a.position, b.position);
            HullCollision2D collision   = new HullCollision2D(a, b, penetration, penAmount);
            //collision.closingVelocity = -(lft.velocity - rgt.velocity) *(lft.velocity - rgt.velocity).normalized;
            return(collision);
        }
        return(null);//failed
    }
Пример #4
0
 void FixedUpdate()
 {
     for (int i = 0; i < mPhysicsObjects.Count; i++)
     {
         for (int j = i + 1; j < mPhysicsObjects.Count; j++)
         {
             //bool coll = mPhysicsObjects[i].detectCollision(mPhysicsObjects[j]);
             HullCollision2D collision = mPhysicsObjects[i].detectCollisionResponse(mPhysicsObjects[j]);
             if (collision != null)
             {
                 collision.a.OnCollision(collision.b); //info is still valid before resolved called
                 collision.b.OnCollision(collision.a);
                 collision.Resolve(Time.fixedDeltaTime);
             }
         }
     }
 }
Пример #5
0
    public static HullCollision2D detectCollisionResponse(OBBHull2D a, OBBHull2D b)
    {
        Dictionary <Vector2, float> axisValues = new Dictionary <Vector2, float>(); //norm to the overlap value

        axisValues.Add(a.getXNormal(), checkAxisPenetration(a, b, a.getXNormal()));
        axisValues.Add(a.getYNormal(), checkAxisPenetration(a, b, a.getYNormal()));
        if (a.rotation != b.rotation)
        {
            axisValues.Add(b.getXNormal(), checkAxisPenetration(a, b, b.getXNormal()));
            axisValues.Add(b.getYNormal(), checkAxisPenetration(a, b, b.getYNormal()));
        }
        Dictionary <Vector2, float> .Enumerator enumerator = axisValues.GetEnumerator();
        enumerator.MoveNext();
        Vector2 pos = a.position;
        KeyValuePair <Vector2, float> bestPenetration = enumerator.Current; //need to set one to compare too, no null value to just allow all checking in the for loop

        if (bestPenetration.Value == 0.0f)
        {
            return(null);
        }
        while (enumerator.MoveNext())
        {
            if (Mathf.Abs(enumerator.Current.Value) < Mathf.Abs(bestPenetration.Value))
            {
                bestPenetration = enumerator.Current;
            }
            if (bestPenetration.Value == 0.0f)
            {
                return(null);
            }
        }
        HullCollision2D collision;
        Vector2         norm = bestPenetration.Key;

        if (bestPenetration.Value <= 0.0f) //ooh this was an easy thing to miss
        {
            norm *= -1.0f;
        }

        collision = new HullCollision2D(a, b, norm, Mathf.Abs(bestPenetration.Value));
        //collision.contactPoint = pos;
        return(collision);
    }
Пример #6
0
    //TODO
    public static HullCollision2D detectCollisionResponse(CircleHull2D circle, OBBHull2D square)
    {
        Vector2 closestPointSquare = square.GetClosestPoint(circle.position);
        Vector2 closestPointCircle = circle.GetClosestPoint(closestPointSquare);

        Debug.DrawLine(new Vector3(closestPointSquare.x, closestPointSquare.y, 0), new Vector3(closestPointCircle.x, closestPointCircle.y, 0));
        if (circle.radius > Vector2.Distance(circle.position, closestPointSquare))
        {
            Vector2         penNorm = closestPointSquare - closestPointCircle;
            HullCollision2D collision;
            if (penNorm.x > 0.0f)
            {
                collision = new HullCollision2D(circle, square, penNorm.normalized, penNorm.magnitude);
            }
            else
            {
                collision = new HullCollision2D(circle, square, penNorm.normalized, penNorm.magnitude);
            }
            return(collision);
        }
        return(null);
    }