ENSIMAG 3A - Synthèse d'images et animation
Projet 1: animation de tissu
Modalités
- Le projet aura lieu le jeudi 27 et vendredi 28 novembre en salle ARV.
- Il sera réalisé par binôme.
- Il devra fonctionner sur une machine de la salle ARV.
Conseils
- Le nombre de sommets chargé par l3ds.cpp est incorrect. Dans la fonction void L3DS::ReadMesh(...) supprimer la multiplication par 2 de count dans l'appel de SetVertexArraySize().
- Pour augmenter la rapidité de votre programme, il ne faut pas rester mode Debug. Pour cela, compiler en mode Release (menu défilant en haut de la fenêtre) et lancer le programme avec "Start without debugging" (Ctrl+F5).
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:
- GL_MODELVIEW et GL_PROJECTION
- worldViewMatrix, modelViewMatrix et projectionMatrix
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.2dé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
- Le projet sera évalué par une soutenance lors de la séance n°7 du 02/12/2009.
- Cette soutenance durera 20 min : 15 min de démo / présentation et 5 min de questions.
- Elle sera réalisée sur une machine de l'ARV.