예제 #1
0
        public void Update()
        {
            if (collisionDomain.HasContact(CollisionObject))
            {
                if (triggeredRigidbodies.Count != 0)
                {
                    triggeredRigidbodies.RemoveAll(rigidBody1 => !collisionDomain.HaveContact(CollisionObject, rigidBody1.CollisionObject));
                }

                var characters = collisionDomain.GetContactObjects(CollisionObject)
                                 .Select(collisionObject => collisionObject.GeometricObject)
                                 .OfType <RigidBody>()
                                 .Where(rigidBody1 => rigidBody1.Name == nameOfTarget)
                                 .Except(triggeredRigidbodies);
                foreach (var character in characters)
                {
                    triggeredRigidbodies.Add(character);
                    OnTriggerEnter(character.UserData);
                }
            }
            else
            {
                if (triggeredRigidbodies.Count != 0)
                {
                    triggeredRigidbodies.Clear();
                }
            }
        }
        public override void Update(GameTime gameTime)
        {
            // ----- Move object A with arrow keys.
            // Compute displacement.
            Vector3F displacement = Vector3F.Zero;

            if (InputService.IsDown(Keys.Up))
            {
                displacement.Y += 0.1f;
            }
            if (InputService.IsDown(Keys.Left))
            {
                displacement.X -= 0.1f;
            }
            if (InputService.IsDown(Keys.Down))
            {
                displacement.Y -= 0.1f;
            }
            if (InputService.IsDown(Keys.Right))
            {
                displacement.X += 0.1f;
            }

            // Update the position of object A (green box).
            Pose pose = _collisionObjectA.GeometricObject.Pose;

            pose.Position += displacement;
            // Note: We have to cast to GeometricObject because CollisionObject.GeometricObject
            // is of type IGeometricObject which does not have a setter for the Pose property.
            ((GeometricObject)_collisionObjectA.GeometricObject).Pose = pose;

            // ----- Update collision domain. This computes new contact information.
            float timeStep = (float)gameTime.ElapsedGameTime.TotalSeconds;

            _domain.Update(timeStep); // Needs to be called once per frame.

            // ----- Draw objects using the DebugRenderer of the graphics screen.
            // We reset the DebugRenderer every frame.
            var debugRenderer = GraphicsScreen.DebugRenderer;

            debugRenderer.Clear();

            // Draw geometric objects. If an object has a contact with any other object,
            // it is drawn yellow.
            bool objectBHasContact = _domain.HasContact(_collisionObjectB);
            var  color             = objectBHasContact ? Color.Yellow : Color.Blue;

            debugRenderer.DrawObject(_collisionObjectB.GeometricObject, color, false, false);

            bool objectCHasContact = _domain.HasContact(_collisionObjectC);

            color = objectCHasContact ? Color.Yellow : Color.Red;
            debugRenderer.DrawObject(_collisionObjectC.GeometricObject, color, false, false);

            bool objectAHasContact = _domain.HasContact(_collisionObjectA);

            color = objectAHasContact ? Color.Yellow : Color.Green;
            debugRenderer.DrawObject(_collisionObjectA.GeometricObject, color, false, false);

            // Get closest points.
            // Closest-point queries are not used as often as contact queries. They are
            // not computed by the collision domain. Therefore, we ask the collision
            // detection for the closest points.
            ContactSet closestPointsAB = _collisionDetection.GetClosestPoints(_collisionObjectA, _collisionObjectB);
            ContactSet closestPointsAC = _collisionDetection.GetClosestPoints(_collisionObjectA, _collisionObjectC);
            ContactSet closestPointsBC = _collisionDetection.GetClosestPoints(_collisionObjectB, _collisionObjectC);

            // Draw closest points.
            // Each contact set contains one contact that describes the closest-point pair.
            debugRenderer.DrawPoint(closestPointsAB[0].PositionAWorld, Color.White, true);
            debugRenderer.DrawPoint(closestPointsAB[0].PositionBWorld, Color.White, true);
            debugRenderer.DrawPoint(closestPointsAC[0].PositionAWorld, Color.White, true);
            debugRenderer.DrawPoint(closestPointsAC[0].PositionBWorld, Color.White, true);
            debugRenderer.DrawPoint(closestPointsBC[0].PositionAWorld, Color.White, true);
            debugRenderer.DrawPoint(closestPointsBC[0].PositionBWorld, Color.White, true);

            // Draw lines that represent the minimal distances.
            debugRenderer.DrawLine(closestPointsAB[0].PositionAWorld, closestPointsAB[0].PositionBWorld, Color.White, true);
            debugRenderer.DrawLine(closestPointsAC[0].PositionAWorld, closestPointsAC[0].PositionBWorld, Color.White, true);
            debugRenderer.DrawLine(closestPointsBC[0].PositionAWorld, closestPointsBC[0].PositionBWorld, Color.White, true);
        }
