Comment résoudre la pénétration de deux corps en collision

9

J'ai implémenté un moteur physique de jeu 3D simple. J'ai déjà une détection de collision décente en place, maintenant j'essaie de comprendre la partie réponse à la collision. J'utilise une méthode basée sur les impulsions pour calculer les vitesses post-collision. Cela fonctionne assez bien, cependant, cela n'empêche pas complètement les corps de continuer à s'interpénétrer. J'ai donc un morceau de code supplémentaire pour résoudre la pénétration. Actuellement, je déplace simplement les corps le long de la normale de contact de la moitié de la profondeur de pénétration - premier corps dans la direction de la normale de contact, deuxième corps dans la direction opposée.

C'est ok la plupart du temps, mais il y a des effets indésirables. Par exemple, imaginez un couloir étroit et un objet qui le traverse. Si l'objet frappe l'un des murs du couloir, la résolution de pénétration le déplace vers le mur opposé, puis dans le cadre suivant vers le premier mur, etc. L'effet est que l'objet vibre en quelque sorte très vite entre les murs ce qui n'est pas joli.

Ma question est donc de savoir s'il existe un meilleur moyen de résoudre la pénétration? Peut-être ne déplacez-vous pas les corps, ajustez simplement leur vitesse (en plus du calcul des impulsions) pour qu'ils arrêtent de se rapprocher et que la pénétration se résout dans les deux images suivantes. Je devine juste ici. Des idées?

Adam
la source

Réponses:

3

Lorsque vous détectez une collision, déterminez à quel moment / à quel moment les corps ont commencé à entrer en collision et traitez la collision à ce stade. Vous pouvez toujours avoir une légère pénétration à résoudre à ce stade, mais il sera beaucoup plus petit et ne générera [généralement] pas les problèmes d'oscillation que vous rencontrez.

Disons que vous avez des étapes de simulation de 100 ms et que dans certaines images, vous avez deux boules qui entrent en collision à mi-chemin (50 ms) dans l'image. Tout d'abord, vous détecterez qu'ils sont entrés en collision à tout moment dans le cadre (ce que j'espère que vous faites déjà efficacement). Ils détermineront à quel moment de l'image ils sont entrés en collision. Gérez maintenant la collision, y compris les 50 premiers ms du cadre dans lequel ils ne sont pas entrés en collision. Vous aurez maintenant les nouvelles vitesses des balles, et vous pouvez également prendre des mesures maintenant pour vous assurer qu'elles ne pénètrent pas (elles devraient être très petites car cela "vient de se produire.") Enfin, vous simulerez les 50 prochaines années de le cadre. Notez que pendant cette période, il peut très bien y avoir une autre collision avec l'une de ces balles ou les deux.

notlesh
la source
1
Donc, vous proposez essentiellement d'implémenter la détection de collision continue, puis de gérer les pénétrations toujours de la même manière que je le fais déjà, car elles seront probablement très petites. Cela pourrait fonctionner, je suppose. Maintenant, je n'ai plus qu'à trouver comment rendre ma détection de collision continue :)
Adam
Je ne sais pas ce que vous entendez par continu. À strictement parler, il n'y a rien de continu dans la simulation physique, car tout est toujours décomposé en quelques étapes discrètes de taille. Prendre des mesures plus petites, ce qui est essentiellement ce que je suggère, entraînera des erreurs beaucoup plus petites (et plus faciles à corriger). Une autre façon de penser à cela est qu'il existe une relation directe entre la taille des pas et les erreurs (telles que la pénétration). Ainsi, lorsque vous détectez une telle erreur, divisez-la en étapes plus petites jusqu'à ce que l'erreur soit facilement réparable.
2012
La détection de collision continue signifie qu'au lieu de vérifier l'intersection entre deux objets statiques (un problème 3D), vous vérifiez le contact de deux objets en mouvement (fondamentalement, un problème 4d). Habituellement, il suffit de ne considérer que les vitesses constantes, car vous pouvez approximer les trajectoires avec des courbes linéaires par morceaux. L'avantage est que la distance de pénétration sera toujours nulle (ou proche de, en raison d'erreurs d'arrondi flottant). Je pensais que vous en parliez, mais j'ai peut-être mal interprété votre réponse?
Adam
@adam Oui, c'est de cela que je parle.
notlesh
2

Consultez cet article - qui a été publié ici plusieurs fois auparavant, recherchez simplement dans les questions et réponses marquées par détection de collision - il vous montre comment faire la résolution de collision "continue" dont parlait stephelton:

http://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.php?page=3

Fondamentalement, vous résolvez des équations cinématiques de base pour le point temporel exact lorsque vos deux boîtes englobantes ont commencé à se croiser. Vous résolvez vos collisions à ce moment précis, puis procédez au temps restant dans votre image. Vous devrez peut-être simuler à nouveau ce qui se passe après le moment de la collision, car les vitesses / accélérations de vos objets auront changé. Mais il y a quand même votre point de départ ... bravo!

Médiocrite
la source
Merci, vérifié l'article. La chose est que j'utilise une représentation différente de mes objets. J'utilise des polyèdres convexes et teste la collision en utilisant le théorème de l'axe de séparation. Cela peut être étendu pour gérer les corps se déplaçant avec des vitesses linéaires constantes (ce que je sais faire), mais je ne sais pas comment gérer également les vitesses angulaires. Mais je poserai une question distincte si je décide de suivre cette voie.
Adam