public void Start() { RigidBodyWorld = new RigidBodyWorld(); Physics.Physics.SetContext(RigidBodyWorld.GetWorld()); for (int i = 0; i < _entities.Count; i++) { _entities[i].Activate(); } Running = true; }
public void End() { Running = false; for (int i = 0; i < _entities.Count; i++) { _entities[i].Deactivate(); } Physics.Physics.SetContext(null); RigidBodyWorld.Cleanup(); RigidBodyWorld = null; }
public override int AddContact(ref CollisionData collisionData, RigidBodyWorld world, int limit) { int constacts = 0; for (int i = 0; i < world.pcontacts.Count; i++) { CollisionPrimitive cp = world.pcontacts[i].Bodies[0].CollisionPrimative; CollisionPrimitive cp2 = world.pcontacts[i].Bodies[1].CollisionPrimative; cp.CalculateInternals(); cp2.CalculateInternals(); if (cp is CollisionSphere && cp2 is CollisionSphere) constacts += CollisionDetector.SphereAndSphere((CollisionSphere)cp, (CollisionSphere)cp2, ref collisionData); else if (cp is CollisionSphere && cp2 is CollisionBox) constacts += CollisionDetector.BoxAndSphere((CollisionBox)cp2, (CollisionSphere)cp, ref collisionData); else if (cp2 is CollisionSphere && cp is CollisionBox) constacts += CollisionDetector.BoxAndSphere((CollisionBox)cp, (CollisionSphere)cp2, ref collisionData); } return constacts; }
public override int AddContact(ref CollisionData collisionData, RigidBodyWorld world, int limits) { Vector3 a_pos_world = Bodies[0].GetPointInWorldSpace(Position[0]); Vector3 b_pos_world = Bodies[1].GetPointInWorldSpace(Position[1]); Vector3 a_to_b = b_pos_world - a_pos_world; Vector3 normal = a_to_b; normal.Normalize(); float length = a_to_b.Magnitude; if (MathHelper.Abs(length) > Error) { Contact contact = new Contact(); contact.Bodies[0] = Bodies[0]; contact.Bodies[1] = Bodies[1]; contact.ContactNormal = normal; contact.ContactPoint = (a_pos_world + b_pos_world) * 0.5f; contact.Penetration = length - Error; contact.Friction = 1.0f; contact.Restitution = 0; collisionData.Contacts.Add(contact); return 1; } return 0; }
public virtual int AddContact(ref CollisionData collisionData, RigidBodyWorld world, int limit) { return 0; }