예제 #3
0
        public void HaveContact()
        {
            CollisionDomain domain = new CollisionDomain(new CollisionDetection());
              domain.CollisionDetection.CollisionFilter = new CollisionFilter();

              CollisionObject a = new CollisionObject();
              ((GeometricObject)a.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)a.GeometricObject).Pose = new Pose(new Vector3F(0, 0, 0));
              //a.Name = "a";

              CollisionObject b = new CollisionObject();
              ((GeometricObject)b.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(1, 0, 0f));
              //b.Name = "b";

              CollisionObject c = new CollisionObject();
              ((GeometricObject)c.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3F(1, 0, 0f));
              //c.Name = "c";

              domain.CollisionObjects.Add(a);
              domain.CollisionObjects.Add(b);
              domain.Update(0.01f);
              Assert.AreEqual(true, domain.HaveContact(a, b));
              Assert.AreEqual(true, domain.HaveContact(a, c));
              Assert.AreEqual(true, domain.HasContact(a));
              Assert.AreEqual(true, domain.HasContact(b));
              Assert.AreEqual(true, domain.HasContact(c));
              Assert.AreEqual(1, domain.GetContacts(a, b).Count);
              Assert.AreEqual(1, domain.GetContacts(a, c).Count);
              Assert.AreEqual(1, domain.GetContacts(a).Count());
              Assert.AreEqual(2, domain.GetContacts(c).Count());
              Assert.AreEqual(1, domain.ContactSets.Count);

              b.Enabled = false;
              domain.Update(0.01f);
              Assert.AreEqual(false, domain.HaveContact(a, b));
              Assert.AreEqual(true, domain.HaveContact(a, c));
              Assert.AreEqual(false, domain.HasContact(a));
              Assert.AreEqual(false, domain.HasContact(b));
              Assert.AreEqual(true, domain.HasContact(c));
              Assert.AreEqual(null, domain.GetContacts(a, b));
              Assert.AreEqual(1, domain.GetContacts(a, c).Count);
              Assert.AreEqual(0, domain.GetContacts(a).Count());
              Assert.AreEqual(1, domain.GetContacts(c).Count());
              Assert.AreEqual(0, domain.ContactSets.Count);

              a.Enabled = false;
              b.Enabled = true;
              domain.Update(0.01f);
              Assert.AreEqual(false, domain.HaveContact(a, b));
              Assert.AreEqual(false, domain.HaveContact(a, c));
              Assert.AreEqual(false, domain.HasContact(a));
              Assert.AreEqual(false, domain.HasContact(b));
              Assert.AreEqual(true, domain.HasContact(c));
              Assert.AreEqual(null, domain.GetContacts(a, b));
              Assert.AreEqual(null, domain.GetContacts(a, c));
              Assert.AreEqual(0, domain.GetContacts(a).Count());
              Assert.AreEqual(1, domain.GetContacts(c).Count());
              Assert.AreEqual(0, domain.ContactSets.Count);

              c.Enabled = false;
              domain.Update(0.01f);
              Assert.AreEqual(false, domain.HaveContact(a, b));
              Assert.AreEqual(false, domain.HaveContact(a, c));
              Assert.AreEqual(false, domain.HasContact(a));
              Assert.AreEqual(false, domain.HasContact(b));
              Assert.AreEqual(false, domain.HasContact(c));
              Assert.AreEqual(null, domain.GetContacts(a, b));
              Assert.AreEqual(null, domain.GetContacts(a, c));
              Assert.AreEqual(0, domain.GetContacts(a).Count());
              Assert.AreEqual(0, domain.GetContacts(c).Count());
              Assert.AreEqual(0, domain.ContactSets.Count);

              a.Enabled = true;
              c.Enabled = true;
              ((CollisionFilter) domain.CollisionDetection.CollisionFilter).Set(a, b, false);
              domain.Update(0.01f);
              Assert.AreEqual(false, domain.HaveContact(a, b));
              Assert.AreEqual(true, domain.HaveContact(a, c));
              Assert.AreEqual(false, domain.HasContact(a));
              Assert.AreEqual(false, domain.HasContact(b));
              Assert.AreEqual(true, domain.HasContact(c));
              Assert.AreEqual(null, domain.GetContacts(a, b));
              Assert.AreEqual(1, domain.GetContacts(a, c).Count);
              Assert.AreEqual(0, domain.GetContacts(a).Count());
              Assert.AreEqual(2, domain.GetContacts(c).Count());
              Assert.AreEqual(0, domain.ContactSets.Count);

              ((CollisionFilter) domain.CollisionDetection.CollisionFilter).Set(a, b, true);
              domain.Update(0.01f);
              Assert.AreEqual(true, domain.HaveContact(a, b));
              Assert.AreEqual(true, domain.HaveContact(a, c));
              Assert.AreEqual(true, domain.HasContact(a));
              Assert.AreEqual(true, domain.HasContact(b));
              Assert.AreEqual(true, domain.HasContact(c));
              Assert.AreEqual(1, domain.GetContacts(a, b).Count);
              Assert.AreEqual(1, domain.GetContacts(a, c).Count);
              Assert.AreEqual(1, domain.GetContacts(a).Count());
              Assert.AreEqual(2, domain.GetContacts(c).Count());
              Assert.AreEqual(1, domain.ContactSets.Count);

              c.Enabled = false;
              domain.Update(0.01f);
              Assert.AreEqual(true, domain.HaveContact(a, b));
              Assert.AreEqual(false, domain.HaveContact(a, c));
              Assert.AreEqual(true, domain.HasContact(a));
              Assert.AreEqual(true, domain.HasContact(b));
              Assert.AreEqual(false, domain.HasContact(c));
              Assert.AreEqual(1, domain.GetContacts(a, b).Count);
              Assert.AreEqual(null, domain.GetContacts(a, c));
              Assert.AreEqual(1, domain.GetContacts(a).Count());
              Assert.AreEqual(0, domain.GetContacts(c).Count());
              Assert.AreEqual(1, domain.ContactSets.Count);
        }
