Cette page explique :
Comment lancer l'application ?
Repertoire ou se trouvent les donnees : gkit2light/data/
- gkit2light/data/ textures : pour placer des textures
- gkit2light/data/ CreateMesh : programme pour creer des maillages de tissu ou convertir des fichiers .obj .off en fichiers pour l'application
- gkit2light/data/ drap10 : fichiers de donnees d'un tissu de 10 * 10 particules
- gkit2light/data/ drap70 : fichiers de donnees d'un tissu de 70 * 70 particules
- gkit2light/data/ vache : fichiers de donnees d'une vache
- gkit2light/data/ sphere : fichiers de donnees d'une sphere
- gkit2light/data/ bunny : fichiers de donnees du Standford bunny
Plusieurs fichiers dans ces repertoires
- faceset.eti : definition des facettes triangulaires de l'objet
- masses.eti : definition des masses associees aux sommets de l'objet
- points.eti : definition des coordonnees (x,y,z) des sommets de l'objet
- texcoord.eti : definition des coordonnees de textures des sommets de l'objet
Repertoire pour l'execution de l'application : gkit2light/src/master_MecaSim/exec/
- Fichier_Param.simu : parametres de la simulation - gravite, viscosite, nb iterations
- Fichier_Param.objet : parametres de l'objet simule - donnees, k, nu, dt, etc.
Pour lancer l'application depuis le repertoire gkit2light
- Creer un fichier qui s'appelle go
- Mettre dedans l'instruction suivante : ./bin/master_meca_sim_etudiant 1 ./src/master_MecaSim/exec/Fichier_Param.simu ./src/master_MecaSim/exec/Fichier_Param.objet1
- Faire : chmod +x go
- Lancer : ./go depuis le repertoire gkit2light
- ou de maniere generale : Executable nbObjet fichier_param_simulation fichier_param_Obj1 fichier_param_Obj2 ...
Viewer de l'application
La methode init() de Viewer (dans Vierwer-init.cpp) permet de creer le maillage des objets servant pour leur affichage.
La methode render() de Viewer permet l'affichage les maillages (de type Mesh) des objets de la scene. Pour cela nous invoquons gl.draw() sur les Mesh des elements de la Scene. La classe Noeud comporte ainsi le membre m_ObjetSimule de type Mesh (maillage servant a l'affichage des objets simules).
La methode update() de Viewer permet de mettre a jour le Mesh des objets (maillage de l objet cree pour effectuer l affichage) en invoquant la methode updateVertex() pour chacun des elements du graphe de scene. La methode Simulation est notamment invoquee dans cette methode.
La touche 'h' permet de faire apparaitre le menu d'aide de l'application : affichage plein ecran, zoom, etc.
Le graphe de scene
Le graphe de scene est defini dans la classe Viewer par la variable _Simu de type Scene. Il permet de gerer les differents objets de la scene (qui sont attaches a la scene des leur creation).
- La classe Scene contient ainsi la liste des Noeud de la scene (les enfants). Chaque objet que nous souhaitons gerer doit ainsi heriter de la classe Noeud. Par exemple la classe ObjetSimule herite de la classe Noeud.
- Les differentes methodes de la classe Scene vont permettre d'appeler les methodes correspondantes pour chacun des objets Noeud attaches a la scene. Les methodes virtuelles pures de la classe Noeud doivent ainsi obligatoirement etre implementees dans les classes relatives aux differents objets de la scene (meme si elles ne font rien).
- La methode initObjetSimule() de Scene permet d'initialiser les structures de donnees des objets a partir des donnees fournies par les fichiers de donnees (definition des positions des particules, des masses, etc.)
- La methode initMeshObjet() de Scene permet d'initaliser le maillage (de type Mesh) de l'objet pour effectuer son affichage par le viewer.
- La methode Simulation() de la classe Scene permet d'effectuer les differents calculs d'un pas de temps de simulation pour l'ensemble des elements attaches a la Scene.
- A noter que, la gravite et la viscosite du milieu sont definies dans la Scene, c'est-a-dire que leurs proprietes sont identiques pour chacun des objets simules. Leurs caracteristiques sont fournies au lancement de l'application via le fichier de donnees.
Representation d'un objet de la scene pour le visualiser
Les principales structures de donnees relatives a un objet pour effectuer sont affichages sont les suivantes :
- La structure _VIndices contient les indices des sommets du maillage decrivant l'objet visualise. Sa taille est definie par _VISize qui vaut trois fois le nombre de facettes puisqu'une facette est definie par trois sommets. Les trois premiers elements de cette structure correspondent aux indices des trois sommets definissant la premiere facette de l'objet. L'ordre des indices des sommets au sein de cette structure suit ainsi l'ordre des facettes contenues dans la structure _vectFaceSet.
- La structure _vectNormals contient les coordonnees des normales des sommets de l'objet visualise. Les premier elements de _vectNormals correspond aux coordonnees en x, y, z de la normale du premier sommet, et ainsi de suite. Les donnees de cette structure sont calculees a partir des coordonnees de positions des sommets (voir Lissage des normales des sommets).
- La structure _vectTexture contient les coordonnees de texture des sommets de l'objet visualise.
- La structure P qui contient les coordonnees 3D des sommets de l objet.
- Ces differentes structures sont ainsi employees pour creer l objet m_objetSimule de type Mesh (dans la methode initMeshObjet()).
Representation d'un objet de la scene pour l'animer
Les objets simules sont de type ObjetSimule comportant les elements suivants :
- Le tableau P (de type std::vector<Vector>) qui contient les coordonnees de positions des particules constituant l'objet a simuler. Ce tableau est initialise a partir du fichier de donnees correspondant rattache a l'objet. Pour permettre l acces aux coordonnees de position pour l affichage des objets, le tableau P est en fait mis dans la structure Noeud. Le premier element de P (de type Vector) correspond ainsi a la coordonnee en x, y et z de la position du premier sommet de l'objet visualise. L'element suivant correspond a la coordonnee en x, y, et z du deuxieme sommet, et ainsi de suite. Les valeurs de ce tableau sont mises a jour a chaque pas de temps de la simulation.
- Le tableau V (de type std::vector<Vector>) qui contient les coordonnees de vitesses des particules constituant l'objet a simuler. Les elements de ce tableau sont initialises a zero au depart et sont mises a jour a chaque pas de temps de la simulation.
- Le tableau A (de type std::vector<Vector>) qui contient les coordonnees des accelerations des particules constituant l'objet a simuler. Les elements de ce tableau sont initialises a zero au depart et sont mis a jour a chaque pas de temps de la simulation.
- Le tableau Force (de type std::vector<Vector>) qui contient les coordonnees des forces appliquees aux particules constituant l'objet a simuler. Les elements de ce tableau sont initialises a zero au depart et sont mis a jour a chaque pas de temps de la simulation.
- Le tableau M (de type std::vector<float>) qui contient les mases des particules constituant l'objet a simuler. Ce tableau est initialise a partir du fichier de donnees correspondant rattache a l'objet.
Pour un objet simule de type ObjetSimuleMSS qui est ainsi represente par un systeme masses-ressorts, nous utilisons un element appele _SytemeMasseRessort de type MSS.
- La structure MSS permet ainsi de definir le systeme masses-ressorts de l'objet. La structure MSS contient ainsi une liste de Ressort, une liste de Particule.
- la structure Particule (definition physique d'une particule) est constituee d'un identifiant, d'une position, et de la liste des ressorts auxquels la particule est reliee.
- la structure Spring permet de stocker les caracteristiques physiques des ressorts (raideur, amortissement, longueur au repos et viscosite)
- la structure Ressort permet de donner la definition geometrique d'un ressort. Elle est constituee d'un identifiant, d'un Spring contenant ces proprietes, et des deux indices des particules auxquelles le ressort est relie.
- A noter que pour le moment, tous les ressorts d'un meme objet ont les memes caracteristiques physiques definies par l'utilisateur. Il sera possible d'ajouter ulterieurement ces caracteristiques pour chacun des ressorts constituant le systeme masses-ressorts en les mettant par exemple dans un fichier de donnees. Ce systeme masses-ressorts est cree lors de l'initialisation de l'objet simule, notamment a partir du fichier des facettes fourni en parametre de l'objet a simuler. Ce maillage est utilise pour connaitre les interactions qui existent entre les particules d'un objet donne.
La class SolveurExpl permet de gerer un solveur suivant la methode d'Euler semi-implicite.
- La methode CalculAccel_ForceGravite rajoute la force de gravite a l ensemble des forces calculees, puis calcul l acceleration des particules.
- La methode Solve calcul les vitesses et positions des particules avec le schema d integration numerique d Euler semi-implicite.
La class SolveurImpl permet de gerer un solveur suivant la methode d'Euler implicite.
- La methode CalculAccel_ForceGravite rajoute la force de gravite a l ensemble des forces calculees, puis calcul l acceleration des particules.
- La methode Solve calcul les vitesses et positions des particules avec le schema d integration numerique d Euler implicite.
Algorithmes de la simulation
Boucle de la simulation
A chaque pas de temps, les calculs suivants sont effectues pour un objet donne :
Calcul des forces
Les forces f appliquees aux particules constituant un objet sont dues a la gravite du milieu ainsi qu'aux interactions des autres particules constituant l'objet. La force appliquee a la ieme particule du systeme peut ainsi etre formulee par :
avec :
ou :
- E represente l'ensemble des aretes du systeme a particules,
- est la constante de raideur des ressorts,
- est la constante d'amortissement des ressorts,
- est la longueur du ressort au repos reliant la particule i et la particule j,
- represente le vecteur de la gravite,
- et est un vecteur unitaire defini par .
Pour des raisons d'implementation, les forces dues a la gravite sont en fait ajoutees dans le calcul des accelerations.
Calcul des accelerations
Les accelerations des particules sont obtenues a partir de leurs forces en utilisant la loi fondamentale de la dynamique, avec ou est l'acceleration de la particule i, la force appliquee sur cette particule, et sa masse.
C'est au sein de cette methode que le vecteur des forces est reinitialise.
Calcul des vitesses et des positions
Les vitesses et les positions des particules sont obtenues en utilisant la methode explicite de Leap-Frog Verlet :
Calculs effectues pour la visualisation
Calcul de la normale d'une face
Considerons une facette definie par les sommets A, B et C. La normale de cette facette est alors definie par avec et ou x, y et z sont les coordonnees de .
Lissage des normales des sommets
Afin d'eviter d'avoir des "pics" entre les facettes, il faut lisser les normales des sommets. Voici les etapes de ce lissage :
- La premiere etape consiste a initialiser a zero la normale en chacun des sommets du maillage.
- Ensuite pour chacune des facettes, nous allons
- calculer sa normale (voir Calcul de la normale d'une face),
- et ajouter cette valeur a la normale de chacun des sommets constituant la facette.
- Enfin la normale calculee pour chaque sommet est normalisee en la divisant par sa norme.