protected static CollisionInfo CircleVSAABB(CircleHull circle, AABBHull AABB)
    {
        Vector3 circleBox = new Vector3(Mathf.Max(AABB.min.x + AABB.center.x, Mathf.Min(circle.GetCenter().x, AABB.max.x + AABB.center.x)),
            Mathf.Max(AABB.min.y + AABB.center.y, Mathf.Min(circle.GetCenter().y, AABB.max.y + AABB.center.y)),
            Mathf.Max(AABB.min.z + AABB.center.z, Mathf.Min(circle.GetCenter().z, AABB.max.z + AABB.center.z)));

        Vector3 distanceVec = circle.GetCenter() - circleBox;
        float distanceSQ = Vector3.Dot(distanceVec, distanceVec);
        if (distanceSQ > (circle.radius * circle.radius))
        {
            return null;
        }
        float distance = Mathf.Sqrt(distanceSQ);
        return new CollisionInfo(circle, AABB, -distanceVec.normalized, circle.radius - distance, circleBox);
    }
    protected static CollisionInfo CircleVSCircle(CircleHull circle1, CircleHull circle2)
    {
        float radiusSum = circle1.radius + circle2.radius;
        float totalRadius = (circle1.radius + circle2.radius) * (circle1.radius + circle2.radius);
        Vector3 centerDiff = (circle2.GetCenter() - circle1.GetCenter());
        float distanceSQ = Vector3.Dot(centerDiff, centerDiff);

        if (distanceSQ > totalRadius)
        {
            return null;
        }
        float distance = Mathf.Sqrt(distanceSQ);
        return new CollisionInfo(circle1, circle2, centerDiff / distance, radiusSum - distance,(circle1.GetCenter() + centerDiff * 0.5f));
    }