예제 #4
0
        public void RayCastStopsAtFirstHit()
        {
            CollisionDomain domain = new CollisionDomain(new CollisionDetection());

              CollisionObject ray = new CollisionObject();
              ((GeometricObject)ray.GeometricObject).Shape = new RayShape(new Vector3F(), new Vector3F(1, 0, 0), 100)
              {
            StopsAtFirstHit = true,
              };
              //ray.Name = "Ray";

              CollisionObject b = new CollisionObject();
              ((GeometricObject)b.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)b.GeometricObject).Pose = new Pose(new Vector3F(-10, 0, 0f));
              //b.Name = "b";

              CollisionObject c = new CollisionObject();
              ((GeometricObject)c.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3F(0, 0, 0f));
              //c.Name = "c";

              CollisionObject d = new CollisionObject();
              ((GeometricObject)d.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)d.GeometricObject).Pose = new Pose(new Vector3F(10, 0, 0f));
              //d.Name = "d";

              CollisionObject e = new CollisionObject();
              ((GeometricObject)e.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)e.GeometricObject).Pose = new Pose(new Vector3F(20, 0, 0f));
              //e.Name = "e";

              CollisionObject f = new CollisionObject();
              ((GeometricObject)f.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)f.GeometricObject).Pose = new Pose(new Vector3F(110, 0, 0f));
              //f.Name = "f";

              // Positions: b=-10, c=0, d=10, e=20, f=110
              domain.CollisionObjects.Add(ray);
              domain.CollisionObjects.Add(b);
              domain.CollisionObjects.Add(d);
              domain.CollisionObjects.Add(c);
              domain.CollisionObjects.Add(e);
              domain.CollisionObjects.Add(f);

              domain.Update(0.01f);
              Assert.AreEqual(1, domain.GetContacts(ray).Count());
              Assert.AreEqual(true, domain.HaveContact(ray, c));

              ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3F(30));
              // Positions: b=-10, d=10, e=20, c=30, f=110
              domain.Update(0.01f);
              Assert.AreEqual(1, domain.GetContacts(ray).Count());
              Assert.AreEqual(true, domain.HaveContact(ray, d));

              ((GeometricObject)d.GeometricObject).Pose = new Pose(new Vector3F(40));
              // Positions: b=-10, e=20, c=30, d=40, f=110
              domain.Update(0.01f);
              Assert.AreEqual(1, domain.GetContacts(ray).Count());
              Assert.AreEqual(true, domain.HaveContact(ray, e));

              ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, QuaternionF.CreateRotationZ(ConstantsF.PiOver2));
              domain.Update(0.01f);
              Assert.AreEqual(0, domain.GetContacts(ray).Count());

              ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, QuaternionF.CreateRotationZ(ConstantsF.Pi));
              domain.Update(0.01f);
              Assert.AreEqual(1, domain.GetContacts(ray).Count());
              Assert.AreEqual(true, domain.HaveContact(ray, b));

              ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, QuaternionF.Identity);
              domain.Update(0.01f);

              // Positions: b=-10, e=20, c=30, d=40, f=110
              CollisionObject gNotInDomain = new CollisionObject();
              ((GeometricObject)gNotInDomain.GeometricObject).Shape = new SphereShape(1);
              ((GeometricObject)gNotInDomain.GeometricObject).Pose = new Pose(new Vector3F(10, 0, 0f));
              Assert.AreEqual(true, domain.HaveContact(ray, gNotInDomain));
              Assert.AreEqual(1, domain.GetContacts(gNotInDomain).Count());
              Assert.AreEqual(1, domain.GetContacts(ray, gNotInDomain).Count);
              Assert.AreEqual(true, domain.HasContact(gNotInDomain));
              ((GeometricObject)gNotInDomain.GeometricObject).Pose = new Pose(new Vector3F(25, 0, 0f)); // behind e
              Assert.AreEqual(false, domain.HaveContact(ray, gNotInDomain));
              Assert.AreEqual(false, domain.HaveContact(gNotInDomain, ray));
              Assert.AreEqual(false, domain.HasContact(gNotInDomain));
              Assert.AreEqual(0, domain.GetContacts(gNotInDomain).Count());
              Assert.IsNull(domain.GetContacts(ray, gNotInDomain));
              Assert.IsNull(domain.GetContacts(gNotInDomain, ray));

              // Remove ray from domain.
              domain.CollisionObjects.Remove(ray);
              domain.Update(0.01f);
              Assert.AreEqual(0, domain.ContactSets.Count);

              // Positions: b=-10, e=20, g=25, c=30, d=40, f=110
              domain.Update(0.01f);
              Assert.AreEqual(1, domain.GetContacts(ray).Count());
              Assert.AreEqual(true, domain.HaveContact(ray, e));
              Assert.AreEqual(false, domain.HaveContact(ray, c));
              Assert.AreEqual(false, domain.HaveContact(ray, gNotInDomain));
              Assert.IsNull(domain.GetContacts(ray, gNotInDomain));
        }
