Example #1
0
    //------------------------------------Private Functions-------------------------------------

    private void CheckForCollision(PSI_Collider col1, PSI_Collider col2)
    {
        // Sphere on sphere.
        if (col1.pColliderType == ColliderType.Sphere && col2.pColliderType == ColliderType.Sphere)
        {
            if (PSI_Physics.SphereSphereCollisionOccured((PSI_SphereCollider)col1, (PSI_SphereCollider)col2))
            {
                PSI_Physics.HandleSphereSphereCollision((PSI_SphereCollider)col1, (PSI_SphereCollider)col2);
                FindObjectOfType <DebugManager>().CollisionOccured(col1, col2);
            }
        }

        // AABB on AABB.
        if (col1.pColliderType == ColliderType.AABB && col2.pColliderType == ColliderType.AABB)
        {
            if (PSI_Physics.AABBAABBCollisionOccured((PSI_AABBCollider)col1, (PSI_AABBCollider)col2))
            {
                PSI_Physics.HandleAABBAABBCollision((PSI_AABBCollider)col1, (PSI_AABBCollider)col2);
                FindObjectOfType <DebugManager>().CollisionOccured(col1, col2);
            }
        }

        // Sphere on plane.
        if ((col1.pColliderType == ColliderType.Sphere && col2.pColliderType == ColliderType.Plane) ||
            (col1.pColliderType == ColliderType.Plane && col2.pColliderType == ColliderType.Sphere))
        {
            PSI_SphereCollider sphere = (PSI_SphereCollider)((col1.pColliderType == ColliderType.Sphere) ? col1 : col2);
            PSI_PlaneCollider  plane  = (PSI_PlaneCollider)((col1.pColliderType == ColliderType.Sphere) ? col2 : col1);
            if (PSI_Physics.SpherePlaneCollisionOccured(sphere, plane))
            {
                PSI_Physics.HandleSpherePlaneCollision(sphere, plane);
                FindObjectOfType <DebugManager>().CollisionOccured(col1, col2);
            }
        }
    }
Example #2
0
 public void RemoveCollider(PSI_Collider collider)
 {
     if (mColliders.Contains(collider))
     {
         mColliders.Remove(collider);
     }
 }
Example #3
0
    //-------------------------------------Public Functions-------------------------------------

    public void AddCollider(PSI_Collider collider)
    {
        if (!mColliders.Contains(collider))
        {
            mColliders.Add(collider);
        }
    }
Example #4
0
 public void RemoveCollider(PSI_Collider collider)
 {
     // Removing a collider from the list of colliders in the scene.
     if (mColliders.Contains(collider))
     {
         mColliders.Remove(collider);
     }
 }
Example #5
0
    //-------------------------------------Public Functions-------------------------------------

    public void AddCollider(PSI_Collider collider)
    {
        // Adding a new collider to the list of colliders in the scene.
        if (!mColliders.Contains(collider))
        {
            mColliders.Add(collider);
        }
    }
    private static void ApplyFriction(PSI_Collider col, PSI_Collider_Plane planeCol, Vector3 collisionPoint)
    {
        // Calculating and applying friction to a body moving along a plane.
        if (!col.pRigidbody)
        {
            return;
        }
        var incline       = Vector3.Angle(Vector3.up, planeCol.pNormal);
        var normalForce   = col.pRigidbody.Mass * 9.81f * Mathf.Cos(incline);
        var coeffFriction = col.pRigidbody.CoeffOfFrict;
        var friction      = coeffFriction * normalForce;

        col.pRigidbody.AddFrictionAtPoint(friction * -col.pRigidbody.Velocity.normalized, collisionPoint);
    }
    public void CollisionOccured(PSI_Collider col1, PSI_Collider col2)
    {
        PSI_Collider colToAdd = null;

        if (col1.gameObject == mSelectedObject)
        {
            colToAdd = col2;
        }
        else if (col2.gameObject == mSelectedObject)
        {
            colToAdd = col1;
        }
        if (colToAdd != null)
        {
            mCollisionObjects.Remove(colToAdd);
            mCollisionObjects.Add(colToAdd);
        }
    }
    private static void ResolveCollisionOverlaps(PSI_Collider col1, PSI_Collider col2, Vector3 collisionAxis, float overlap)
    {
        // Calculating the invese masses of the bodies.
        var inverseMass1 = col1.pRigidbody ? 1.0f / col1.pRigidbody.Mass : 0f;
        var inverseMass2 = col2.pRigidbody ? 1.0f / col2.pRigidbody.Mass : 0f;

        if (inverseMass1 + inverseMass2 == 0f)
        {
            return;
        }

        // Translating the bodies by an amount proportional to their
        // inverse mass so that they are no longer overlapping.
        var minTranslationVector = -collisionAxis.normalized * Mathf.Abs(overlap);

        col1.transform.Translate(minTranslationVector * (inverseMass1 / (inverseMass1 + inverseMass2)), Space.World);
        col2.transform.Translate(-minTranslationVector * (inverseMass2 / (inverseMass1 + inverseMass2)), Space.World);
    }
    private static void ApplyImpulses(PSI_Collider col1, PSI_Collider col2, Vector3 collisionAxis, Vector3 collisionPoint)
    {
        // Gathering the necessary physics properties from the bodies.
        Vector3[]       velocities    = new Vector3[] { Vector3.zero, Vector3.zero };
        float[]         inverseMasses = new float[] { 0f, 0f };
        float[]         coeffsOfRes   = new float[] { 1f, 1f };
        PSI_Rigidbody[] rbs           = new PSI_Rigidbody[] { col1.pRigidbody, col2.pRigidbody };
        for (int j = 0; j < 2; j++)
        {
            if (rbs[j] != null)
            {
                velocities[j]    = rbs[j].Velocity;
                inverseMasses[j] = 1.0f / rbs[j].Mass;
                coeffsOfRes[j]   = rbs[j].CoeffOfRest;
            }
        }

        // Calculating the impact velocity.
        var impactVelocity = velocities[0] - velocities[1];

        // Determining the difference between the collision axis and the impact velocity.
        var vn = Vector3.Dot(impactVelocity, -collisionAxis.normalized);

        if (vn > 0.0f)
        {
            return;
        }

        // Calculating the final collision impulse.
        var finalCoeffOfRest = coeffsOfRes[0] * coeffsOfRes[1];
        var i       = (-(1.0f + finalCoeffOfRest) * vn) / (inverseMasses[0] + inverseMasses[1]);
        var impulse = -collisionAxis.normalized * i;

        // Applying the collision impulse to the bodies.
        if (rbs[0] != null)
        {
            rbs[0].ApplyImpulseAtPoint(impulse, collisionPoint);
        }
        if (rbs[1] != null)
        {
            rbs[1].ApplyImpulseAtPoint(impulse, collisionPoint);
        }
    }
