public static void HandleAABBAABBCollision(PSI_AABBCollider col1, PSI_AABBCollider col2) { // Calculating the collision vector. Vector3 colVector = col1.pPosition - col2.pPosition; // Determining what axis the collision occured on. List <float> colVectorAxes = new List <float>() { Mathf.Abs(colVector.x), Mathf.Abs(colVector.y), Mathf.Abs(colVector.z) }; colVectorAxes.Sort(); string axisName = ""; if (Mathf.Abs(colVector.x) == colVectorAxes[2]) { axisName = "x"; } if (Mathf.Abs(colVector.y) == colVectorAxes[2]) { axisName = "y"; } if (Mathf.Abs(colVector.z) == colVectorAxes[2]) { axisName = "z"; } // Generating an axis aligned collision vector. object tempVector = Vector3.zero; typeof(Vector3).GetField(axisName).SetValue(tempVector, typeof(Vector3).GetField(axisName).GetValue(colVector)); Vector3 aaColVector = (Vector3)tempVector; // Getting the size of each collider on the collision axis. float size1 = (float)col1.Size.GetType().GetField(axisName).GetValue(col1.Size); float size2 = (float)col2.Size.GetType().GetField(axisName).GetValue(col2.Size); // Calculating the minimum translation vector needed to reset the two colliders positions. var minTranslationVector = aaColVector * ((((size1 + size2) * 0.5f) - aaColVector.magnitude) / aaColVector.magnitude); // Calculating the inverse masses once for efficiency. var inverseMass1 = 1.0f / col1.pRigidBody.pMass; var inverseMass2 = 1.0f / col2.pRigidBody.pMass; // Moving the two colliders so they are not overlapping. col1.transform.Translate(minTranslationVector * (inverseMass1 / (inverseMass1 + inverseMass2))); col2.transform.Translate(-minTranslationVector * (inverseMass2 / (inverseMass1 + inverseMass2))); // Applying the impulse to the bodies. var impulse = PSI_Physics.CalculateImpulse(col1.pRigidBody, col2.pRigidBody, minTranslationVector); col1.pRigidBody.Velocity += impulse.Impulse1; col2.pRigidBody.Velocity += impulse.Impulse2; }
//-----------------------------------Handling Collisions------------------------------------ public static void HandleSphereSphereCollision(PSI_SphereCollider col1, PSI_SphereCollider col2) { // Calculating the collision vector. var colVector = col1.pPosition - col2.pPosition; // Calculating the minimum translation vector needed to reset the two colliders positions. var minTranslationVector = colVector * (((col1.Radius + col2.Radius) - colVector.magnitude) / colVector.magnitude); // Calculating the inverse masses once for efficiency. var inverseMass1 = 1.0f / col1.pRigidBody.pMass; var inverseMass2 = 1.0f / col2.pRigidBody.pMass; // Moving the two colliders so they are not overlapping. col1.transform.Translate(minTranslationVector * (inverseMass1 / (inverseMass1 + inverseMass2))); col2.transform.Translate(-minTranslationVector * (inverseMass2 / (inverseMass1 + inverseMass2))); // Applying the impulse to the bodies. var impulse = PSI_Physics.CalculateImpulse(col1.pRigidBody, col2.pRigidBody, minTranslationVector); col1.pRigidBody.Velocity += impulse.Impulse1; col2.pRigidBody.Velocity += impulse.Impulse2; }