예제 #5
0
        public void RayCastStopsAtFirstHit()
        {
            CollisionDomain domain = new CollisionDomain(new CollisionDetection());

            CollisionObject ray = new CollisionObject();

            ((GeometricObject)ray.GeometricObject).Shape = new RayShape(new Vector3(), new Vector3(1, 0, 0), 100)
            {
                StopsAtFirstHit = true,
            };
            //ray.Name = "Ray";

            CollisionObject b = new CollisionObject();

            ((GeometricObject)b.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)b.GeometricObject).Pose  = new Pose(new Vector3(-10, 0, 0f));
            //b.Name = "b";

            CollisionObject c = new CollisionObject();

            ((GeometricObject)c.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)c.GeometricObject).Pose  = new Pose(new Vector3(0, 0, 0f));
            //c.Name = "c";

            CollisionObject d = new CollisionObject();

            ((GeometricObject)d.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)d.GeometricObject).Pose  = new Pose(new Vector3(10, 0, 0f));
            //d.Name = "d";

            CollisionObject e = new CollisionObject();

            ((GeometricObject)e.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)e.GeometricObject).Pose  = new Pose(new Vector3(20, 0, 0f));
            //e.Name = "e";

            CollisionObject f = new CollisionObject();

            ((GeometricObject)f.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)f.GeometricObject).Pose  = new Pose(new Vector3(110, 0, 0f));
            //f.Name = "f";

            // Positions: b=-10, c=0, d=10, e=20, f=110
            domain.CollisionObjects.Add(ray);
            domain.CollisionObjects.Add(b);
            domain.CollisionObjects.Add(d);
            domain.CollisionObjects.Add(c);
            domain.CollisionObjects.Add(e);
            domain.CollisionObjects.Add(f);

            domain.Update(0.01f);
            Assert.AreEqual(1, domain.GetContacts(ray).Count());
            Assert.AreEqual(true, domain.HaveContact(ray, c));

            ((GeometricObject)c.GeometricObject).Pose = new Pose(new Vector3(30));
            // Positions: b=-10, d=10, e=20, c=30, f=110
            domain.Update(0.01f);
            Assert.AreEqual(1, domain.GetContacts(ray).Count());
            Assert.AreEqual(true, domain.HaveContact(ray, d));

            ((GeometricObject)d.GeometricObject).Pose = new Pose(new Vector3(40));
            // Positions: b=-10, e=20, c=30, d=40, f=110
            domain.Update(0.01f);
            Assert.AreEqual(1, domain.GetContacts(ray).Count());
            Assert.AreEqual(true, domain.HaveContact(ray, e));

            ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, Quaternion.CreateRotationZ(ConstantsF.PiOver2));
            domain.Update(0.01f);
            Assert.AreEqual(0, domain.GetContacts(ray).Count());

            ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, Quaternion.CreateRotationZ(ConstantsF.Pi));
            domain.Update(0.01f);
            Assert.AreEqual(1, domain.GetContacts(ray).Count());
            Assert.AreEqual(true, domain.HaveContact(ray, b));

            ((GeometricObject)ray.GeometricObject).Pose = new Pose(((GeometricObject)ray.GeometricObject).Pose.Position, Quaternion.Identity);
            domain.Update(0.01f);

            // Positions: b=-10, e=20, c=30, d=40, f=110
            CollisionObject gNotInDomain = new CollisionObject();

            ((GeometricObject)gNotInDomain.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)gNotInDomain.GeometricObject).Pose  = new Pose(new Vector3(10, 0, 0f));
            Assert.AreEqual(true, domain.HaveContact(ray, gNotInDomain));
            Assert.AreEqual(1, domain.GetContacts(gNotInDomain).Count());
            Assert.AreEqual(1, domain.GetContacts(ray, gNotInDomain).Count);
            Assert.AreEqual(true, domain.HasContact(gNotInDomain));
            ((GeometricObject)gNotInDomain.GeometricObject).Pose = new Pose(new Vector3(25, 0, 0f)); // behind e
            Assert.AreEqual(false, domain.HaveContact(ray, gNotInDomain));
            Assert.AreEqual(false, domain.HaveContact(gNotInDomain, ray));
            Assert.AreEqual(false, domain.HasContact(gNotInDomain));
            Assert.AreEqual(0, domain.GetContacts(gNotInDomain).Count());
            Assert.IsNull(domain.GetContacts(ray, gNotInDomain));
            Assert.IsNull(domain.GetContacts(gNotInDomain, ray));

            // Remove ray from domain.
            domain.CollisionObjects.Remove(ray);
            domain.Update(0.01f);
            Assert.AreEqual(0, domain.ContactSets.Count);

            // Positions: b=-10, e=20, g=25, c=30, d=40, f=110
            domain.Update(0.01f);
            Assert.AreEqual(1, domain.GetContacts(ray).Count());
            Assert.AreEqual(true, domain.HaveContact(ray, e));
            Assert.AreEqual(false, domain.HaveContact(ray, c));
            Assert.AreEqual(false, domain.HaveContact(ray, gNotInDomain));
            Assert.IsNull(domain.GetContacts(ray, gNotInDomain));
        }
