Trouver le point de collision

8

J'écris un simulateur de corps rigide 2D. Les objets simulés sont des polygones convexes. Ma question concerne la façon de décider du «point» de collision, de sorte que lorsque j'applique une force de réponse, je peux également calculer le couple.

En 2D, la méthode populaire de détection de collision en phase étroite semble être le théorème de l'axe de séparation. Cependant, alors que cela vous donne le "sont-ils en collision?" ainsi que "par combien?", cela ne vous donne PAS de point de référence (à ma connaissance) auquel appliquer la force de réponse (et donc calculer le couple) *.

L'autre méthode (qui m'intéresse également davantage, car c'est ce qui est utilisé en 3D, ce qui serait la prochaine étape logique) consiste à calculer la différence de Minkowski des deux polygones et à décider qu'ils entrent en collision si (0,0) est contenue dans le polygone résultant. Mais, comment utilisez-vous cela pour décider du point relatif auquel appliquer la force de réponse? Mon hypothèse est que, puisque chaque face de cette différence correspond effectivement à une face de l'un des polygones, la distance de séparation est la distance la plus courte de (0,0) au MD, et vous l'appliquez à la face correspondante sur le polygone .

En prime, comment faire cela en 3D?

* Au moment où j'écris ceci, je viens de réaliser que, en utilisant SAT, je pouvais simplement garder une trace des points qui se chevauchent et appliquer la force à la "moyenne" de ces points. Mais je devrais décider sur lequel des plusieurs axes non séparateurs effectuer ce petit truc ...

Kricket
la source

Réponses:

6

Les mots-clés que vous recherchez sont "points d'appui" et "manifold" .

Erin Catto a écrit un excellent moteur de physique 2D. Il présente régulièrement à GDC. Vous devriez être en mesure de trouver certaines de ses diapositives où il explique les collecteurs de collision. La première version de son moteur physique ne supportait que les formes de boîte pour calculer simplement les points de support. C'est là que le moteur tire son nom de Box2D .

La réponse est trop complexe pour être décrite ici, mais la vue d'ensemble est que vous devez choisir un total de 2 points parmi les deux formes. Appliquez ensuite la force de restitution également à chacun. Vous devrez également faire face à un cas d'angle où il est préférable de n'utiliser qu'un seul point de support.

deft_code
la source