Pour un moteur de physique que je construis, j'ai besoin de déterminer rapidement si deux corps rigides étaient en contact, au cadre précédent. Je veux que ce soit aussi rapide que possible, alors peut-être que vous pourriez nous donner quelques idées?Graphique de contact
C'est ce que j'ai jusqu'ici. (Et cela fonctionne bien, mais toute chose m'a demander comment je pourrais l'améliorer.)
// I thought using a struct would be a good idea with only two values?
struct Contact
{
public readonly PhyRigidBody Body1;
public readonly PhyRigidBody Body2;
public Contact(PhyRigidBody body1, PhyRigidBody body2)
{
Body1 = body1;
Body2 = body2;
}
}
class ContactComparer : IEqualityComparer<Contact>
{
public bool Equals(Contact x, Contact y)
{
// It just have to be the two same bodies, nevermind the order.
return (x.Body1 == y.Body1 && x.Body2 == y.Body2) || (x.Body1 == y.Body2 && x.Body2 == y.Body1);
}
public int GetHashCode(Contact obj)
{
// There has got to be a better way than this?
return RuntimeHelpers.GetHashCode(obj.Body1) + RuntimeHelpers.GetHashCode(obj.Body2);
}
}
// Hold all contacts in one big HashSet.
private HashSet<Contact> _contactGraph = new HashSet<Contact>(new ContactComparer());
// To query for contacts I do this
Contact contactKey = new Contact(body1, body2);
bool prevFrameContact = _contactGraph.Remove(contactKey);
// ... and then I re-insert it later, if there is still contact.
qu'en est-il de l'extraction d'une extension ou d'une méthode au niveau de la classe, "Contact" pour PhyRigidBody - c'est-à-dire bool contact = somePhyRigidBody.Contact (anotherObject). Mieux encore, si vous vouliez plus tard implémenter une physique non-rigide, vous devriez penser à faire partie de la méthode Contact() d'une interface, vous permettant d'étendre facilement votre bibliothèque. –
Je pense que vous mélangez deux préoccupations différentes ici: comment déterminer le contact devrait en effet aller quelque part où il peut être remplacé (comme une interface, etc.). Mais le gars demande comment * stocker * les données de contact pour la trame précédente, soi-disant * après * le calcul. – Avish
Merci pour les idées. Pensez que je vais ajouter un "HashSet contacts" à chaque PhyRigidBody. Encore besoin de garder les contacts deux fois, à moins que je vérifie simplement les deux corps lors de l'interrogation des contacts. –
LaZe