ENSIMAG 3A - Synthèse d'images et animation
Projet 1: animation de tissu


Modalités

Conseils

Cahier des charges

L'objectif de ce projet est de réaliser un moteur d'animation physique de tissu et de rendu temps réel de haute qualité.
Ce moteur sera implémenté en C++ en utilisant OpenGL et son langage de shaders GLSL.

Animation physique

Avant de commencer le projet d'animation, terminez les TPs sur les systèmes masse-ressort et sur les collisions de la séance n°3. Vous devez en particulier être capable de simuler une surface 2D représentée par un système masse-ressort et gérer les collisions avec des sphères et des plans.

Intégration au moteur de rendu OpenGL

Une fois ces TPs terminés, intégrez-les au projet créé lors des TPs de rendu. À chaque modification, pensez à bien mettre à jour à la fois:

pour avoir un affichage cohérent entre la dynamique et le modèle visuel.

Par exemple, pour initialiser votre scène, vous pouvez écrire :
   dynamics.initDynamics();
   initMaillage();
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity(); 
   gluPerspective(45.0f, 1.0f,  1.0f, 1000.0f);
   GLfloat proj[16];
   glGetFloatv(GL_PROJECTION_MATRIX  , proj);
   projectionMatrix =  mat4(proj[0],proj[1],proj[2],proj[3],
               proj[4],proj[5],proj[6],proj[7],
               proj[8],proj[9],proj[10],proj[11],
               proj[12],proj[13],proj[14],proj[15]);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   MyView.AngleX = 180.0f;
   MyView.AngleY = 180.0f;
   glRotatef(180.0,0,0,1);
   glRotatef(MyView.AngleY,0,1,0);
   glRotatef(MyView.AngleX,1,0,0);    
   MyView.Distance = 27.0f;
   glTranslatef(0, 0,  -MyView.Distance);
   modelWorldMatrix =  mat4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);
   float modelview[16];
   glGetFloatv(GL_MODELVIEW_MATRIX  , modelview);
   worldViewMatrix =  mat4(modelview[0],modelview[1],modelview[2],modelview[3],
               modelview[4],modelview[5],modelview[6],modelview[7],
               modelview[8],modelview[9],modelview[10],modelview[11],
               modelview[12],modelview[13],modelview[14],modelview[15]); 

Système masse ressort

Téléchargez le fichier cloth.3ds. Ce fichier contient un maillage triangulaire représentant un T-shirt. Ce maillage va être considéré comme modèle visuel de votre simulation physique. Construisez le système masse-ressort associé à ce maillage.

Couplage modèle visuel - modèle physique

Quand vous lancez la simulation, le système masse-ressort s'anime. Modifiez votre programme pour coupler le modèle visuel avec le modèle physique (i.e. pour qu'une déformation du système masse-ressort entraîne une déformation du modèle visuel).

Simulation de vêtement sur un personnage

Téléchargez le fichier corps.txt. Ce fichier contient sur chaque ligne la position 3D d'une sphère ainsi que son rayon.

Exemple :

   0.5 1.0 1.5 5.4
   0.6 0.6 0.7 3.2 
décrit 2 sphères : l'une de rayon 5.4 en position (0.5,1.0,1.5), l'autre de rayon 3.2 en position (0.6,0.6,0.7).
Ecrivez une fonction qui lit ce fichier et crée les sphères correspondantes dans votre scène.

Lancez votre simulation, vous devriez obtenir l'animation du vêtement qui se pose sur le corps du personnage.

Prise en compte du vent

Ajouter à votre simulation du vent. Vous pouvez commencer par une direction et une force de vent fixe puis laisser l'utilisateur définir et modifier ces deux paramètres lors de la simulation.

Rendu

En terme de rendu, l'objectif est de vous faire découvrir un certain nombre d'effets graphiques dans le contexte d'un pipeline temps réel. Après avoir implémenté une base commune (ombre et carte d'environnement), vous pourrez choisir d'ajouter des effets de type photoréaliste et expressif. Nous vous en proposons quelques uns à titre d'exemple, mais vous êtes tout à fait libre d'en choisir d'autres.

Ombres

Nous demandons à tous les groupes d'implémenter une des deux techniques de calcul des ombres présentées en cours (shadow mapping ou shadow volume).

Certains pourront, comme extension, chercher à obtenir des ombres douces en utilisant l'une des nombreuses approximations proposées dans la littérature (plus simple en partant d'une shadow map).

Carte d'environnement

Nous vous demandons également à tous d'implémenter la technique d'environment mapping permettant de créer des effets de réflexion depuis un éclairage à partir d'une image. Gérer les ombres produites par une carte d'environnement étant un problème complexe, nous vous conseillons de ne considérer que la ou les lumières les plus vives dans la carte.

Un certain nombre d'extensions sont possibles : la création de cartes d'environnement dynamiques pour gérer correctement les scènes animées, l'utilisation de diffuse map pour étendre l'usage des cartes d'environnement à l'éclairage diffus et la stylisation de ces cartes d'environnement par filtrage.

Texture / Bump / Normal mapping

Pour augmenter la complexité visuelle des objets, vous pouvez avoir recours à des textures bitmap ou procédurales.
Outre les textures colorées, vous pouvez utiliser des textures de bump ou de normales pour perturber l'éclairage.

NPR shading

De nombreuses méthodes d'éclairage ont été proposées en rendu non-photoréaliste : cartoon shading, X-Toon shading, Gooch lighting, hatching...
Vous pouvez choisir d'en implémenter certaines.

Silhouettes et contours

La détection des lignes caractéristiques d'une surface (silhouettes, contours...) a fait l'objet de nombreuses recherches en rendu expressif.
Certaines d'entre elles, basées sur le traitement en espace image des cartes de profondeur et/ou de normales, sont particulièrement adaptée au rendu temps réel.

Évaluation