J'essaie d'implémenter un système de collision dans un jeu 2D que je fais. Le théorème de l'axe de séparation (tel que décrit par le didacticiel sur les collisions de metanet ) semble être un moyen efficace et robuste de gérer la détection des collisions, mais je n'aime pas vraiment la méthode de réponse aux collisions qu'ils utilisent. En se déplaçant aveuglément le long de l'axe du moindre chevauchement, l'algorithme ignore simplement la position précédente de l'objet en mouvement, ce qui signifie qu'il n'entre pas en collision avec l'objet stationnaire autant qu'il y entre et rebondit ensuite.
Voici un exemple de situation où cela aurait de l'importance:

Selon la méthode SAT décrite ci-dessus, le rectangle sortirait simplement du triangle perpendiculaire à son hypoténuse:

Cependant, de manière réaliste, le rectangle devrait s'arrêter dans le coin inférieur droit du triangle, car ce serait le point de première collision s'il se déplaçait continuellement le long de son vecteur de déplacement:

Maintenant, cela n'a peut-être pas vraiment d'importance pendant le jeu, mais j'aimerais savoir s'il existe un moyen d'atteindre efficacement et généralement des déplacements précis de cette manière. J'en ai creusé la tête ces derniers jours et je ne veux pas encore abandonner!
(Post-cross de StackOverflow, j'espère que ce n'est pas contraire aux règles!)
Étape 1: Pour chaque polygone, trouvez les deux points les plus éloignés le long de la projection de ce polygone sur la ligne perpendiculaire au vecteur de mouvement.
Étape 2: Divisez chaque polygone le long de la ligne reliant ces points. La moitié du polygone qui fait face à l'autre polygone le long du vecteur de mouvement est la "coque avant". C'est la seule partie du polygone qui peut éventuellement entrer en collision.
Étape 3:Projetez un vecteur à partir de chaque point sur la "coque avant" de chaque polygone le long du vecteur de mouvement vers le polygone opposé, et vérifiez-le pour l'intersection avec chaque bord de la "coque avant" du polygone opposé. (Peut-être lent, mais les ordinateurs sont assez rapides de nos jours - non?) (Désolé pour la flèche inclinée. Toutes les flèches devraient être parallèles.)
Étape 4: Prenez le vecteur le plus court. Il s'agit de la distance de collision exacte.
Étape 5: Voila!
