|
La plupart du temps on utilise un package 3D pour créer les animations. Voyons ces méthodes :
Il s’agit ici d’une animation qui se définit par rapport à une action, par exemple nous pouvons rajouter un comportement sur un objet qui le ferait tourner sur lui-même. Nous pouvons aussi lui affecter une trajectoire géométrique tel qu’un cercle et lui demander de suivre ce cercle à une certaine vitesse. Ce type d’animation n’est, en général, pas éditable directement sous un package 3D car ces comportements sont des éléments du moteur de jeu et donc rarement disponible dans le package 3D lui-même. Il est cependant possible de programmer ces comportements et de les rajouter au package 3D.
On anime ici les objets par de la dynamique. Il s’agit de mécanique du point et du solide plus rarement des fluides. C’est à dire, les objets sont animés par un comportement basé sur des lois physiques.
Exemple : Un personnage tenant une épée, la lâche. La gravité s’appliquant sur cette épée fait qu’elle tombe sur le sol puisqu’aucune contrainte ne la retient. Précédemment, la gravité s’appliquait aussi mais la main du personnage empêchait l’épée de tomber.
On utilise des lois similaires à celle-ci bien qu’en réalité dans les jeux vidéo, nous n’ayons pas forcément besoin d’un réel comportement dynamique mais uniquement de faire croire à ce comportement, de le rendre plausible… Nous n’allons que brièvement parler de la dynamique du point dans ce document. Pour cela on introduit l’équation fondamentale de la dynamique :
F1+ F2 +…+ Fn = m*A
où les Fi sont des vecteurs forces appliqué sur le centre de gravité de l’objet, m est la masse de l’objet ett A son vecteur accélération.
On considère ici un objet où seul son centre de gravité reçoit l’application de forces. Cela est suffisant pour simuler des lancés d’objets par exemple. Dans ce cas, on néglige toute rotation, seul un point (qui n’a donc pas d’orientation) est considéré comme représentant de l’objet sur lequel s’applique les forces.

Figure 1 : cube avec une force de gravité
Cette méthode permet de gérer des particules. C’est un effet très couramment utilisé dans les jeux. On l’utilise en autres pour :
- simuler de la poussière lors de dérapage de voitures.
- simuler un feu avec de la fumée qui monte au-dessus
- Etc.
Voyons sur un exemple comment on applique cette formule :
Considérons que seule une force s’applique sur un objet lancé : son poids noté P = m*g où m est la masse de l’objet, et g la constante gravitationnelle sur terre dont la valeur numérique est 9.81. Avec l’équation fondamentale de la dynamique précédente, on obtient dans ce cas que la somme des forces vaut P le poids, et donc :
P = m*A
Ceci nous permet de calculer l’accélération qui est constante par rapport au temps et vaut A = P / m = g. Or ce qui nous intéresse pour faire bouger un objet c’est sa position à un instant donné.
Pour calculer la position à partir de l’accélération, on est obligé de passer par la calcul de sa vitesse. Pour la calculer, il suffit d’intégrer par rapport au temps l’équation donnant l’accélération, puis pour retrouver la position à un instant donné, il nous faudra encore intégrer la vitesse.
Ce qui fait :
A ( t ) = g
(constant par rapport au temps t)
V(t) = g*t + V0
où V0 est la vitesse au temps 0 (vitesse initiale de l’objet)
Et enfin, on calcule
P( t ) = 1 / 2*g* t2 + V0 * t + P0
Où est P0 est la position au temps 0 (position initiale)
NewPos = CurPos + h * CurSpeed
C’est le moyen le plus commun de création d’une animation. Prenons un exemple concret :
Nous avons une caméra qui doit présenter deux combattants dans une arène, et nous souhaitons que la caméra fasse le tour de des 2 personnages en un temps de 5 secondes.
Remarque : On parle plus fréquemment en nombres de frames plutôt qu’en unité de temps. Pour passer d’un nombre de frames à un nombre de secondes on se sert de la vitesse d’affichage. Si on définit qu’une animation se jouera à 30 FPS sous le package 3D, on sait que 30 frames représenteront donc 1 seconde. Donc en faisant durer une animation 150 frames cela représentera 150 / 30 = 5 secondes d’animation. Mais en général le nombre de frames d’un jeu n’est pas constant…
On peut placer des clés d’animation sur la translation de la caméra, sa rotation ou son scale. Il y a d’autres possibilités que ces 3 cas mais nous n’en parleront pas ici.
Prenons par exemple la translation. Une clé d’animation contiendra au minimum un temps (ou une frame) et une translation qui est un vecteur 3D.
Les animateurs placent ces clés sous un package 3D. Le programmeur les récupère par une phase d’export du package 3D puis il créé l’animation dans le moteur du jeu.
Dans notre exemple, nous voulons que notre caméra passe d’une clé à une autre avec les informations que nous avons fixé dans chaque clé. La manière de passer d’une clé à une autre est appelé l’interpolation.
L’interpolation permet, à partir de 2 clés existantes, de calculer une valeur intermédiaire à un temps donné permettant de relier les 2 clés.
Il nous faut un tableau contenant toutes les clés d’animation. Chacune de ces clés contient un temps, celui auquel s’applique cette clé et une valeur pour la clé. Dans ce tableau les clés sont triées en fonction du temps par ordre croissant.
L’algorithme est le suivant :
- On prend en entrée le temps courant. Notons le t.
- On recherche entre quelles clés on se trouve dans le tableau de clés, pour cela on cherche à vérifier que t soit inférieur au temps d’une clé. On connaît maintenant la clé de départ et d’arrivée notons les respectivement Keyn et Keyn + 1. Appelons tn et t n + 1 respectivement les temps des clés de départ et d’arrivée. Ces clés vérifient : tn <= t <= t n + 1.
- Avec ces 2 clés nous pouvons utiliser une fonction d’interpolation pour nous renvoyer au temps courant la valeur de ce que nous interpolons (translation, rotation etc..)
Remarque : la fonction d’interpolation peut utiliser d’autres informations que ces 2 clés, elle peut utiliser d’autres clés pour lisser l’animation comme dans le cas du TCB.
Voyons quelques fonctions d’interpolation utilisées dans les jeux. |