/*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);
    }
 /*
  * Circle V Circle
  */
 public static bool detectCollision(CircleHull2D a, CircleHull2D b)
 {
     if (a.radius + b.radius >= Vector2.Distance(a.position, b.position))
     {
         return(true);
     }
     return(false);//failed
 }
    public static Vector2 getMinMaxProjectionValuesOnNorm(CircleHull2D circle, Vector2 norm)
    {
        float a, b;
        int   axis = norm.x != 0 ? 0 : 1; //just to make a scaler, but in case the x axis is zero, and if they are both zero then what the hell u doing with a normal (0,0)

        a = (proj(circle.position, norm)[axis] - circle.radius) / norm[axis];
        b = (proj(circle.position, norm)[axis] + circle.radius) / norm[axis];
        return(new Vector2(a, b));
    }
    /*
     * Circle V OBB
     */
    public static bool detectCollision(CircleHull2D circle, OBBHull2D square)
    {
        Vector2 closestPoint = square.GetClosestPoint(circle.position);

        Debug.DrawLine(new Vector3(closestPoint.x, closestPoint.y, 0), circle.position);
        if (circle.radius > Vector2.Distance(circle.position, closestPoint))
        {
            return(true);
        }
        return(false);
    }
    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
    }
    //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);
    }
Exemple #7
0
 public abstract bool TestCollisionVsCircle(CircleHull2D circle, ref Collision c);
 public override bool TestCollisionVsCircle(CircleHull2D circle, ref Collision c)
 {
     return(circle.TestCollisionVsOBB(this, ref c));
 }
Exemple #9
0
    public override bool TestCollisionVsCircle(CircleHull2D circle, ref Collision c)
    {
        //Call circle, flip arguments <=== ///What does this mean\\\?

        return(circle.TestCollisionVsAABB(this, ref c));
    }
Exemple #10
0
    public override bool TestCollisionVsCircle(CircleHull2D circle, ref Collision col)
    {
        //Collision test passes if(distance between them <= sum of radii)
        //Optimize: by ^2 both sides
        //1)    Get particles' positions(centers)
        //2)    Take difference between centers
        //3)    distance^2 = dot(diff, diff)
        //4)    summ of radii
        //5)    summ of radii ^2
        //6)    Test: dist^2 <= summ^2

        Debug.Log("CVC test start");

        Vector2 positionA = circle.transform.position;
        Vector2 positionB = this.transform.position;

        Vector2 diff = positionB - positionA;

        float distance = (diff.x * diff.x) + (diff.y * diff.y); //distance squared

        float sumOfRadii = radius + circle.radius;

        float squaredSumOfRadii = sumOfRadii * sumOfRadii;

        if (distance <= squaredSumOfRadii)
        {
            Debug.Log("CVC test pass");
            hitExplode = true;

            //Assign objects
            col.a = this;
            col.b = circle;



            //Calculate contact normal - is also the contact direction
            distance = Mathf.Sqrt(distance);
            col.contacts[0].normal = diff * (1 / distance);

            //Calculate contact point => center of the overlap
            //take the diff
            //magnitude = distance
            //normalise by /magnitude
            Vector2 e0 = col.contacts[0].normal * -radius;
            Vector2 e1 = col.contacts[0].normal * circle.radius;
            col.contacts[0].point = (e0 + e1) * 0.5f;

            //Calculate interpenetration depth
            //subtract distance from sum of radii => interpen depth

            col.interpenDepth = sumOfRadii - distance;

            return(true);
        }
        else
        {
            Debug.Log("CVC test fail");

            return(false);
        }
    }