//------------------------------------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); } }
//------------------------------------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); } }