J'écris un moteur physique 2D en javascript afin de pouvoir en savoir plus sur la physique dans les jeux vidéo. Je le fais fonctionner correctement pour les collisions de corps rigides, sauf si un corps entre en collision avec deux ou plusieurs autres corps en même temps.
Actuellement, pour chaque paire de corps en collision (A, B), je modifie leurs vitesses et vitesses angulaires en fonction de l'impulsion de collision, et je les écarte les unes des autres afin qu'elles ne pénètrent pas. Mais alors la détection de collision et les calculs d'impulsion pour d'autres collisions impliquant A seront erronés.
Quelles approches puis-je explorer pour que mon moteur fonctionne avec plus de 3 objets entrant en collision les uns avec les autres?
Réponses:
J'utilise l'approche suivante (similaire à l'algorithme de fractionnement de masse de Tonge http://www.richardtonge.com/ ):
m_A/M
et celle de B àm_B/N
m_A = m_A * M
etm_B = m_B * N
)Cette approche est similaire à la façon dont l'algorithme itératif de Jacobi fonctionne avec des systèmes d'équations simultanées linéaires. Et ce n'est pas garanti de converger, mais dans mon simulateur il fait le travail assez facilement .. en 3D (oui, une dimension supplémentaire ajoute deux fois la difficulté!).
Attention : corriger les positions et les vitesses uniquement après la fin de votre phase de détection / manipulation de collision! De cette façon, vous mettez simultanément à jour vos acteurs en collision. De plus, les forces de restitution doivent être prises en compte la prochaine fois lors de l'intégration pour les positions et les vitesses.
EDIT: Eh bien, je suppose que vous utilisez la méthode d'intégration Verlet déjà abusée (celle-ci est devenue un nom familier chez les amateurs de gamedev). Dans ce spectre de gestion et d'intégration des collisions, vous voudrez peut-être jeter un œil ici .
MISE À JOUR: Certaines des informations sur la façon d'aborder la collision (et l'auto-collision d'ailleurs) peuvent être trouvées dans ces articles:
Un document quelque peu simple sur la résolution des collisions de corps rigides via des méthodes basées sur les impulsions: http://web.archive.org/web/20060925200136/http://i31www.ira.uka.de/docs/PaperFinal.pdf
Tiges élastiques inextensibles avec friction de torsion basées sur le multiplicateur Lagrange
L'approche que j'ai proposée n'est pas à long terme une contribution originale, de nombreux jeux l'utilisent avec des résultats plausibles et elle a été mieux utilisée par Jakobsen dans son moteur de jeu Hitman.
D'après une expérience quelque peu pratique, les forces de pénalité (similaires à des ressorts linéaires ou exponentiels obtenant leur entrée de la distance de pénétration) ne résolvent pas correctement les pénétrations lorsque d'autres forces des corps qui entrent en collision parviennent à être plus grandes qu'eux. C'est pourquoi j'ai choisi de combiner trois approches (presque redondantes): les forces de réaction newtoniennes (vous poussez le mur, le mur repousse), les vitesses dérivées des impulsions (les boules de billard entrent en collision) et une approche non naturelle "éloigne les corps géométriquement les uns des autres " Solution. Ensemble, ils semblent tout fournir: se débarrasser de la plupartvilains artefacts d'interpénétration, les corps en collision ont tendance à interagir les uns avec les autres sur le long terme (en raison des vitesses et des forces de restitution - au moins les forces qui avaient tendance à faire glisser les corps dans un scénario de collision sont annulées et les corps rebondissent les uns sur les autres) . Enfin, pour mieux comprendre ces concepts simples mais courants, je suggère d'analyser ces diapositives .
Mon épithète de «méthode abusée» décrivant les étapes d'intégration de Verlet vise une croyance de la culture populaire selon laquelle c'est le Saint Graal des méthodes d'intégration. Il est juste légèrement meilleur que son cousin Symplectic Euler (également appelé par certains Euler semi-implicite). Il existe des méthodes d'intégration beaucoup plus compliquées (et toutes portent le nom implicite). De puissants moteurs de jeu les utilisent, mais les développeurs indépendants n'ont pas le temps de les expérimenter depuis que Verlet, lorsqu'il est réglé sur un scénario spécifique, fait vraiment des merveilles. De plus, il n'y a absolument aucune méthode d'intégration capable de gérer des contraintes rigides sans un peu de tricherie (ne peut pas trouver le lien, mais le document auquel je fais référence devrait s'appeler "X.Provot -" Contraintes de déformation dans une masse modèle à ressorts pour décrire le comportement d'un tissu rigide "
la source
Je suggère qu'au lieu de changer les vitesses, vous modifiez les forces agissant sur un objet. Ne pas les «pousser», plutôt, faites-le en douceur et en utilisant du code déjà existant. En faisant cela, les corps ne changeront pas immédiatement (et rapidement, je suppose) leurs vitesses.
Consultez Box2DJS pour un exemple: http://box2d-js.sourceforge.net/index2.html .
la source
J'ai résolu analytiquement une équation d'impulsion pour des groupes de corps en collision. Le seul problème que j'ai rencontré était le manque de variables pour trouver la force d'interaction relative entre les contacts dans un groupe, que j'ai remplie d'intersection de profondeur de corps.
La solution pour les contacts de groupe n'est pas beaucoup plus difficile que le contact unique. Malheureusement, j'ai perdu un papier avec des calculs, donc incapable de le partager ici.
Edit: Probablement, j'ai trouvé quelque chose comme ça /physics/296767/multiple-colliding-balls
la source