private void ResolveVelocity(CollisionHull2D.Collision collision) { // we are either separating or stationary // no collision needs to be resolved if (collision.closingVelocity > 0) { return; } CollisionHull2D.Collision.Contact[] contacts = collision.contact; float totalInverseMass = collision.a.particle.massInv + collision.b.particle.massInv; // both objects have infinite mass if (totalInverseMass <= 0) { return; } for (int i = 0; i < collision.contactCount; ++i) { CollisionHull2D.Collision.Contact contact = contacts[i]; float realSeparating = -collision.closingVelocity * contact.restitution; float deltaVelocity = realSeparating - collision.closingVelocity; float impulse = deltaVelocity / totalInverseMass; Vector2 impulsePerIMass = contact.normal * impulse; collision.a.particle.velocity += (impulsePerIMass * collision.a.particle.massInv); collision.b.particle.velocity += (impulsePerIMass * -collision.b.particle.massInv); } }
// Start is called before the first frame update void Start() { desc = new CollisionHull2D.Collision(); currentScene = SceneManager.GetActiveScene(); colliders = new List <CollisionHull2D>(); rootObjects = new List <GameObject>(); currentScene.GetRootGameObjects(rootObjects); cm = Camera.main; findHulls(); }
private void ResolveInterpenetration(CollisionHull2D.Collision collision) { for (int i = 0; i < collision.contactCount; ++i) { CollisionHull2D.Collision.Contact contact = collision.contact[i]; if (contact.penetrationDepth > 0) { float totalInvMass = collision.a.particle.massInv + collision.b.particle.massInv; if (totalInvMass > 0) { Vector2 movePerIMass = contact.normal * (contact.penetrationDepth / totalInvMass); collision.a.particle.position += movePerIMass * collision.a.particle.massInv; collision.b.particle.position += movePerIMass * -collision.b.particle.massInv; } } } }
public void CollisionImpulse(CollisionHull2D.Collision c) { var index = 0; //var relativeVelocity = c.a.getParticle2D().getVelocity(); //relativeVelocity -= c.b.getParticle2D().getVelocity(); //var separatingVel = relativeVelocity * c.contacts[index].normal; float separatingVel = -c.closingVelocity.magnitude; // if (separatingVel < 0) { // closing velocity modified by restitution float newSeperatingVel = -separatingVel * c.contacts[index].restitution; // difference between closing velocity*restitution and seperating velocity. float deltaVel = newSeperatingVel - separatingVel; float totalInverseMass = c.a.getParticle2D().getInverseMass() + c.b.getParticle2D().getInverseMass(); float impulse = deltaVel / totalInverseMass; // impulse per unit of mass. Vector2 impulsePerIMass = c.contacts[index].normal * impulse; Vector2 newVel = velocity + impulsePerIMass * inverseMass; setVelocity(newVel); //c.b.getParticle2D().velocity = c.b.getParticle2D().velocity + impulsePerIMass * c.b.getParticle2D().getInverseMass(); } }