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;
 }
Exemple #2
0
 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;
 }
Exemple #5
0
 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);
             }
         }
     }
 }