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 🧵. La semaine dernière, nous avons parlé de la contrainte de distance. Cette semaine, nous nous concentrerons sur les contraintes de flexion isométrique.
Encore une fois, je vous présente 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, seule la boucle qui se trouve 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 flexion isométrique
Parlons maintenant de la contrainte de flexion isométrique. Voici un exemple de ce à quoi cela pourrait ressembler lors d’une simulation de tissu :
La contrainte de flexion isométrique est une contrainte de flexion pour les surfaces inextensibles. Fondamentalement, c’est un excellent modèle de flexion pour les simulations de tissu en raison du fait que le tissu ne peut normalement pas être étiré (bien que cela dépende du matériau).
La contrainte se compose de quatre particules qui forment une configuration de deux triangles, qui ressemble à ce qui suit :
où chaque cercle violet est une particule à un emplacement . Les arêtes des deux triangles sont étiquetées comme . Cette configuration s’appelle un stencil.
Pour calculer le déplacement nécessaire d’une particule afin de satisfaire la contrainte - on commence d’abord par l’équation de la contrainte de flexion isométrique :
Quoi 😨 ?! Ne t’inquiétez pas, nous allons décomposer petit à petit cette équation.
On commence avec la matrice , qui est l’énergie de flexion hessienne constante locale. Cette ressource donne la dérivation.
Nous initialisons une seule fois la matrice pour chaque configuration de quatre particules. Rappelons que la matrice hessienne comprend les dérivées partielles du second ordre :
Afin de trouver , on utilise l’équation :
où et sont des aires des triangles adjacents. Rappelons que nous pouvons trouver l’aire d’un triangle si les emplacements de ses trois points sont donnés avec une petite astuce d’algèbre linéaire :
est un vecteur qui se compose des cotangentes entres les arêtes du triangle :
Comment trouver la cotangente entre deux vecteurs 🤔
La cotangente est définie comme suit :
Nous pouvons trouver avec le produit scalaire :
Pour trouver , on utilise le produit croisé :
On peut donc réécrire l’équation de comme suit :
Revenons maintenant à cette équation :
est les emplacements des particules. Enfin, nous avons besoin du gradient pour trouver qui est défini comme suit :
Nous avons désormais toutes les équations dont nous avons besoin. Je trouve que ces équations sont difficiles à vraiment comprendre sans les voir fonctionner dans le code. Alors, regardons un peu de code maintenant !
Le code
Si vous avez déjà vu le code de la contrainte de distance de l’article dernier, vous noterez que la boucle de simulation ne change pas. On se concerne uniquement par la fonction bendingConstraint
.
Heureusement, le code n’est pas sorcier. Nous devons d’abord calculer C
, puis le gradient - grad
, qui est . Ensuite, nous trouvons deltaLagrangianMultiplier
qui est . Enfin, on trouve , qui est le déplacement d’une particule pendant un sous-pas (substep) dans le temps.
Lors de l’exécution du programme - nous devrions voir les éléments suivants enregistrés sur la console :
BEFORE APPLYING XPBD LOOP
-------------------------
POSITION P1: [ '0.0000', '0.0000', '0.0000' ]
POSITION P2: [ '0.0000', '1.0000', '0.0000' ]
POSITION P3: [ '-0.5000', '0.5000', '0.0000' ]
POSITION P4: [ '0.5000', '0.5000', '0.0000' ]
VELOCITY P1: [ '0.0000', '0.0000', '0.0000' ]
VELOCITY P2: [ '0.0000', '0.0000', '0.0000' ]
VELOCITY P3: [ '0.0000', '0.0000', '0.0000' ]
VELOCITY P4: [ '0.0000', '0.0000', '0.0000' ]
AFTER APPLYING XPBD LOOP
------------------------
POSITION P1: [ '0.0000', '0.0000', '0.0000' ]
POSITION P2: [ '0.0000', '1.0000', '0.0000' ]
POSITION P3: [ '-0.5000', '0.5000', '0.0000' ]
POSITION P4: [ '0.5000', '0.5000', '0.0000' ]
VELOCITY P1: [ '0.0000', '0.0000', '0.0000' ]
VELOCITY P2: [ '0.0000', '0.0000', '0.0000' ]
VELOCITY P3: [ '0.0000', '0.0000', '0.0000' ]
VELOCITY P4: [ '0.0000', '0.0000', '0.0000' ]
Génial ! Il ne reste plus qu’à intégrer ces contraintes dans la simulation du tissu ! À la prochaine !