Comment séparer les objets en collision sans créer plus de collisions

11

Supposons que j'utilise un système de détection de collision discret simple où je déplace tous les objets, puis vérifie les collisions. Je veux que tous les objets entrant en collision soient séparés (bien sûr) et affectés des vitesses de réponse appropriées (rebond, glissement, arrêt, etc.).

Lorsque j'ai une paire d'objets en collision, comment les séparer sans me retrouver avec l'un ou les deux en collision avec d'autres objets?

AJM
la source

Réponses:

8

Ce n'est pas un problème facile à résoudre en général. Dans un moteur physique, il serait géré par le solveur de contraint. Il existe de nombreux types de solveurs de contraintes, mais l'un des plus faciles à comprendre est un solveur d'impulsions séquentielles.

Erin Catto a donné une belle explication d'un solveur d'impulsions séquentielles à plusieurs GDC précédents, ils peuvent être téléchargés à partir de la page de téléchargement de Box2D , voir celle de GDC 2009 par exemple.

Niall
la source
Je suis curieux à ce sujet. Étant donné la nécessité fréquente de détecter et de résoudre les collisions, j'ai supposé qu'il existait au moins un algorithme de résolution simpliste adapté aux jeux d'arcade et d'action.
AJM
2
Pas vraiment. Autrefois (SNES, etc.), ils rencontraient des problèmes comme celui-ci avec des modifications ou des compromis dans la conception du jeu. Par exemple. Dans Super Mario, lorsque le joueur était touché, Mario était invincible pendant quelques secondes pour contourner les secondes collisions. Dans Double Dragon, les collisions sont ignorées pour le joueur jusqu'à ce que l'animation pour tomber en arrière soit terminée.
yaustar
@yaustar En fait, Mario n'a aucune collision avec les ennemis. Il prend juste des dégâts lorsque sa hitbox les chevauche.
Hiver
3

La seule façon d'éviter que cela ne se produise est d'empêcher la pénétration en premier lieu. Avant de déplacer un objet, vous devez vous assurer qu'il s'agit d'un mouvement légal. Notez que cela signifie que vous devez déplacer vos objets un par un pour éviter que deux objets ne se déplacent l'un dans l'autre.

Si aucune pénétration ne se produit, vous n'avez à réinitialiser aucune position et vous ne déclencherez donc aucune pénétration secondaire.

Loren Pechtel
la source
2

Ce que je fais habituellement est le suivant:

Lorsque vous séparez des objets et que vous vous retrouvez avec plus de collisions, vous recommencez simplement, jusqu'à ce qu'un nombre maximum d'étapes soit atteint ou que les objets pénètrent moins qu'un seuil prédéfini.

noio
la source
C'est extrêmement instable. Le FPS de votre jeu peut augmenter à tout moment lorsque le joueur fait un gâchis en poussant un objet léger. Il serait préférable de le résoudre la prochaine image.
Hiver