MIF37 - Animation par modèles physiques (F. Zara)

Simulation de textiles

  • 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/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 :
    1. Affichage de l'objet simulé
    2. Calcul des forces
    3. Calcul des accélérations
    4. Calcul des vitesses et des positions
    5. Animation du tissu
    6. Interaction avec l'utilisateur
    7. Déchirure
    8. Tombé de tissu


Affichage de l'objet simulé

  • Complétez la fonction ObjetSimuleMSS::initMeshObjet() du fichier ObjetSimule.cpp pour créer le maillage de l'objet simulé.
  • Complétez la fonction ObjetSimuleMSS::updateVertex() du fichier ObjetSimule.cpp pour mettre à jour le maillage de l'objet simulé au cours de la simulation.

Calcul des forces des ressorts

  • Complétez le code de l'application pour calculer les forces qui sont exercées sur chacune des particules par les ressorts du système masses-ressorts. Il s'agit de la fonction ObjetSimuleMSS::CalculForceSpring() présente dans le fichier CalculsMSS.cpp. Pensez à prendre en compte les forces d'amortissement des ressorts.

Calcul de la force de gravité et des accélérations

  • Complétez ensuite le code de l'application, pour calculer les accélérations des particules au cours du temps. Il s'agit de la fonction SolveurExpl::CalculAccel_ForceGravite présente dans le fichier SolveurExpl.cpp. C'est dans cette fonction que vous rajouterez également la force de gravité à l'ensemble des forces appliquées sur le particules.

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. Il s'agit de modifier la fonction SolveurExpl::Solve présente dans le fichier SolveurExpl.cpp. 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. Vous pouvez rajouter des objets dans la scène, le rendu, etc. pour produire une belle animation.

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. Regardez ce qui a été mis pour cela dans le fichier Viewer.cpp. Il s'agit ensuite de modifier la fonction ObjetSimule::Interaction du fichier ObjetSimule.cpp.

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é. Rajoutez le code qui permet de gérer cela.

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. Il s'agit de modifier la fonction ObjetSimuleMSS::CollisionPlan présente dans le fichier CalculsMSS.cpp.
  • Faire une belle scène avec plusieurs objets, des textures sur les objets, etc. Gérer les collisions entre les objets : tissu qui tombe sur une sphère, une table, un cube, etc.