//how deep the objects intersect private void ResolvePenetration(CollisionHull3D.CollisionInfo colInfo) { if (colInfo.contacts[0].penetration <= 0.0f) { return; } float totalInverseMass = colInfo.RigidBodyA.invMass + colInfo.RigidBodyB.invMass; if (totalInverseMass <= 0.0f) { return; } Vector3 movePerMass = colInfo.contacts[0].normal * (colInfo.contacts[0].penetration / totalInverseMass); colInfo.RigidBodyA.position -= colInfo.RigidBodyA.invMass * movePerMass; colInfo.RigidBodyB.position += colInfo.RigidBodyB.invMass * movePerMass; }
void ResolvePenetration(CollisionHull3D.CollisionInfo collisionInfo) { if (collisionInfo.contacts[0].penetration <= 0.0f) { return; } float totalInverseMass = collisionInfo.RigidBodyA.GetInverseMass() + collisionInfo.RigidBodyB.GetInverseMass(); if (totalInverseMass <= 0.0f) { return; } Vector3 movePerMass = collisionInfo.contacts[0].normal * (collisionInfo.contacts[0].penetration / totalInverseMass); //collisionInfo.RigidBodyA.position -= collisionInfo.RigidBodyA.GetInverseMass() * movePerMass; //collisionInfo.RigidBodyB.position += collisionInfo.RigidBodyB.GetInverseMass() * movePerMass; Debug.Log(collisionInfo.contacts[0].point); }
void ResolveVelocity(CollisionHull3D.CollisionInfo collisionInfo) { float separatingVelocity = Vector3.Dot(collisionInfo.RelativeVelocity, collisionInfo.contacts[0].normal); if (separatingVelocity > 0.0f) { return; } const float velLimit = 1f; float appliedRestitution = collisionInfo.RelativeVelocity.sqrMagnitude < velLimit * velLimit ? 0.0f : collisionInfo.contacts[0].restitution; float newSeparatingVelocity = -separatingVelocity * appliedRestitution; Vector3 accCausedVelocity = collisionInfo.RigidBodyA.acceleration - collisionInfo.RigidBodyB.acceleration; float accCausedSepVelocity = Vector3.Dot(accCausedVelocity, collisionInfo.contacts[0].normal) * Time.fixedDeltaTime; if (accCausedSepVelocity < 0) { newSeparatingVelocity += collisionInfo.contacts[0].restitution * accCausedSepVelocity; if (newSeparatingVelocity < 0) { newSeparatingVelocity = 0; } } float deltaVelocity = newSeparatingVelocity - separatingVelocity; float totalInverseMass = collisionInfo.RigidBodyA.GetInverseMass() + collisionInfo.RigidBodyB.GetInverseMass(); if (totalInverseMass <= 0.0f) { return; } float impulse = deltaVelocity / totalInverseMass; Vector3 impulsePerMass = collisionInfo.contacts[0].normal * impulse; collisionInfo.RigidBodyA.velocity -= collisionInfo.RigidBodyA.GetInverseMass() * impulsePerMass; collisionInfo.RigidBodyB.velocity += collisionInfo.RigidBodyB.GetInverseMass() * impulsePerMass; }
//how the objects forces act upon each other void ResolveVelocity(CollisionHull3D.CollisionInfo colInfo) { float separatingVelocity = Vector3.Dot(colInfo.RelativeVelocity, colInfo.contacts[0].normal); if (separatingVelocity > 0.0f) { return; } float newSepVelocity = -separatingVelocity * colInfo.contacts[0].restitution; //Resting Vector3 accCausedVelocity = colInfo.RigidBodyB.acceleration - colInfo.RigidBodyA.acceleration; float accCausedSepVelocity = Vector3.Dot(accCausedVelocity, colInfo.contacts[0].normal) * Time.fixedDeltaTime; if (accCausedSepVelocity < 0) { newSepVelocity += colInfo.contacts[0].restitution * accCausedSepVelocity; if (newSepVelocity < 0) { newSepVelocity = 0.0f; } } float deltaVelocity = newSepVelocity - separatingVelocity; float totalInverseMass = colInfo.RigidBodyA.invMass + colInfo.RigidBodyB.invMass; if (totalInverseMass <= 0.0f) { //no fx return; } float impulse = deltaVelocity / totalInverseMass; Vector3 impulsePerMass = colInfo.contacts[0].normal * impulse; colInfo.RigidBodyA.velocity -= colInfo.RigidBodyA.invMass * impulsePerMass; colInfo.RigidBodyB.velocity += colInfo.RigidBodyB.invMass * impulsePerMass; }