Une grande pièce du puzzle de XPBD, dont nous avons déjà parlé il y a quelques semaines, est la satisfaction des contraintes de particules. Les contraintes de particules forcent une particule à se déplacer et à agir d’une certaine manière, par rapport aux autres particules dans le système.
Si vous me suiviez depuis quelques mois, vous connaissez sans doute mon objectif de simuler le tissu 🧵. Une telle simulation peut avoir des contraintes complexes, mais pour l’instant, nous ne considérerons que les contraintes de distance et les contraintes de flexion.
Voici ces fameux articles que nous avons déjà étudiés lors d’un article il y a quelques semaines sur XPBD que je vais référencer pour les maths au cours de ce post :
Un résumé de XPBD
Rappelons que l’algorithme de XPBD à petits pas est défini comme suit :
⚠️ Comme je l’ai dit, nous avons déjà parlé de cet algorithme à fond et je vous recommande de lire l’article si vous êtes déjà perdu.
Pour l’instant, la boucle qui se trouve seule dans les lignes (6) - (11) nous intéresse. Comme vous pouvez le voir, la fonction de cette boucle est de satisfaire les contraintes de la simulation afin de corriger directement les positions de chaque particule qui participe aux contraintes.
On vient de couvrir la raison pour laquelle cette méthode de simulation s’appelle la dynamique basée sur les positions - PBD 🎉.
Satisfaire les contraintes
Notre objectif lors de la boucle est de calculer le vecteur de correction qu’une particule doit se déplacer afin de satisfaire, ou de se rapprocher de la satisfaction, les contraintes.
où est défini comme suit :
Notez que où est la compliance de la contrainte. Rappelons que où est la raideur de la contrainte. est l’équation de contrainte, est le gradient de et c’est donc un vecteur. est une matrice diagonale de masses inverses des particules participant à la contrainte.
, , et sont des valeurs scalaires.
En utilisant ces équations, nous allons simuler certaines contraintes avec du code ! 🖥️
La contrainte de distance
Pour commencer, nous parlerons de la contrainte de distance, car elle est plutôt facile à comprendre. L’objectif est de satisfaire la contrainte en déplaçant deux particules pour qu’elles se rapprochent à la longueur de repos, :
où est la position d’une particule et est la masse.
Nous pouvons résoudre les équations de la section dernière afin de trouver les corrections de position finale, :
La solution codée
Voici le code où je définis deux particules. La fonction distanceConstraint
est basée sur le calcul de et la mise à jour immédiatement de la position, de la particule . Il existe une contrainte de distance avec une longueur de repos égale à .
Vous remarquerez peut-être qu’il y a une petite astuce lors du calcul. Rappelons que le calcul pour trouver est :
Heureusement, est un vecteur normalisé. Alors :
Nous pouvons donc simplifier notre équation comme suit :
Enfin, j’ai utilisé une fonction de logging pour voir comment les particules se bougent avant et après la boucle de simulation :
BEFORE APPLYING XPBD LOOP
-------------------------
POSITION P1: [ '2.0000', '2.0000', '0.0000' ]
POSITION P2: [ '-2.0000', '-2.0000', '0.0000' ]
AFTER APPLYING XPBD LOOP
------------------------
POSITION P1: [ '0.3536', '0.3536', '0.0000' ]
POSITION P2: [ '-0.3536', '-0.3536', '0.0000' ]
Nous voyons que les deux particules se rapprochent et se déplacent jusqu’aux points . Est-ce que ces nouveaux points satisfont la contrainte de distance ? Rappelons que la longueur de repos est égale à :
Oui ! La contrainte de distance a été satisfaite !
Prochainement…
On verra ensemble la contrainte de flexion isométrique. Restez à l’écoute !