예제 #6
0
        public void HaveContact()
        {
            CollisionDomain domain = new CollisionDomain(new CollisionDetection());

            domain.CollisionDetection.CollisionFilter = new CollisionFilter();

            CollisionObject a = new CollisionObject();

            ((GeometricObject)a.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)a.GeometricObject).Pose  = new Pose(new Vector3(0, 0, 0));
            //a.Name = "a";

            CollisionObject b = new CollisionObject();

            ((GeometricObject)b.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)b.GeometricObject).Pose  = new Pose(new Vector3(1, 0, 0f));
            //b.Name = "b";

            CollisionObject c = new CollisionObject();

            ((GeometricObject)c.GeometricObject).Shape = new SphereShape(1);
            ((GeometricObject)c.GeometricObject).Pose  = new Pose(new Vector3(1, 0, 0f));
            //c.Name = "c";

            domain.CollisionObjects.Add(a);
            domain.CollisionObjects.Add(b);
            domain.Update(0.01f);
            Assert.AreEqual(true, domain.HaveContact(a, b));
            Assert.AreEqual(true, domain.HaveContact(a, c));
            Assert.AreEqual(true, domain.HasContact(a));
            Assert.AreEqual(true, domain.HasContact(b));
            Assert.AreEqual(true, domain.HasContact(c));
            Assert.AreEqual(1, domain.GetContacts(a, b).Count);
            Assert.AreEqual(1, domain.GetContacts(a, c).Count);
            Assert.AreEqual(1, domain.GetContacts(a).Count());
            Assert.AreEqual(2, domain.GetContacts(c).Count());
            Assert.AreEqual(1, domain.ContactSets.Count);

            b.Enabled = false;
            domain.Update(0.01f);
            Assert.AreEqual(false, domain.HaveContact(a, b));
            Assert.AreEqual(true, domain.HaveContact(a, c));
            Assert.AreEqual(false, domain.HasContact(a));
            Assert.AreEqual(false, domain.HasContact(b));
            Assert.AreEqual(true, domain.HasContact(c));
            Assert.AreEqual(null, domain.GetContacts(a, b));
            Assert.AreEqual(1, domain.GetContacts(a, c).Count);
            Assert.AreEqual(0, domain.GetContacts(a).Count());
            Assert.AreEqual(1, domain.GetContacts(c).Count());
            Assert.AreEqual(0, domain.ContactSets.Count);

            a.Enabled = false;
            b.Enabled = true;
            domain.Update(0.01f);
            Assert.AreEqual(false, domain.HaveContact(a, b));
            Assert.AreEqual(false, domain.HaveContact(a, c));
            Assert.AreEqual(false, domain.HasContact(a));
            Assert.AreEqual(false, domain.HasContact(b));
            Assert.AreEqual(true, domain.HasContact(c));
            Assert.AreEqual(null, domain.GetContacts(a, b));
            Assert.AreEqual(null, domain.GetContacts(a, c));
            Assert.AreEqual(0, domain.GetContacts(a).Count());
            Assert.AreEqual(1, domain.GetContacts(c).Count());
            Assert.AreEqual(0, domain.ContactSets.Count);

            c.Enabled = false;
            domain.Update(0.01f);
            Assert.AreEqual(false, domain.HaveContact(a, b));
            Assert.AreEqual(false, domain.HaveContact(a, c));
            Assert.AreEqual(false, domain.HasContact(a));
            Assert.AreEqual(false, domain.HasContact(b));
            Assert.AreEqual(false, domain.HasContact(c));
            Assert.AreEqual(null, domain.GetContacts(a, b));
            Assert.AreEqual(null, domain.GetContacts(a, c));
            Assert.AreEqual(0, domain.GetContacts(a).Count());
            Assert.AreEqual(0, domain.GetContacts(c).Count());
            Assert.AreEqual(0, domain.ContactSets.Count);

            a.Enabled = true;
            c.Enabled = true;
            ((CollisionFilter)domain.CollisionDetection.CollisionFilter).Set(a, b, false);
            domain.Update(0.01f);
            Assert.AreEqual(false, domain.HaveContact(a, b));
            Assert.AreEqual(true, domain.HaveContact(a, c));
            Assert.AreEqual(false, domain.HasContact(a));
            Assert.AreEqual(false, domain.HasContact(b));
            Assert.AreEqual(true, domain.HasContact(c));
            Assert.AreEqual(null, domain.GetContacts(a, b));
            Assert.AreEqual(1, domain.GetContacts(a, c).Count);
            Assert.AreEqual(0, domain.GetContacts(a).Count());
            Assert.AreEqual(2, domain.GetContacts(c).Count());
            Assert.AreEqual(0, domain.ContactSets.Count);

            ((CollisionFilter)domain.CollisionDetection.CollisionFilter).Set(a, b, true);
            domain.Update(0.01f);
            Assert.AreEqual(true, domain.HaveContact(a, b));
            Assert.AreEqual(true, domain.HaveContact(a, c));
            Assert.AreEqual(true, domain.HasContact(a));
            Assert.AreEqual(true, domain.HasContact(b));
            Assert.AreEqual(true, domain.HasContact(c));
            Assert.AreEqual(1, domain.GetContacts(a, b).Count);
            Assert.AreEqual(1, domain.GetContacts(a, c).Count);
            Assert.AreEqual(1, domain.GetContacts(a).Count());
            Assert.AreEqual(2, domain.GetContacts(c).Count());
            Assert.AreEqual(1, domain.ContactSets.Count);

            c.Enabled = false;
            domain.Update(0.01f);
            Assert.AreEqual(true, domain.HaveContact(a, b));
            Assert.AreEqual(false, domain.HaveContact(a, c));
            Assert.AreEqual(true, domain.HasContact(a));
            Assert.AreEqual(true, domain.HasContact(b));
            Assert.AreEqual(false, domain.HasContact(c));
            Assert.AreEqual(1, domain.GetContacts(a, b).Count);
            Assert.AreEqual(null, domain.GetContacts(a, c));
            Assert.AreEqual(1, domain.GetContacts(a).Count());
            Assert.AreEqual(0, domain.GetContacts(c).Count());
            Assert.AreEqual(1, domain.ContactSets.Count);
        }