//------------------------------------Private Functions-------------------------------------

    private Matrix4x4 CalculateInertiaTensor()
    {
        // Calculating the moment of inertia of the body.
        Vector3 momentOfInertia = Vector3.one;

        switch (pCollider.pType)
        {
        case ColliderType.Sphere:
            momentOfInertia *= PSI_PhysicsUtils.MomentOfInertiaOfSphere(Mass, ((PSI_Collider_Sphere)pCollider).pRadius);
            break;

        case ColliderType.Box:
            momentOfInertia = PSI_PhysicsUtils.MomentOfInertiaOfBox(Mass, ((PSI_Collider_Box)pCollider).pSize);
            break;

        default:
            return(Matrix4x4.identity);
        }

        // Using the moment of inertia to construct the inertia tensor matrix.
        Matrix4x4 inertiaTensor = new Matrix4x4();

        inertiaTensor.m00 = momentOfInertia.x;
        inertiaTensor.m11 = momentOfInertia.y;
        inertiaTensor.m22 = momentOfInertia.z;
        inertiaTensor.m33 = 1f;
        return(inertiaTensor);
    }
    private Vector3 CalculateAngularAcceleration(Vector3 torque)
    {
        // Geting the moment of inertia of the body and using to calculate the accelerating due to torque.
        switch (pCollider.pType)
        {
        case ColliderType.Sphere:
            return((Mathf.Rad2Deg * torque) * PSI_PhysicsUtils.MomentOfInertiaOfSphere(Mass, ((PSI_Collider_Sphere)pCollider).pRadius));

        case ColliderType.Box:
            Vector3 angAcc          = (Mathf.Rad2Deg * torque);
            Vector3 momentOfInertia = PSI_PhysicsUtils.MomentOfInertiaOfBox(Mass, ((PSI_Collider_Box)pCollider).pSize);
            angAcc.x *= momentOfInertia.x;
            angAcc.y *= momentOfInertia.y;
            angAcc.z *= momentOfInertia.z;
            return(angAcc);

        default:
            return(Vector3.zero);
        }
    }
示例#3
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);
        }
    }