Esempio n. 1
0
    static public CollisionInfo CircleOBB(CircleCollision3D circle, ObjectBoundingBoxCollision3D rect)
    {
        //transform circle into obb space transform.InverseTransformPoint(cirecle.postion);
        //then do circle AABB
        Vector3 halfExtend  = (rect.posMax - rect.posMin) / 2;
        Vector3 circleInOBB = rect.GetComponent <Particle3D>().GetWorldToObject().MultiplyPoint(circle.center);//rect.transform.InverseTransformPoint(circle.center);
        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);

        //Debug.DrawLine(circleBox, circle.center);


        if (distanceSQ <= (circle.radius * circle.radius))
        {
            //return true;
            //Debug.Log("circ obb collision");
            float distance = Mathf.Sqrt(distanceSQ);
            return(new CollisionInfo(circle, rect, rect.transform.TransformVector(-distanceVec).normalized, circle.radius - distance));
        }

        return(null);
    }
Esempio n. 2
0
    static public CollisionInfo CircleCircle(CircleCollision3D colA, CircleCollision3D colB)
    {
        //How the slides say to do it
        //Step1: Calculate distance from center to center, distance = colB.center - colA.center
        //Step2: Add the two radius together colB.radius + colA.radius
        //Step3: Do DotProduct(distance,distance)<radius together^2

        Vector3 distance  = colB.center - colA.center;
        float   radialSum = colA.radius + colB.radius;

        if (Vector3.Dot(distance, distance) <= (radialSum * radialSum))
        {
            /*double angle = System.Math.Atan2(colB.center.y - colA.center.y, colB.center.x - colA.center.x);
             * float circleDistance = (float)System.Math.Sqrt((colB.center.x - colA.center.x) * (colB.center.x - colA.center.x) + (colB.center.y - colA.center.y) * (colB.center.y - colA.center.y));
             * float distToMove = radialSum - circleDistance;
             * colB.center.x += (float)(System.Math.Cos(angle) * circleDistance);
             * colB.center.y += (float)(System.Math.Cos(angle) * circleDistance);*/
            float fDistance = Mathf.Sqrt(Vector3.Dot(distance, distance));
            //Debug.Log("Circ - collision");

            return(new CollisionInfo(colA, colB, distance / fDistance, radialSum - fDistance));
        }
        else
        {
            return(null);
        }
    }
Esempio n. 3
0
        public CollisionInfo(CircleCollision3D colA, CircleCollision3D colB, Vector3 normal, float penetration)
        {
            RigidBodyA = colA.GetComponent <Particle3D>();
            RigidBodyB = colB.GetComponent <Particle3D>();


            RelativeVelocity = RigidBodyB.velocity - RigidBodyA.velocity;

            contacts[0].normal      = normal;
            contacts[0].penetration = penetration;
            contacts[0].restitution = Mathf.Min(RigidBodyA.restitution, RigidBodyB.restitution);
        }
Esempio n. 4
0
    static public CollisionInfo CircleAABB(CircleCollision3D circle, AxisAllignedBoundingBoxCollision3D rect)
    {
        //Vector3 halfExtend = (rect.posMax - rect.posMin) / 2;

        // clamp(value, min, max) - limits value to the range min..max
        Vector3 circleBox = new Vector3(
            Mathf.Max(rect.posMin.x + rect.center.x, Mathf.Min(circle.center.x, rect.posMax.x + rect.center.x)),
            Mathf.Max(rect.posMin.y + rect.center.y, Mathf.Min(circle.center.y, rect.posMax.y + rect.center.y)),
            Mathf.Max(rect.posMin.z + rect.center.z, Mathf.Min(circle.center.z, rect.posMax.z + rect.center.z)));
        // Find the closest point to the circle within the rectangle
        float closestX = Mathf.Clamp(circle.center.x, -rect.halfExtends.x, rect.halfExtends.x);
        float closestY = Mathf.Clamp(circle.center.y, -rect.halfExtends.y, rect.halfExtends.y);
        float closestZ = Mathf.Clamp(circle.center.z, -rect.halfExtends.z, rect.halfExtends.z);

        Vector3 closestPoint = new Vector3(closestX, closestY, closestZ);

        // Calculate the distance between the circle's center and this closest point
        //float distanceX = circle.center.x - closestX;
        //float distanceY = circle.center.y - closestY;
        //float distanceZ = circle.center.z - closestZ;
        Vector3 disVec = circle.center - circleBox;

        //Vector3 distanceComplete = closestPoint - closestPoint; //possibly change to circle vox
        // If the distance is less than the circle's radius, an intersection occurs
        //float distSq = Vector3.Dot(distanceComplete, distanceComplete);
        float distSq = Vector3.Dot(disVec, disVec);

        //float distanceSquared = (distanceX * distanceX) + (distanceY * distanceY) + (distanceZ * distanceZ);
        float distance = Mathf.Sqrt(distSq);

        //Debug.DrawLine(closestPoint, circle.center);

        if (distSq <= (circle.radius * circle.radius))
        {
            //Debug.Log("square circ collision)");
            //return new CollisionInfo(circle, rect, -distanceComplete.normalized, circle.radius - distance);
            return(new CollisionInfo(circle, rect, -disVec.normalized, circle.radius - distance));
        }
        return(null);
        //return distanceSquared < (circle.radius * circle.radius);
    }