J'utilise l'approche suivante (similaire à l'algorithme de fractionnement de masse de Tonge http://www.richardtonge.com/ ):
- détecter toutes les paires en collision dans votre scène / contexte. Soit (A, B) une telle paire. Appliquez une idée de division fantôme / masse: si A est en contact avec M corps et B est en contact avec N autres corps, définissez temporairement la masse de A à
m_A/M
et celle de B àm_B/N
- calculer les contributions des forces de réaction / restitution pour chaque paire (A, B) et stocker ces contributions dans les propres accumulateurs A et B
- calculer les vitesses de restitution à partir des impulsions (comme vous l'avez indiqué) et les stocker de la même manière (en tant que résidus de vitesse deltaV dans leurs propres accumulateurs pour chaque paire (A, B))
- calculer les déplacements de pénalité (encore une fois, accumuler les déplacements, ne les appliquez pas instantanément!)
- réinitialiser les masses de tous les corps précédemment désignés comme parties dans les paires de collisions (
m_A = m_A * M
et m_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:
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 "