public override void GetContacts(List<ParticleContact> contacts, ParticleWorld world) { float currentLen = CurrentLength; if (currentLen == Length) { return; } ParticleContact contact = new ParticleContact(); contact.Particles[0] = Particle; contact.Particles[1] = null; Vector3 normal = Anchor - Particle.Position; normal.Normalize(); if (currentLen > Length) { contact.ContactNormal = normal; contact.Penetration = currentLen - Length; } else { contact.ContactNormal = normal * -1; contact.Penetration = Length - currentLen; } contact.Restitution = 0; contacts.Add(contact); return; }
public override void GetContacts(List<ParticleContact> contacts, ParticleWorld world) { ParticleContact contact = new ParticleContact(); float currentLen = CurrentLength; if (currentLen == RodLength) { return; } contact.Particles[0] = Particles[0]; contact.Particles[1] = Particles[1]; Vector3 normal = Particles[1].Position - Particles[0].Position; normal.Normalize(); if (currentLen > RodLength) { contact.ContactNormal = normal; contact.Penetration = currentLen - RodLength; } else { contact.ContactNormal = normal * -1; contact.Penetration = RodLength - currentLen; } contact.Restitution = 0; contacts.Add(contact); }
public void GetContacts(List<ParticleContact> contacts, ParticleWorld world) { for (int i = 0; i < world.Particles.Count; i++) { float y = world.Particles[i].Position.Y; if (y < Height) { ParticleContact c = new ParticleContact(); c.ContactNormal = Vector3.Up; c.Particles[0] = world.Particles[i]; c.Penetration = -(y - Height); c.Restitution = 0.8f; contacts.Add(c); } } }
bool getcollision(out ParticleContact pc, Particle a, Particle b) { pc = null; float maxrad = ParticleRadius * 2.0f; float dist = Vector3.Distance(a.Position, b.Position); if (dist <= maxrad) { pc = new ParticleContact(); pc.Particles[0] = a; pc.Particles[1] = b; pc.Restitution = 0.8f; pc.Penetration = maxrad - dist; pc.ContactNormal = Vector3.Normalize(a.Position - b.Position); return true; } return false; }
public override void GetContacts(List<ParticleContact> contacts, ParticleWorld world) { float length = CurrentLength; if (length < MaxLength) { return; } ParticleContact contact = new ParticleContact(); contact.Particles[0] = Particles[0]; contact.Particles[1] = Particles[1]; Vector3 normal = Particles[1].Position - Particles[0].Position; normal.Normalize(); contact.ContactNormal = normal; contact.Penetration = length - MaxLength; contact.Restitution = Restitution; contacts.Add(contact); }
public void GetContacts(List<ParticleContact> contacts, ParticleWorld world) { for (int i = 0; i < world.Particles.Count; i++) { float y = world.Particles[i].Position.Y; if ((y) < ParticleRadius) { ParticleContact c = new ParticleContact(); c.ContactNormal = Vector3.Up; c.Particles[0] = world.Particles[i]; c.Penetration = -(y - ParticleRadius); c.Restitution = 0.8f; contacts.Add(c); } for (int j = i + 1; j < world.Particles.Count; j++) { ParticleContact pc; if (getcollision(out pc, world.Particles[i], world.Particles[j])) { contacts.Add(pc); } } } }