public static int BoxAndHalfSpace(CollisionBox box, CollisionPlane plane, ref CollisionData data)
 {
     if (data.ContactsLeft <= 0) return 0;
     if (!IntersectionTests.BoxAndHalfSpace(box, plane))
     {
         return 0;
     }
     int contactsUsed = 0;
     for (int i = 0; i < 8; i++)
     {
         Vector3 vertexPos = new Vector3(mults[i, 0], mults[i, 1], mults[i, 2]);
         vertexPos *= (box.HalfSize);
         vertexPos = box.Transform.Transform(vertexPos);
         float vertexDistance = Vector3.Dot(vertexPos, plane.Normal);
         if (vertexDistance <= plane.D)
         {
             Contact contact = new Contact();
             contact.ContactPoint = plane.Normal;
             contact.ContactPoint *= (vertexDistance - plane.D);
             contact.ContactPoint = vertexPos;
             contact.ContactNormal = plane.Normal;
             contact.Penetration = plane.D - vertexDistance;
             contact.SetData(box.Body, null, data.Friction, data.Restitution);
             data.Contacts.Add(contact);
             if (contactsUsed == data.ContactsLeft) return contactsUsed;
         }
     }
     data.AddContacts(contactsUsed);
     return contactsUsed;
 }
 public static int SphereAndTruePlane(CollisionSphere sphere, CollisionPlane plane, ref CollisionData data)
 {
     if (data.ContactsLeft <= 0) return 0;
     Vector3 position = sphere.GetAxis(3);
     float centreDistance = Vector3.Dot(plane.Normal, position) - plane.D;
     if (centreDistance * centreDistance > sphere.Radius * sphere.Radius)
     {
         return 0;
     }
     Vector3 normal = plane.Normal;
     float penetration = -centreDistance;
     if (centreDistance < 0)
     {
         normal *= -1;
         penetration = -penetration;
     }
     penetration += sphere.Radius;
     Contact contact = new Contact();
     contact.ContactNormal = normal;
     contact.Penetration = penetration;
     contact.ContactPoint = position - plane.Normal * centreDistance;
     contact.SetData(sphere.Body, null, data.Friction, data.Restitution);
     data.Contacts.Add(contact);
     data.AddContacts(1);
     return 1;
 }
 public static int SphereAndHalfSpace(CollisionSphere sphere, CollisionPlane plane, ref CollisionData data)
 {
     if (data.ContactsLeft <= 0) return 0;
     Vector3 position = sphere.GetAxis(3);
     float ballDistance = Vector3.Dot(plane.Normal, position) - sphere.Radius - plane.D;
     if (ballDistance >= 0) return 0;
     Contact contact = new Contact();
     contact.ContactNormal = plane.Normal;
     contact.Penetration = -ballDistance;
     contact.ContactPoint = position - plane.Normal * (ballDistance + sphere.Radius);
     contact.SetData(sphere.Body, null, data.Friction, data.Restitution);
     data.Contacts.Add(contact);
     data.AddContacts(1);
     return 1;
 }
 public static bool BoxAndHalfSpace(CollisionBox box, CollisionPlane plane)
 {
     float projectedRadius = transformToAxis(box, plane.Normal);
     float boxDistance = Vector3.Dot(plane.Normal, box.GetAxis(3)) - projectedRadius;
     return boxDistance <= plane.D;
 }
 public static bool SphereAndHalfSpace(CollisionSphere sphere, CollisionPlane plane)
 {
     float ballDistance = Vector3.Dot(plane.Normal, sphere.GetAxis(3)) - sphere.Radius;
     return ballDistance <= plane.D;
 }
Exemple #6
0
 void generateContacts()
 {
     CollisionPlane plane = new CollisionPlane(new Vector3(0, 1, 0).ToVector3(), 0);
     cdata.Reset(256);
     cdata.Friction = 0.9f;
     cdata.Restitution = 0.1f;
     cdata.Tolerance = 0.1f;
     for (int i = 0; i < bodies.Count; i++)
     {
         if (!cdata.HasMoreContacts) return;
         CollisionDetector.BoxAndHalfSpace(bodies[i], plane, ref cdata);
     }
 }