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!)
Réponses:
Voici la méthode que j'ai trouvée. Il pourrait être défectueux, mais je n'ai pas encore trouvé de problème avec cela dans mon analyse superficielle. Il fonctionne également pour les polygones arbitraires avec quelques modifications mineures.
Dans les illustrations ci-dessous, l'objet bleu se déplace et l'objet rouge est immobile. É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!
la source
Découvrez cette question similaire: Résolution de collision
Et aussi, depuis http://www.metanetsoftware.com/technique/tutorialA.html#section5 (auquel vous avez posté un lien vers :))
ÉDITER
En résumé et AFAIK, il y a quelques solutions
la source
Cela dépend si vous souhaitez uniquement un mouvement linéaire ou si vous devez également gérer le mouvement angulaire.
Une alternative à l'utilisation de SAT:
Dans le cas de linéaire uniquement, vous pouvez lancer une projection contre la différence de Minkowski des deux polygones par rapport à l'origine dans la direction de la vitesse linéaire delta des objets.
Si le rayon frappe le MD, les deux objets entreront en collision et le point d'impact vous indiquera l'heure à laquelle ils sont entrés en collision.
Maintenant, si les objets bougent et tournent, cela devient plus difficile, mais vous pouvez toujours utiliser une technique similaire. L'avancement conservateur vous permettra de traiter cette affaire. Cette technique est itérative; chaque itération va générer un nouveau MD et vous rapprocher du moment de l'intersection.
Voici le projet de document original sur l'avancement conservateur:
http://www.continuousphysics.com/BulletContinuousCollisionDetection.pdf
J'ai écrit un article expliquant la technique en détail ici:
http://www.wildbunny.co.uk/blog/2011/04/20/collision-detection-for-dummies/
J'espère que ces aides!
la source