Objectif : Implémentation d'une animation de textiles fixé par deux points.
Modélisation du tissu : Le tissu est discrétisé par un ensemble de particules de masses mi=1 connectées entre elles par des ressorts de raideurs kij = 15000.0, de viscosité nuij = 0.01, et de longueur au repos lij = 0.1. La gravité et la viscosité du milieu sont également pris en compte pour simuler la scène. Ces paramètres sont notamment mis dans les fichiers de données de l'application qui se trouvent dans le répertoire gkit2light/src/master_MecaSim/exec.
Boucle de l'animation :
Calcul des forces appliquées sur les particules
Calcul des accélérations des particules au cours du temps, en utilisant la loi fondamentale de la dynamique
Intégration des accélérations pour obtenir les vitesses
Intégration des vitesses pour obtenir les positions
Affichage de l'objet simulé après lissage des normales
Travail à effectuer :
Vous devez compléter le code de l'application pour simuler le mouvement d'un tissu carré discrétisé par 70 x 70 particules (fichiers de données dans le répertoire gkit2light/data/drap70).
Le tissu est notamment fixé par deux coins. Comment ces coins ont été fixés ? Pour vous aider, vous pouvez regarder les fichiers de données relatifs à cet objet.
Vous pouvez débuter en utilisant des tissus de tailles plus petites en les générant à l'aide du programme CreateData du répertoire /gkit2light/data/CreateMesh. Dans ce répertoire :
Makefile : pour compiler tous les programmes
CreateData.cpp : permet de créer les fichiers de données (format texte) relatifs à des carrés de tissu de taille paramétrable
obj2sappe.cpp, Donnees.h : permet de convertir les fichiers de données des facettes du format .obj au format utilisé par l'application
off2sappe.cpp, Donnees.h : permet de convertir les fichiers de données des facettes du format .off au format utilisé par l'application
scalepoints.cpp, Donnees.h : permet de modifier le fichier des positions des particules en les divisant par un facteur donné
Voici les étapes (détaillées ci-dessous) pour réaliser cette simulation :
Affichage de l'objet simulé
Calcul des forces
Calcul des accélérations
Calcul des vitesses et des positions
Animation du tissu
Interaction avec l'utilisateur
Déchirure
Tombé de tissu
Affichage de l'objet simulé
Complétez la fonction ObjetSimuleMSS::initMeshObjet() pour créer le maillage de l'objet simulé.
Complétez la fonction ObjetSimuleMSS::updateVertex() pour mettre à jour le maillage de l'objet simulé au cours de la simulation.
Calcul des forces
Quelles sont les forces qui sont exercées sur chacune des particules du tissu ?
Complétez le code de l'application pour calculer les forces qui sont exercées sur chacune des particules. Pensez à prendre en compte les forces d'amortissement des ressorts.
Calcul des accélérations
Complétez ensuite le code de l'application, pour calculer les accélérations des particules au cours du temps.
Calcul des vitesses et des positions
Complétez le code de l'application pour calculer par intégration numérique les nouvelles vitesses et positions des particules à partir des accélérations et des vitesses. Implémentez tout d'abord le schéma d'Euler explicite. Puis, utilisez le schéma de leapfrog-Verlet ou le schéma d'Euler semi-implicite.
Comparer ces schémas d'intégration numérique en modifiant la taille des pas de temps. Lequel vous paraît le plus stable ?
Enfin, afin de dissiper les vitesses, multipliez-les par le coefficient de dissipation (ou de viscosité) qui est lié à la scène.
Animation du tissu
Maintenant que les calculs des forces, accélérations, vitesses et positions ont été complétés, vérifiez que l'animation du tissu vous paraît cohérente. Vous pouvez notamment modifier les paramètres du vecteur gravité, la raideur des ressorts, etc.
Interaction avec l'utilisateur
Modifiez l'application afin d'ajouter une interaction avec l'utilisateur. L'interaction avec le clavier (touche m enfoncée + flèches direction) doit permettre de faire bouger un des coins initialement fixe du tissu. Par exemple, vous pouvez modifier l'application pour que la position de la particule 0 soit déterminée par le mouvement de la souris.
Déchirure
Vous pouvez considérer que si la force appliquée à un ressort est trop importante (ou si sa longueur dépasse une certaine taille), le tissu se déchire c'est-à-dire que le ressort considéré est supprimé.
Tombé de tissu
Modifiez les fichiers de données relatifs au tissu de façon à ne plus avoir de points fixes c'est-à-dire que sous l'emprise de la gravité, le tissu doit tomber.
Ajoutez le code permettant de détecter et traiter la collision du tissu sur le sol (dont on connait son emplacement) en faisant en sorte que le tissu reste immobile sur le sol.