protected internal override void GetContactInformation(int index, out ContactInformation info) { info.Contact = ContactManifold.contacts.Elements[index]; info.IsMeshContact = false; //Find the contact's normal force. float totalNormalImpulse = 0; info.NormalImpulse = 0; for (int i = 0; i < contactConstraint.penetrationConstraints.Count; i++) { totalNormalImpulse += contactConstraint.penetrationConstraints.Elements[i].accumulatedImpulse; if (contactConstraint.penetrationConstraints.Elements[i].contact == info.Contact) { info.NormalImpulse = contactConstraint.penetrationConstraints.Elements[i].accumulatedImpulse; } } //Compute friction force. Since we are using central friction, this is 'faked.' float radius; Vector3.Distance(ref contactConstraint.slidingFriction.manifoldCenter, ref info.Contact.Position, out radius); if (totalNormalImpulse > 0) { info.FrictionImpulse = (info.NormalImpulse / totalNormalImpulse) * (contactConstraint.slidingFriction.accumulatedImpulse.Length() + contactConstraint.twistFriction.accumulatedImpulse * radius); } else { info.FrictionImpulse = 0; } //Compute relative velocity Vector3 velocity; //If the pair is handling some type of query and does not actually have supporting entities, then consider the velocity contribution to be zero. if (EntityA != null) { Vector3.Subtract(ref info.Contact.Position, ref EntityA.position, out velocity); Vector3.Cross(ref EntityA.angularVelocity, ref velocity, out velocity); Vector3.Add(ref velocity, ref EntityA.linearVelocity, out info.RelativeVelocity); } else { info.RelativeVelocity = new Vector3(); } if (EntityB != null) { Vector3.Subtract(ref info.Contact.Position, ref EntityB.position, out velocity); Vector3.Cross(ref EntityB.angularVelocity, ref velocity, out velocity); Vector3.Add(ref velocity, ref EntityB.linearVelocity, out velocity); Vector3.Subtract(ref info.RelativeVelocity, ref velocity, out info.RelativeVelocity); } info.Pair = this; }
protected internal override void GetContactInformation(int index, out ContactInformation info) { foreach (CollidablePairHandler pair in subPairs.Values) { int count = pair.Contacts.Count; if (index - count < 0) { pair.GetContactInformation(index, out info); return; } index -= count; } throw new IndexOutOfRangeException("Contact index is not present in the pair."); }
protected internal override void GetContactInformation(int index, out ContactInformation info) { info.Contact = MeshManifold.contacts.Elements[index]; info.IsMeshContact = true; //Find the contact's normal and friction forces. info.FrictionImpulse = 0; info.NormalImpulse = 0; for (int i = 0; i < contactConstraint.frictionConstraints.Count; i++) { if (contactConstraint.frictionConstraints.Elements[i].PenetrationConstraint.contact == info.Contact) { info.FrictionImpulse = contactConstraint.frictionConstraints.Elements[i].accumulatedImpulse; info.NormalImpulse = contactConstraint.frictionConstraints.Elements[i].PenetrationConstraint.accumulatedImpulse; break; } } //Compute relative velocity Vector3 velocity; if (convex.entity != null) { Vector3.Subtract(ref info.Contact.Position, ref convex.entity.position, out velocity); Vector3.Cross(ref convex.entity.angularVelocity, ref velocity, out velocity); Vector3.Add(ref velocity, ref convex.entity.linearVelocity, out info.RelativeVelocity); } else { info.RelativeVelocity = new Vector3(); } if (mobileMesh.entity != null) { Vector3.Subtract(ref info.Contact.Position, ref mobileMesh.entity.position, out velocity); Vector3.Cross(ref mobileMesh.entity.angularVelocity, ref velocity, out velocity); Vector3.Add(ref velocity, ref mobileMesh.entity.linearVelocity, out velocity); Vector3.Subtract(ref info.RelativeVelocity, ref velocity, out info.RelativeVelocity); } info.Pair = this; }
protected internal override void GetContactInformation(int index, out ContactInformation info) { info.Contact = ContactManifold.contacts.Elements[index]; //Find the contact's force. info.FrictionImpulse = 0; info.NormalImpulse = 0; for (int i = 0; i < contactConstraint.frictionConstraints.count; i++) { if (contactConstraint.frictionConstraints.Elements[i].PenetrationConstraint.contact == info.Contact) { info.FrictionImpulse = contactConstraint.frictionConstraints.Elements[i].accumulatedImpulse; info.NormalImpulse = contactConstraint.frictionConstraints.Elements[i].PenetrationConstraint.accumulatedImpulse; break; } } //Compute relative velocity Vector3 velocity; if (EntityA != null) { Vector3.Subtract(ref info.Contact.Position, ref EntityA.position, out velocity); Vector3.Cross(ref EntityA.angularVelocity, ref velocity, out velocity); Vector3.Add(ref velocity, ref EntityA.linearVelocity, out info.RelativeVelocity); } else { info.RelativeVelocity = new Vector3(); } if (EntityB != null) { Vector3.Subtract(ref info.Contact.Position, ref EntityB.position, out velocity); Vector3.Cross(ref EntityB.angularVelocity, ref velocity, out velocity); Vector3.Add(ref velocity, ref EntityB.linearVelocity, out velocity); Vector3.Subtract(ref info.RelativeVelocity, ref velocity, out info.RelativeVelocity); } info.Pair = this; }
protected internal abstract void GetContactInformation(int index, out ContactInformation info);