Bonjour ! Je développe un petit moteur de jeu avec des amis et je me m’occupe de toute la partie physique. J’ai déjà implémenté tout ce qui était découpage de l’espace et détection des collisions pour les primitives de base (point + normale + distance d’interpénétration).
Concernant la réponse aux collisions, j’ai choisi une réponse impulsionnelle. J’utilise donc une méthode itérative (Gauss-Seidel) pour approcher la solution et cela fonctionne plutôt bien pour la réponse en vitesse, même si il y a beaucoup de solides en contact.
Cependant je suis confronté à quelques petits problèmes pour la réponse en position. Lorsque le coefficient de restitution est strictement inférieur à 1 (plus de conservation de l’énergie durant le choc), la réponse en vitesse n’éloigne pas autant les objets après intégration que ce qu’ils s’étaient rapprochés le temps du pas de simulation.
Je m’explique, si j’ai deux objets avec une vitesse relative nulle, mais qui accélèrent l’un vers l’autre, exemple : le sol et un objet posé dessus, alors durant la simulation, l’accélération va être intégrée en vitesse et comme il n’y a pas conservation de l’énergie, la réponse en vitesse ne va pas annuler totalement celle-ci et, à la prochaine itération l’objet va un peu plus interpénétrer le sol. On voit donc l’objet passer très lentement à travers le sol.
La solution est donc de repositionner l’objet au point de collision juste avant de calculer la réponse en vitesse (réponse en position) en "remontant" dans le temps. J’ai donc posé les équations de mouvement et les ai inversées (elles sont horribles mais correctes), cependant, si ça fonctionne pour un objet, pour un problème à n objets, cela finit par diverger. En effet, la réponse en position créé de nouvelles collisions (en séparant d’autres objets), qui ne seront détectés qu’à l’itération d’après, le solveur va essayer de retrouver le point de collision avec les équations du mouvement, mais dans ce cas les objets n’étaient peut être pas en train de se rapprocher, le solveur ne peut donc trouver de solution valide avec uniquement ces équations et finit par diverger.
J’ai donc essayé quelques chose de plus simple, de séparer les objets uniquement selon la normale de contact et leur masse/opérateur d’inertie, mais ce modèle n’est pas cohérent et cause quelques inexactitudes visibles notamment lorsque les vitesses de rotations sont élevées et cela devient pire lorsqu’on ajoute les frottements.
Exemple : un objet en équilibre sur un sol en pente et un autre l’empêche de rouler/glisser. Durant l’itération, l’accélération gravitationnelle va donner une vitesse à l’objet, qui va être intégrée en déplacement, le solveur va détecter la collision, répondre en impulsion (quasi inversement de la vitesse normale et donner une vitesse de rotation à cause des frottements), le solveur de position replace l’objet au point de contact, mais la réponse en vitesse n’est pas nulle, après intégration, l’objet s’éloigne un petit peu du sol, cela fait apparaître un phénomène de léger "tremblement" et des réactions bizarres dues aux frottements.
Je me demandais donc si des solutions étaient connues à ce problème ou alors si je devrais considérer le fait de détecter lorsque des objets sont en contact durant plusieurs itérations et appliquer un autre modèle pour résoudre ces collisions.
Merci d’avance.