J'ai des objets statiques et des objets mobiles. Les collisions sont détectées à l'aide du théorème de l'axe de séparation.
Par exemple, dans cette situation, j'ai deux objets statiques (en rouge):
et un objet mobile entre les deux:
Mon algorithme est capable de calculer la collision entre deux de ces objets, et il crache également un vecteur de résolution parfaite (c'est-à-dire un vecteur à déplacement minimum) à la collision.
Ainsi, par exemple, lorsque je vérifie la collision entre le rectangle vert et le rectangle rouge droit, l'algorithme crache un vecteur qui me dit comment je dois déplacer le rectangle vert pour résoudre la collision:
Remarquez que je viens de dessiner cela rapidement dans MSPaint, donc dans cette image, il se pourrait que le vecteur de traduction minimum pousse le rectangle vert en haut, mais je vais supposer ici que le pousser vers la gauche / le droit est en fait plus court.
La manière générale d'aborder cela serait de résoudre seulement la collision d'une collision par trame, au lieu de toutes à la fois. Mais dans mon cas, cela entraînerait une bascule:
Tout d'abord, le solveur détecte deux collisions mais ne résout que la collision entre le rectangle droit et le rectangle vert:
Ensuite, dans l'image suivante, il ne détecte qu'une seule collision entre le rectangle rouge gauche et le rectangle vert, et le résout:
Comme vous pouvez le voir, cela ne résout pas réellement la collision (par exemple en poussant le rectangle vert vers le haut), et au lieu de cela, bascule simplement entre les deux états à l'infini.
Comment puis-je résoudre ça?
Réponses:
Selon ce que vous essayez d'atteindre (précision physique élevée ou simulation en temps réel suffisamment proche), vous pouvez essayer d'utiliser des contacts spéculatifs.
Voici les détails: http://www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an-continuous-collision-engine-approach-part-1/
Il décrit dans cet article ce que vous devez savoir pour l'implémenter, et c'est très simple par rapport à d'autres approches (telles que le lancer de sphère puis le tri des résolutions de collision par temps d'impact).
Si vous avez besoin / voulez plus, vous pouvez acheter son code source pour (IIRC) 7 $.
Voici une vidéo de mon implémentation en 3D: http://www.youtube.com/watch?v=JvT2H1RmOas
Notez la stabilité de la simulation avec une seule itération. Vous pouvez facilement utiliser plusieurs itérations par image pour résoudre plusieurs collisions dans un état stable, ce qui serait plus précis.
la source
Vous pouvez d'abord calculer tous les vecteurs nécessaires pour résoudre chaque collision, puis calculer une résultante à partir d'eux.
Le seul cas où cela peut vous octroyer est si ces vecteurs s'annulent, comme dans votre exemple. Dans ce cas, la collision ne peut pas être résolue.
la source
Si vous le regardez attentivement, cet état des objets est (ou devrait être) irréalisable.
Soit la forme rouge la plus à gauche la forme R1, et la forme rouge la plus à droite la forme R2. Que la forme verte soit G.
c'est-à-dire étant donné la taille et la géométrie des trois objets, et étant donné que tous les objets ne sont pas pénétrables:
Maintenant, se résume à cela, si votre algorithme interroge vos objets un par un, c'est alors une question de concurrence, c'est-à-dire que dans un sens, l'algorithme est censé vérifier TOUS les objets en même temps, mais l'algorithme vous limite à faire objets et les traiter un à la fois ...
Si G est vérifié par rapport à R1 après avoir été vérifié par rapport à R2, alors G semble légalement être à droite de R1 (si G dit approche R1 avec la direction du vecteur <-1, -1> avec une amplitude (ou distance) arbitraire) ), car la vérification entre R1 et G le permet, et oublie la vérification entre R2 et G qui a été effectuée auparavant.
Une solution que vous pouvez faire est de collecter tous les vecteurs de déplacement minimum dans un tableau ou dans la structure de données que vous souhaitez, et en choisir un qui se révélerait légal pour TOUS les objets.
Notez qu'à une image donnée, l'objet (G par exemple) ne peut avoir qu'une seule direction. (oh mec, ça ressemble au boyband ...)
la source