Projet C++ simulant les collisions entre différentes entités.
Le moteur modélise les interactions entre des particules sphériques et des murs en forme de boites. Des ressorts ont également été implémentés pour relier les particules.
Les forces appliquées sont traitées dans l'ordre suivant :
- forces extérieures ;
- collisions entre particules ;
- collisions entre particules et murs ;
- forces de rappel de ressorts.
Ce moteur permet de définir des "templates" pour les particules, les murs et les ressorts, et de modifier leurs valeurs dynamiquement pour observer leur comportement.
Après avoir sélectionné l'objet à placer en cliquant sur "Select", il existe trois modes de placement :
- Les particules : une particule apparait au niveau du pointeur lors d'un clic.
- Les murs : un mur droit est créé lorsque l'utilisateur fait glisser sa souris en cliquant.
- Les ressorts : après avoir cliqué successivement sur deux particules, ces deux denrières sont reliées par un ressort.
Pour deux sphères de rayons
Dans ce cas, on a donc :
Le point de contact est alors, au choix :
Notons
Dans un premier temps, il y a potentiellement un contact lorsque :
Dans un deuxième temps, on vérifie également la distance aux quatre coins, qui est pour le moment comparée à
Pour déterminer le point de contact, on détecte le bord le plus proche en projetant la position actuelle de la sphère sur chacun des bords avec :
Et on récupère la normale et le point de contact en récupérant le point de contact le plus proche de la sphère :
Les interactions entre deux particules reliées par un ressort sont déterminées par la norme :
On calcule ensuite la différence à la longueur à vide :
Ce qui permet de déterminer les nouvelles vitesses :
Nous avons fait le choix d'implémenter la conservation de l'énergie cinétique dans les collisions.
Toutes les formules utilisées viennent du document ci-dessous :
https://www.owl-ge.ch/IMG/pdf/choc_2D_avec_citation.pdf
Lorsque deux particules interagissent, elles sont téléportées à leur point de contact. Cependant, cette interaction peut les placer à l'intérieur d'autres particules avec lesquelles le contact a déjà été traité. Nous avons estimé que sur plusieurs frames, ce problème se compenserait généralement de lui-même.
A plusieurs reprises, nous avons obtenu des résultats étonnants et des particules qui étaient projetées à l'infini. Ce problème était dû à la normalisation de vecteurs qui étaient parfois nuls.
Initialement, l'implémentation avait été faite avec de l'héritage, en passant par des attributs. Elle est toujours disponible sur la branche box-collisions.
