Skip to content

Repository files navigation

Simulation de moteur physique

Projet C++ simulant les collisions entre différentes entités.

Principe du moteur

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.

screenshot

Commandes de l'utilisateur

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.

Collisions

Formules

Particule / particule

Pour deux sphères de rayons $r_1$ et $r_2$, on a contact lorsque :

$$|P_2 - P_1| - r_1 - r_2 \le 0$$

Dans ce cas, on a donc :

$$n = \frac{P_2 - P_1}{|P_2 - P_1|}$$

Le point de contact est alors, au choix :

$$C = P_1 + r_1 n$$ $$C = P_2 - r_2 n$$

Mur / particule

Notons $w$ la longueur et $h$ la hauteur de la box. Notons $n_b$ sa normale et $t_b$ sa tangente. On peut calculer la distance horizontale et verticale de la sphère à la box avec :

$$w_s = (P_2 - P_1)t$$ $$h_s = (P_2 - P_1)n$$

Dans un premier temps, il y a potentiellement un contact lorsque :

$$|w_s| - r \le \frac{w}{2} \quad \text{ ou } \quad |h_s| - r \le \frac{h}{2}$$

Dans un deuxième temps, on vérifie également la distance aux quatre coins, qui est pour le moment comparée à $\sqrt{2}r > r$ :

$$\left| P_2 - \left( P_1 + \pm \frac{w}{2} t_b \pm \frac{h}{2} n_b \right) \right| - r \le 0$$

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 :

$$C_1 = P_1 + w_s t_b + \frac{h}{2} n_b, \quad n_1 = n_b$$ $$C_2 = P_1 + w_s t_b - \frac{h}{2} n_b, \quad n_2 = -n_b$$ $$C_3 = P_1 + \frac{w}{2} t_b + h_s n_b, \quad n_3 = t_b$$ $$C_4 = P_1 - \frac{w}{2} t_b + h_s n_b, \quad n_4 = -t_b$$

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 :

$$m = \underset{i}{\arg\min{|P_2 - C_i|}}$$ $$n = n_m$$ $$C = C_m$$

Ressorts

Les interactions entre deux particules reliées par un ressort sont déterminées par la norme :

$$n = \frac{P_2 - P_1}{|P_2 - P_1|}$$

On calcule ensuite la différence à la longueur à vide :

$$x = |P_2 - P_1| - l_0$$

Ce qui permet de déterminer les nouvelles vitesses :

$$dv_1 = \frac{m_1}{m_1 + m_2}kxn$$ $$dv_2 = \frac{-m_2}{m_1 + m_2}kxn$$

Détails d'implémentation

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

Difficultés rencontrées

Réactions en chaîne

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.

Division par zéro

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.

Utilisation de l'héritage

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.

About

Simulation physique pour le cours d'introduction à C++

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages