private CollisionData ManageCollisions(CollisionDetector detect, ICollideable left, ICollideable right, float duration) { CollisionData data = new CollisionData(); data.restitution = this.Restitution; data.friction = this.Friction; detect.FindContacts(left.GeometryData.Prim, right.GeometryData.Prim, data); return data; }
private void PumpCollisions(float duration) { List<ICollideable> colliders = this.ICollideables; IEnumerable<ICollideable> gameObjectsLeft = colliders; IEnumerable<ICollideable> gameObjectsRight = colliders; CollisionDetector detect = new CollisionDetector(); List<Contact> contacts = new List<Contact>(); foreach (ICollideable left in gameObjectsLeft) { foreach (ICollideable right in gameObjectsRight) { if (left != right) { CollisionData data = ManageCollisions(detect, left, right, duration); contacts.AddRange(data.contacts); } } } ContactResolver.FullContactResolution(contacts, duration); if (this.CaptureBodyContacts) { foreach (Contact contact in contacts) { if (contact.Bodies[1] != null) { captured.Add(contact); } } } if (contacts.Count > 0) { saveLastContact(contacts[0]); } }
public void IntersectionTests_SphereVsSphere_Overlapping() { Vector3 sphereOnePosition = new Vector3(0.5f, 0f, 0f); IRigidBody sphereOneBody = new NoBody(Matrix.CreateTranslation(sphereOnePosition)); float sphereOneRadius = 1f; Matrix sphereOneMatrix = Matrix.Identity; Sphere sphereOne = new Sphere(sphereOneBody, sphereOneMatrix, sphereOneRadius); Vector3 sphereTwoPosition = Vector3.UnitX; IRigidBody sphereTwoBody = new NoBody(Matrix.CreateTranslation(sphereTwoPosition)); float sphereTwoRadius = 1f; Matrix sphereTwoMatrix = Matrix.Identity; Sphere sphereTwo = new Sphere(sphereTwoBody, sphereTwoMatrix, sphereTwoRadius); CollisionDetector detect = new CollisionDetector(); CollisionData data = new CollisionData(); Assert.AreEqual(1, IntersectionTests.sphereAndSphere(sphereOne, sphereTwo, data), "How many contacts?"); Contact contact; Assert.NotNull(data.contacts, "Contacts Container"); Assert.AreEqual(1, data.contacts.Count, "One Contact Expected"); contact = data.contacts[0]; Assert.AreEqual(0, contact.Friction, "0 friction"); Assert.AreEqual(1f, contact.Restitution, "1 restitution"); Assert.AreEqual(1.5f, contact.Penetration, "0 penetration (surface collision)"); Assert.AreEqual(new Vector3(0.75f, 0f, 0f), contact.Point, "expected contact point"); Assert.AreEqual(-Vector3.UnitX, contact.Normal, "expected contact normal"); //Assymetric data = new CollisionData(); IntersectionTests.sphereAndSphere(sphereTwo, sphereOne, data); Assert.NotNull(data.contacts, "Contacts Container"); Assert.AreEqual(1, data.contacts.Count, "One Contact Expected"); contact = data.contacts[0]; Assert.AreEqual(0, contact.Friction, "0 friction"); Assert.AreEqual(1f, contact.Restitution, "1 restitution"); Assert.AreEqual(1.5f, contact.Penetration, "0 penetration (surface collision)"); Assert.AreEqual(new Vector3(0.75f, 0f, 0f), contact.Point, "expected contact point"); Assert.AreEqual(Vector3.UnitX, contact.Normal, "expected contact normal"); }