Synthèse d’images 4. Animation Licence Pro 2005-2006 Sébastien THON IUT de l’Université de Provence, site d’Arles Département Informatique
Introduction Animation = succession d’images fixes, à une fréquence suffisante pour tromper l’œil (cinéma : 24 images/sec). « FPS »: « Frames Per Second » Pour produire une animation : modifier la position d’objets au cours du temps.
En synthèse d’images, 2 types d’animation : - Animation 3D temps réel Ex: simulateur, jeu, … Produit avec une librairie graphique (OpenGL, DirectX, …). Il faut calculer suffisamment d'images par seconde. Le nombre de FPS dépend de la machine. - Animation 3D précalculée Ex: film d’animation, effets spéciaux, … Produit avec un logiciel de synthèse d’images (3D Studio Max, Maya, Lightwave, …). On peut passer plusieurs minutes ou heures pour calculer une image.
3 étapes : Modélisation Représenter les objets par des modèles 3D. Animation Associer un mouvement aux objets. Rendu Créer les images qui composent l’animation. Modélisation Dans le cas d’une animation temps-réel, il faut que cette boucle soit la plus rapide possible (effectuée au moins 20 fois par seconde 20 FPS) Animation Rendu
Animation temps réel Modélisation Animation Rendu Si lors de l’étape de rendu on efface l’écran et on affiche directement les différents éléments à l’écran, alors on observe un effet de scintillement. Animation Rendu
Solution : affichage en « double buffer » On utilise deux buffers d’image. On affiche la scène dans un buffer en mémoire alors que l’autre buffer est affiché. Lorsque l’image est construite, on permute les deux buffers. L’image qui apparaît à l’écran est complète Pas de scintillement Affichage échange Mémoire Écran Mémoire Écran
affichage en « double buffer » avec OpenGL // Lors de l’initialisation de l’affichage Glut,on requiert un affichage // en double buffer. glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH ); // Méthode appelée par Glut pour l’affichage GLvoid callback_display() { // On efface l’image du buffer en mémoire glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // On affiche la scène dans le buffer en mémoire affiche_scene(); // Permutation des deux buffers. Le buffer en mémoire devient visible. glutSwapBuffers(); }
Remarque: Si on utilise un affichage en « double buffer », alors on prend en mémoire vidéo le double de la mémoire nécessaire pour le « Color buffer ». Ex: en 1024x768, 24 bits : taille color buffer = 2.25 Mo en double buffer : 2.25 x 2 = 4.5 Mo
Quelques techniques d’animation abordées : Interpolation de positions-clés Utilisation d’expressions mathématiques Cinématique directe et inverse Simulation dynamique Collisions Effets spéciaux (motion blur)
1. Interpolation de positions clés Permet à l’utilisateur de ne pas avoir à définir toutes les étapes de l’animation : il définit des positions clés (« key frame ») et l’ordinateur se charge de calculer les images intermédiaires par interpolation. Deux images crées par l’utilisateur Images intermédiaires générées par l’ordinateur s’apparente à du morphing en 3D.
1.1 Définition des positions clés Définition manuelle Capture de mouvements
1.1.1 Définition manuelle L’utilisateur donne les valeurs des positions et autres paramètres à interpoler pour chaque position clé. Grand contrôle possible pour l’utilisateur. Travail fastidieux.
Exemple L’animation de personnages dans les jeux (Quake2, Quake3, …) se fait souvent par interpolation de points clés. Ensemble des positions clés pour la course d’un personnage. Tous ces modèles ont exactement le même nombre de points et de facettes. Seule la position des points change d’un modèle-clé à l’autre. Toutes les positions intermédiaires sont obtenues par interpolation.
Exemple Animation de visage par interpolation entre des expressions clés. On peut doser l’importance d’une expression en jouant sur la « distance » entre l’expression au repos et une expression particulière. Au repos Joie Peur Colère
Exemple
1.1.2 Capture de mouvement « Motion capture » (MoCap) : utilisation de capteurs placés en des points de référence sur un acteur, un objet, etc. Utilise les données mesurées pour un modèle virtuel. Mouvements très réalistes. Prédétermination du mouvement très spécifique.
1.2 Interpolation entre les positions clés On a maintenant les positions clés. Comment définir les positions intermédiaires ? Courbes d’interpolation
1.2.1 Concept de courbe d’interpolation La forme de la courbe représente le type de mouvement. paramètre Décélération Mouvement constant Accélération Pas de mouvement temps Mouvement constant Mouvement d’accélération Mouvement de décélération
Quel paramètre d’un objet peut être interpolé ? Position Rotation Échelle Couleur … Différents types de courbes d’interpolation : Linéaire Cubique
1.2.2 Interpolation linéaire Soit un point P(x,y,z) en mouvement. On veut l’amener de (x0,y0,z0) au temps t0 au point (x1,y1,z1) au temps t1. On peut utiliser une interpolation linéaire : P(x1,y1,z1) Y P(x,y,z) P(x0,y0,z0) Z X Si on considère que t0=0 et t1=1, alors : X(t) = (1-t).x0 + t.x1 avec t [0 ,1] = x0 + t.(x1-x0)
1.2.3 Autres types d’interpolation Courbes splines Etc.
2. Expressions mathématiques La position des objets 3D en mouvement peut être donnée par une expression mathématique quelconque dépendante du temps : x = f1(t) y = f2(t) z = f3(t) Courbes paramétriques (paramétrées par le temps t) Ex: Trajectoire circulaire d’une lune autour d’une planète : xL = xP + r . cos(2..f.t) yL = yP + r . sin(2..f.t) zL = zP (xL,yL,zL) r (xP,yP,zP)
3. Cinématique directe et inverse Méthodes très utilisées, notamment pour l’animation de personnages (Half-Life, Unreal Tournament, Max Payne, etc.) Permet plus de souplesse d’animation qu’une interpolation entre des positions clés. On peut obtenir des positions qui n’étaient pas prédéfinies (Ex: un personnage qui tombe au sol ne passera pas au travers d’un mur mais restera adossé).
3.1 Squelette et enveloppe Définit la charpente d’un objet. On anime l’objet en animant le squelette. En général, le squelette est définit par un ensemble de chaînes. Enveloppe Définit l’extérieur visible de l’objet. L’enveloppe est déformée par le squelette.
3.2 Chaînes Racine (1) Os (2) 1 Joint (3) Point de départ de la chaîne. Os (2) Ligne droite qui relie deux joints. Joint (3) Point de rotation entre deux os. Point de contrôle (effector) (4) Placé au bout de la chaîne, permet d’invoquer la cinématique inverse. 1 2 3 4
3.3 Contrôle d’une chaîne Cinématique directe (« forward kinematics ») On spécifie directement l’angle de chaque joint de la chaîne. Cinématique inverse (« inverse kinematics ») On spécifie la position du bout de la chaîne (« effector ») et on calcule automatiquement les angles des joints.
Exemple de chaîne l2 l1 (0,0) est la racine l1 et l2 sont les os 2 l2 l1 X=(x,y) 1 (0,0) (0,0) est la racine l1 et l2 sont les os X est le bout de la chaîne (« effector ») 1 et 2 sont les angles des joints
Cinématique directe l2 l1 On spécifie directement 1 et 2 X=(x,y) 1 (0,0) On spécifie directement 1 et 2 Ensuite on calcule X
Cinématique inverse Que faire si l’animateur connaît la position du bout de la chaîne X ? 2 l2 l1 X=(x,y) 1 (0,0) On va calculer les angles des joints 1 et 2 à partir de X Cinématique inverse.
4. Simulation dynamique 4.1 Principe Certaines animations seraient trop complexes à régler manuellement. Utilisation d’une simulation dynamique en utilisant des lois de la physique.
Ensemble de particules dotées de vitesses propres 4.2 Systèmes de particules 4.2.1 Présentation Ensemble d’éléments dont les mouvements sont régis par des lois physiques (gravité, forces de frottement, collisions, etc.) Ensemble de particules dotées de vitesses propres
Les système de particules permettent de représenter des objets qui n’ont pas forme bien définie (pluie, neige, feu, fumée, chute d’eau, explosion, feu d’artifice, etc.) Les particules peuvent être représentées par de simples points, des polygones ou des objets 3D. On utilise souvent des quadrilatères texturés avec une texture RGBA, orientés face à l’utilisateur (« billboarding »).
4.2.2 Attributs des particules Chaque particule du système est caractérisée par un ensemble d’attributs, comme par exemple : Position Vitesse Masse Taille Couleur Transparence Durée de vie etc.
Gestion d’une particule au cours du temps 4.2.3 Utilisation Système dynamique : lorsque les particules sont crées, elles ont un temps de vie au cours duquel leurs attributs peuvent être modifiés, puis elles disparaissent. Temps de vie Modification des attributs Création Utilisation Suppression Gestion d’une particule au cours du temps
Gestion d’un ensemble de particules A chaque nouvelle image de l’animation, on effectue les étapes suivantes : Génération de nouvelles particules Réglage des attributs des nouvelles particules Les particules en fin de vie sont détruites Les particules restantes sont déplacées et transformées en fonction de leurs attributs Les particules restantes sont affichées
Structures de données class Particule { float x, y, z; float masse; int duree_de_vie; }; class Systeme list <Particule> liste;
Calcul de la position au cours du temps Discrétisation du temps. Force supposée constante pendant dt. Exemple : Déplacement dans un champ de force. Schéma d’intégration d’Euler : P(t+dt) = P(t) + V(t).dt
4.3 Simulations dynamiques avancées Pour représenter certains mouvements de la réalité, on a besoin d’utiliser des modèles physiques plus ou moins complexes : Solides Liquides Fumée Feu Tissus … Méthodes complexes, faisant encore l’objet de recherches scientifiques. Temps de calculs souvent très élevés. Au prix d’approximations, on peut obtenir du temps réel.
4.3.1 Animation de liquides
L’espace est discrétisé en un maillage 3D de sommets. Au cours du temps, des vecteurs vitesse de fluide sont calculés en chaque sommet grâce à des équations de la mécanique des fluides (équations de Navier-Stokes). Des particules de fluide sont placées dans cette matrice 3D. Leur position est donnée par interpolation des vecteurs vitesse. Maillage 3D de sommets
4.3.2 Animation de fumée Le principe est le même que pour l’animation de liquides.
4.3.3 Animation de feu Le principe est le même que pour l’animation de liquides.
4.3.4 Animation de tissus Principe: maillage 2D de sommets reliés par des liaisons plus ou moins élastiques (système masses-ressorts). Des forces sont appliquées sur les sommets. Maillage 2D de sommets
4.3.5 Animation de solides
4.4 API physiques HAVOK http://www.havok.com AGEIA PhysX Utilisé dans plus de 150 jeux sur PC, PS2, PS3, PSP, XBOX, XBOX 360, GameCube. (Half-Life 2, F.E.A.R., HALO 2, Max Payne 2, …) AGEIA PhysX http://www.ageia.com TOKAMAK (Gratuit) http://www.tokamakphysics.com/ …
5. Collisions Le test de collisions entre des objets dans une scène 3D est indispensable dans une application 3D interactive (simulateur, jeu, …) : Est-ce que l’avion a touché le relief du sol ? Est-ce que le personnage est contre le mur du couloir? Est-ce que le boulet de canon a touché le bateau ? …
5.1 Principe Dans le cadre d’animation d’objets, on est confronté au problème des collisions entre ces objets. Détection de collision Déterminer quand et où deux objets se touchent. Résolution de collision Déterminer comment la collision affecte le mouvement des objets.
5.2 Détection de collision Pour détecter si deux objets sont entrés en collision, il faudrait vérifier si le volume de l’un intersecte celui de l’autre, en testant chacun de leurs triangles. Très lourd en temps de calcul. 60000 triangles 5000 triangles
Accélération de la détection de collision Il est nécessaire de mettre en œuvre des stratégies d’accélération de la détection de collision : - Partition de l’espace - Volumes englobant les objets On utilise souvent les deux simultanément.
5.2.1 Partition de l’espace On divise l’espace de la scène 3D en régions. On peut accélérer la recherche de collisions entre 2 objets : si les 2 objets appartiennent à des régions différentes, alors ils ne sont pas en collision.
Remarque : Cette partition de l’espace peut aussi servir à accélérer l’affichage, en n’affichant que les objets se trouvant dans les régions se trouvant dans la pyramide de vue. On n’affiche que les objets se trouvant dans les régions en bleu, ce qui permet d’éviter de perdre du temps en demandant l’affichage de l’étoile rouge, qui ne serait pas visible à l’écran.
1) Partition uniforme de l’espace On divise l’espace de la scène 3D en régions de mêmes tailles. Problème : certaines régions peuvent contenir des milliers de polygones, et d’autres très peu voire aucun.
2) Partition adaptative en quadtree ou octree On divise l’espace de la scène 3D en régions de telles manière à ce qu’elles ne contiennent pas plus de polygones qu’un nombre donné.
5.2.2 Volumes englobants Pour accélérer le test de collision entre 2 objets : test d’intersection entre leur volumes englobants (sphère, boîte, objet simplifié, etc.) Beaucoup plus rapide. Test de collision de deux objets 3D, en testant l’intersection entre leurs boîtes englobantes
Test de collision très simple : 1) Sphère englobante Test de collision très simple : R1 R2 d > R1 + R2 Pas de collision d R1 R2 d < R1 + R2 Collision d Deux sphères entrent en collision si la distance qui sépare leurs centres est inférieure à la somme de leurs rayons.
2) Boîte alignée par rapport aux axes (AABB : Axis Aligned Bounding Box) x z Des collisions peuvent être détectées à tort.
3) Boîte à l’orientation quelconque (OBB : Oriented Bounding Box) x z Plus précis que AABB, mais plus coûteux à calculer.
Algorithmes d’intersections entre différents types de volumes: http://www.realtimerendering.com/int/ Test de collision entre volumes englobants : - Très rapide - Mais approximatif Améliorations : Liste de volumes englobants Hiérarchie de volumes englobants
Dans le moteur physique Reactor utilisé par 3D Studio Max, on peut détecter plus ou moins finement les collisions en utilisant une boîte englobante, ou un sphère englobante, ou une enveloppe convexe, ou une enveloppe concave, etc. Enveloppe englobante de + en + précise ( temps de calculs plus élevés)
Problème Animation : échantillonnage du temps (x images/sec) Si les objets se déplacent rapidement, ou si le nombre d’images par seconde est insuffisant, on risque de manquer une collision. t0 t1 Est ce que la boîte est entrée en collision avec la sphère entre le temps t0 et le temps t1 ?
6. Effets spéciaux Flou de bougé (« Motion blur ») Si le temps de pause d'une photographie est suffisam-ment long pour que le sujet ait le temps de bouger. Si l'appareil photographique bouge au cours de la prise.
Pourquoi reproduire ce phénomène en Synthèse ? Réalisme, par reproduction de la réalité. Réduit l’aliassage temporel. Une animation en 24 images/sec avec motion blur peut être plus agréable qu’une animation en 64 images/sec sans flou.
6.1 Approche 3D Afficher plusieurs fois les objets à plusieurs intervalles discrets de temps, avec un niveau d’opacité différent. Revient à un suréchantillonnage temporel Nécessite de nombreux affichages pour obtenir un effet convaincant. Lent, surtout si l’objet 3D est complexe.
6.2 Approche 2D Traitement 2D de l’image obtenue avec un seul affichage de l’objet 3D. On affiche l’objet dans une texture, puis on affiche plusieurs fois cette image avec différents niveaux d’opacité. Plus rapide Problèmes d’occlusion http://developer.nvidia.com/docs/IO/8230/GDC2003_OpenGLShaderTricks.pdf