Example #3
0
    static public bool CircleVSCircle(CircleHull circle1, CircleHull circle2)
    {
        float   totalRadius = (circle1.radius + circle2.radius); //* (circle1.radius + circle2.radius);
        Vector2 distance    = (circle2.GetCenter() - circle1.GetCenter());

        if (Vector2.Dot(distance, distance) <= totalRadius)
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }
    static protected bool CircleVSAABB(CircleHull circle, AABBHull AABB)
    {
        Vector2 circleBox = new Vector2(Mathf.Max(AABB.min.x + AABB.center.x, Mathf.Min(circle.GetCenter().x, AABB.max.x + AABB.center.x)),
                                        Mathf.Max(AABB.min.y + AABB.center.y, Mathf.Min(circle.GetCenter().y, AABB.max.y + AABB.center.y)));

        Vector2 distance   = circle.GetCenter() - circleBox;
        float   distanceSQ = Vector2.Dot(distance, distance);

        if (distanceSQ <= (circle.radius * circle.radius))
        {
            return(true);
        }

        return(false);
    }
    static protected bool CircleVSOBB(CircleHull circle, OBBHull OBB)
    {
        Vector2 halfExtend  = (OBB.max - OBB.min) / 2;
        Vector2 circleInOBB = OBB.transform.InverseTransformPoint(circle.GetCenter());
        Vector2 circleBox   = new Vector2(Mathf.Max(-halfExtend.x, Mathf.Min(circleInOBB.x, halfExtend.x)),
                                          Mathf.Max(-halfExtend.y, Mathf.Min(circleInOBB.y, halfExtend.y)));

        Vector2 distance   = circleInOBB - circleBox;
        float   distanceSQ = Vector2.Dot(distance, distance);

        if (distanceSQ <= (circle.radius * circle.radius))
        {
            return(true);
        }

        return(false);
    }
    static protected CollisionInfo CircleVSOBB(CircleHull circle, OBBHull OBB)
    {
        Vector2 halfExtend  = (OBB.max - OBB.min) / 2;
        Vector2 circleInOBB = OBB.transform.InverseTransformPoint(circle.GetCenter());
        Vector2 circleBox   = new Vector2(Mathf.Max(-halfExtend.x, Mathf.Min(circleInOBB.x, halfExtend.x)),
                                          Mathf.Max(-halfExtend.y, Mathf.Min(circleInOBB.y, halfExtend.y)));

        Vector2 distanceVec = circleInOBB - circleBox;
        float   distanceSQ  = Vector2.Dot(distanceVec, distanceVec);

        if (distanceSQ > (circle.radius * circle.radius))
        {
            return(null);
        }

        float distance = Mathf.Sqrt(distanceSQ);

        return(new CollisionInfo(circle, OBB, OBB.transform.TransformVector(-distanceVec).normalized, circle.radius - distance));
    }
    protected static CollisionInfo CircleVSOBB(CircleHull circle, OBBHull OBB)
    {
        Vector3 halfExtend = OBB.halfExtends;
        Vector3 circleInOBB = OBB.GetComponent<Particle3D>().getWorldToObject().MultiplyPoint(circle.GetCenter());
        Vector3 circleBox = new Vector3(Mathf.Max(-halfExtend.x, Mathf.Min(circleInOBB.x, halfExtend.x)),
            Mathf.Max(-halfExtend.y, Mathf.Min(circleInOBB.y, halfExtend.y)),
            Mathf.Max(-halfExtend.z, Mathf.Min(circleInOBB.z, halfExtend.z)));

        Vector3 distanceVec = circleInOBB - circleBox;
        float distanceSQ = Vector3.Dot(distanceVec, distanceVec);
        if (distanceSQ > (circle.radius * circle.radius))
        {
            return null;
        }
        Vector3 closestPt = new Vector3(0f,0f,0f);
        float dist;
        // Clamp each coordinate to the box.
        dist = circleInOBB.x;
        if (dist > OBB.halfExtends.x) dist = OBB.halfExtends.x;
        if (dist < -OBB.halfExtends.x) dist = -OBB.halfExtends.x;
        closestPt.x = dist;
        dist = circleInOBB.y;
        if (dist > OBB.halfExtends.y) dist = OBB.halfExtends.y;
        if (dist < -OBB.halfExtends.y) dist = -OBB.halfExtends.y;
        closestPt.y = dist;
        dist = circleInOBB.z;
        if (dist > OBB.halfExtends.z) dist = OBB.halfExtends.z;
        if (dist < -OBB.halfExtends.z) dist = -OBB.halfExtends.z;
        closestPt.z = dist;
        // Check to see if we’re in contact.
        dist = (closestPt - circleInOBB).sqrMagnitude;
        if (dist > circle.radius * circle.radius)
            return null;
        // Compile the contact.
        Vector3 closestPtWorld = OBB.GetComponent<Particle3D>().getObjectToWorld().MultiplyPoint(closestPt);
        //place contact point in world space
        float distance = Mathf.Sqrt(distanceSQ);
        //Debug.LogError(closestPtWorld);
        return new CollisionInfo(circle, OBB, (-distanceVec).normalized, (circle.radius - distance),closestPtWorld);
        //OBB.GetComponent<Particle3D>().getObjectToWorld().MultiplyPoint(-distanceVec).normalized this failed to work, removing it fixed it
    }
Example #8
0
    static protected CollisionInfo CircleVSOBB(CircleHull circle, OBBHull OBB)
    {
        Vector3 halfExtend  = OBB.halfExtends;
        Vector3 circleInOBB = OBB.GetComponent <Particle3D>().getWorldToObject().MultiplyPoint(circle.GetCenter());
        Vector3 circleBox   = new Vector3(Mathf.Max(-halfExtend.x, Mathf.Min(circleInOBB.x, halfExtend.x)),
                                          Mathf.Max(-halfExtend.y, Mathf.Min(circleInOBB.y, halfExtend.y)),
                                          Mathf.Max(-halfExtend.z, Mathf.Min(circleInOBB.z, halfExtend.z)));

        Vector3 distanceVec = circleInOBB - circleBox;
        float   distanceSQ  = Vector3.Dot(distanceVec, distanceVec);

        if (distanceSQ > (circle.radius * circle.radius))
        {
            return(null);
        }
        //place contact point in world space
        float distance = Mathf.Sqrt(distanceSQ);

        return(new CollisionInfo(circle, OBB, (-distanceVec).normalized, (circle.radius - distance)));
        //OBB.GetComponent<Particle3D>().getObjectToWorld().MultiplyPoint(-distanceVec).normalized this failed to work, removing it fixed it
    }