Example #10
0
    //------------------------------------Private Functions-------------------------------------

    private void CheckForCollision(PSI_Collider col1, PSI_Collider col2)
    {
        bool          collisionOccurred = false;
        PSI_Collision collision         = new PSI_Collision();

        collision.col1 = col1;
        collision.col2 = col2;

        // Sphere on sphere.
        if (col1.pType == ColliderType.Sphere && col2.pType == ColliderType.Sphere)
        {
            collisionOccurred = PSI_PhysicsUtils.SphereSphereCollisionCheck((PSI_Collider_Sphere)col1, (PSI_Collider_Sphere)col2, out collision.point);
        }

        // Sphere on plane.
        if ((col1.pType == ColliderType.Sphere && col2.pType == ColliderType.Plane) ||
            (col1.pType == ColliderType.Plane && col2.pType == ColliderType.Sphere))
        {
            PSI_Collider_Sphere sphere = (PSI_Collider_Sphere)((col1.pType == ColliderType.Sphere) ? col1 : col2);
            PSI_Collider_Plane  plane  = (PSI_Collider_Plane)((col1.pType == ColliderType.Sphere) ? col2 : col1);
            if (PSI_PhysicsUtils.SpherePlaneCollisionOccured(sphere, plane, out collision.point))
            {
                collisionOccurred = true;
            }
        }

        // Sphere on box.
        if ((col1.pType == ColliderType.Sphere && col2.pType == ColliderType.Box) ||
            (col1.pType == ColliderType.Box && col2.pType == ColliderType.Sphere))
        {
            PSI_Collider_Sphere sphere = (PSI_Collider_Sphere)((col1.pType == ColliderType.Sphere) ? col1 : col2);
            PSI_Collider_Box    box    = (PSI_Collider_Box)((col1.pType == ColliderType.Sphere) ? col2 : col1);
            if (PSI_PhysicsUtils.SphereBoxCollisionOccured(sphere, box, out collision.point))
            {
                collisionOccurred = true;
            }
        }

        // Box on box.
        if ((col1.pType == ColliderType.Box && col2.pType == ColliderType.Box))
        {
            if (PSI_PhysicsUtils.BoxBoxCollisionOccured((PSI_Collider_Box)col1, (PSI_Collider_Box)col2, out collision.point))
            {
                collisionOccurred = true;
            }
        }

        // Box on plane.
        if ((col1.pType == ColliderType.Box && col2.pType == ColliderType.Plane) ||
            (col1.pType == ColliderType.Plane && col2.pType == ColliderType.Box))
        {
            PSI_Collider_Box   box   = (PSI_Collider_Box)((col1.pType == ColliderType.Box) ? col1 : col2);
            PSI_Collider_Plane plane = (PSI_Collider_Plane)((col1.pType == ColliderType.Box) ? col2 : col1);
            if (PSI_PhysicsUtils.BoxPlaneCollisionOccured(box, plane, out collision.point))
            {
                collisionOccurred = true;
            }
        }

        if (collisionOccurred)
        {
            mCollisionData.Add(collision);
        }
    }