Author Topic: Comment gérer simplement et efficacement ses animations ?  (Read 5915 times)

0 Members and 1 Guest are viewing this topic.

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Comment gérer simplement et efficacement ses animations ?
« on: 19 December 2012 à 12:12:27 »
Yop,

grande question métaphysique: comment gérer les animations dans ses scènes ?

j'avoue que pour l'instant j'en suis a "je prend mon objet et je modifie ses valeurs pos/rot/scale" tout betement
mais
1: c'est tout hardcodé
2: si je veux animer une couleur ou une autre valeur je suis obliger de modifier mon objet si ce n'était pas prévu

du coup j'essaye de reposer le problème et la ça coince un peu niveau idée donc j'en appelle à vos conseils.

j'aimerais reprendre l'idée qu'on trouve un peu partout, à savoir une "track" qui permet de faire évoluer la valeur d'un attribut au cours du temps.

comment connaitre les attributs utilisables ? interfaces ?

comment associer une animation à un objet ? sous la forme d'une sorte de callback que je donne à mon objet ? ou avoir un objet utilitaire qui contient toutes les animations et les références aux objets de ma scene et qui les "joues" à chaque update ?

je parle pas encore de pouvoir tout gérer sur une timeline, mais si deja je peux gérer ça a travers un fichier de paramétrage ca serait super.

si vous avez des idées ou des conseils, je suis preneur.

merci

« Last Edit: 20 December 2012 à 10:31:19 by Elrick »

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #1 on: 19 December 2012 à 21:55:15 »
Personne t'a répondu mon poussin ? Bah alors ?
Bon alors déjà chuis vraiment pas spécialiste en anims, j'en ai même jamais fait. Mais bon, j'ai quelques notions...

Déjà faudrait clarifier ce que tu appelles "Objet". Il faut bien séparer ton mesh de ton squelette et de ta skin.

Le mesh c'est une simple collection de vertices et de faces.
Le squelette c'est ce qui est animé, c'est une hiérarchie (généralement, un arbre) de bones de transformations (Position, Rotation, Scale).
La skin c'est la structure qui fait le lien entre le squelette et le mesh, limite tu peux l'associer au mesh (i.e. tu le mets dans la même classe) vu que ça lui est lié. C'est les poids de chaque bone du squelette sur chaque vertex du mesh.

Ensuite, bah il faut gérer ce qu'on appelle généralement une banque d'animations qui sont uniquement liées au squelette (pas de lien avec le mesh ou la skin).

Le cas le plus simple c'est un bête tableau d'animations. Chaque animation c'est généralement une durée, une collection de Pos/Rot/Scale pour chaque bone et pour chaque sample de l'animation. C'est plus ou moins compressé, ça dépend.


Ca c'était pour les classes et structures de stockage, maintenant pour le playback on peut rigoler.

Dans le plus simple des cas, on joue une animation pour chaque mesh. C'est super simple, c'est ce que tu fais déjà : tu prends ton squelette et tu updates ses PRS à chaque frame avec les PRS de l'animation.
A un instant t tu n'as qu'une seule animation qui est jouée, donc pour faire ça tu as généralement besoin du pointeur sur l'animation et du temps relatif au début de l'animation.

Ensuite, pour compliquer les choses, tu peux commencer à gérer les transitions d'animation, ce qu'on appelle Motion Blending. Du coup là tu peux faire appel à un "anim graph" qui te dit quelle animation peut enchaîner sur quelle autre, et quand tu peux te permettre de passer de l'une à l'autre.
Par exemple, un jeu très arcade il s'en fout d'être réaliste et tu peux généralement passer instantanément d'une course à l'arrêt car l'important c'est la réactivité.
Un jeu plus réaliste, par contre, il va imposer des contraintes : par exemple, il va dire "si tu es en course, alors tu peux passer soit à la marche soit à l'arrêt mais seulement une fois que le perso a posé le pied par terre à la frame t ou t + 0.17 et si tu passes en marche alors tu dois interpoler de telle manière et arriver à telle frame, etc." (par exemple, tu vas passer en marche mais à un temps équivalent de la course qui fait que le type va poser le pied gauche après le pied droit, même si la marche commence par le pied droit. Du coup t'es censé faire un parallèle entre l'anim de course et l'anim de marche.

Quoi qu'il en soit, avec un anim graph, tu stockes généralement le node du graph dans lequel tu te trouves ainsi que le temps de l'animation correspondant à ce node.

Pour compliquer encore davantage les choses, tu peux décider de mélanger diverses animations pour des parties de ton mesh qui peuvent être considérées comme indépendantes, c'est ce qu'on appelle Motion Mixing. Par exemple, tu peux parfaitement dire que ton perso est capable de tourner la tête de manière totalement indépendante du fait que le type est en train de courir ou de marcher. Pour un jeu de tir, le type peut complètement viser en marchant ou en courant, ça va impliquer de tourner son buste, ses bras et sa tête pour viser la cible mais du coup la direction de course/marche impose des degrés de libertés spécifiques de manière à ce que le perso se retrouve pas avec son buste tourné à 180°, ça serait quand même un peu naze et le joueur remarquerait sans doute un problème. ;D

Et pour recompliquer encore + les choses, tu peux essayer de mixer de l'Inverse Kinematics (IK) avec tes anims. C'est ce qu'ils font massivement dans Crytek par exemple, où l'anim est influencée par la pente du terrain.
Ou encore mieux dans Max Payne 3 où la liberté de shoot est incroyable (je te conseille cette vidéo: http://www.youtube.com/watch?v=9FTvPSnkV5A#ws). En fait les mecs ont mis la priorité sur un seul truc : être capable de viser où tu veux n'importe quand, parce que c'est pas au joueur de régler le problème des degrés de liberté du perso. Le joueur vise et c'est au perso et ses animations de se démerder pour que ça soit cohérent... Là on parle quand même d'un degré de réalisme assez poussé, je sais pas si t'as besoin d'aller jusque là, surtout pour une démo où rien n'est interactif de toute manière... ;D

Voilà pour mes maigres connaissances en animation, j'espère que ça t'a au moins aidé pour les structures de données à écrire pour héberger tes anims et tes infos ?

Joyeuses fêstasses !
« Last Edit: 19 December 2012 à 21:58:34 by Patapom »
.  Pom  .

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #2 on: 19 December 2012 à 22:36:07 »
merci vieille pom, c'est pas tout a fait le sujet de ma question mais c'est toujours de bonnes infos à prendre ;)


Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #3 on: 19 December 2012 à 23:13:32 »
Heu... C'est quoi le sujet de ta question alors ??
.  Pom  .

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #4 on: 20 December 2012 à 09:40:19 »
Bah admettons que dans ta démo tu veuilles animer des éléments graphiques à l'écran, par exemple un quad qui affiche une bête texture et que tu veuilles qu'entre 0"00'00 et 0"01"00 le quad ailles de la position A à la position B, naivement tu hardcodes une translation entre les 2 points. mais si tu veux que maintenant il se déplace en ajoutant un peu de noise dans l'interpolation, toujours naivement, tu modifies ton code et tu hardcodes la nouvelle translation.

mais c'est lourd, c'est chiant à régler et c'est pas réutilisable.

donc ma question c'était d'avoir quelques idées pour pouvoir scripter un peu toutes ces animations et les déclencher en fonction du temps.
j'essaye de dégrossir le tout dans ma tête mais il y a encore des zones d'ombres donc j'en appelle à l'expérience de ceux qui "savent faire" :)

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #5 on: 20 December 2012 à 17:34:30 »
J'ai envie de dire : démerde-toi ! ;D

Cherche des séquenceurs, on en avait déjà parlé sur ce forum, j'avais écrit "Séquencor" à l'époque, en C# et tout, que je vais probablement pas tarder à réutiliser recoder en C++ pour mes nouveaux besoins ('fin pas le soft, l'interpréteur de séquence).
Y avait aussi rocket machin truc, qui avait l'air pourrave visuellement mais qui a le mérite d'être compact et de bien marcher, contrairement à mon truc. ;D

L'idée de chacun de ces séquenceurs c'est d'avoir une collection de tracks de différents types (bool, int, float, float2, float3, quat) et puis d'y coller des "clés" d'animation. Ensuite en code bah tu t'abonnes à chaque track et tu transfères les data retournées par le séquenceur à ton objet pis voilà...

Pour ce qui est de rajouter du noise sur une anim par contre ça je sais pas trop comment faire un truc générique. Si c'est utilisé par toutes les anims tu fais effectivement un système générique, si c'est que pour une seule bah tu le hardcodes à la porcasse et on n'en parle plus !
.  Pom  .

Offline Hellflip

  • Base
    • View Profile
  • Ancienneté: 1990
  • Groupe: X-men
  • Rôle: Coder
  • Ville: Ile de France Paris
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #6 on: 20 December 2012 à 21:35:40 »
perso j utilise lightwave 3d comme editeur de motions. et j exporte . Ca te sort une enveloppe de keyframe spline par channel x y z h p b hx hy hz  . Ensuite je l importe dans le moteur 3d et j evalue les enveloppes pour creer la matrice de rotation. Le sdk de lightwave fourni les code sources c pour lire les splines, le code est relativement simple a integrer.  Ensuite, tu peux aussi exporter les lien de parente et un motion target entre objet: indispensable pour faire des anins typiquement demoesque. 

En resume, reprendre un  editeur de motion/3d deja pret, ya pas besoin de reinventer la roue sur les motions Et aller de l avant pour se concentrer sur les motions, et ca laisse le peu de temps dispo pour faire vraiment les effets de demo

Ps: lightwave c vraiment sympa.., amiga rulez :) .. C aussi le tool de fairlight I'll parrait

Offline u2Popsy

  • Base
    • View Profile
    • u2 Blog
  • Ancienneté: 1996
  • Groupe: PoPsY TeAm
  • Rôle: coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #7 on: 21 December 2012 à 08:24:30 »
Pour faire quelque chose de générique tu va avoir besoin de l'equivalent d'une RTTI en C/C++ afin de pouvoir binder n'importe quel anim à n'importe quel paramètre.
De plus une fois que tu as une sequence d'anims ( une collection de track avec n'importe quel Type & un nom ) tu peux faire un Blender qui peux mixer plusieurs track entre elle dans le temps en fonction d'un Alpha ( qui peut lui aussi avoir une track ).
C'est ce qu'il faut si tu veux par exemple faire des anims qui réagissent à des events. Mais bon je pense que tu ne veux faire qu'une demo qui réagit tout le temps de la même facon dans le temps.

Patapom : pour intégrer du noise ( ou autre ) ; il faut coder une class genre ;
Code: [Select]
class AnimSequence{
..

  virtual Data GetAnim( float time );
}
qui s'intègre dans ton système de sequence d'anim.

AnimSeuence peut etre une spline de float, float2D ou est une fonciton genre exp(t) ou noise(t).

Enfin c'est une solution parmi tant d'autre mais c'est ce que j'utilise pour tout maintenant ( voir anim de l'UI de BlackInk par exemple ).

Elrick bonne chance pour la suite ;)
« Last Edit: 21 December 2012 à 09:11:52 by u2Popsy »

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Re : Comment gérer simplement et efficacement ses animations ?
« Reply #8 on: 21 December 2012 à 09:09:41 »
J'ai envie de dire : démerde-toi ! ;D

pouffiasse ! :)

Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #9 on: 21 December 2012 à 15:09:51 »
pouffiasse ! :)
Toi même, vieille poutre !
.  Pom  .

Offline Elrick

  • Base
    • View Profile
  • Groupe: SFX
  • Rôle: Code / GFX
  • Ville: Lyon
Re : Re : Comment gérer simplement et efficacement ses animations ?
« Reply #10 on: 21 December 2012 à 16:29:26 »
Pour faire quelque chose de générique tu va avoir besoin de l'equivalent d'une RTTI en C/C++ afin de pouvoir binder n'importe quel anim à n'importe quel paramètre.

Je me souvient qu'on avait déjà parlé un peu à la dernière VIP ou celle d'avant, mais du coup vu que je vais me remettre dessus, j'ai regardé ce qu'on peut faire avec C++ et j'ai l'impression qu'à part vérifier le type d'une variable (objet) c'est assez limité.

par exemple en java avec la reflexion je peux parcourir les membres d'une classe (privé ou non) et agir dessus.
refaire ça en c++, après avoir regardé ca rapidement, je vous pas comment procéder, t'as un exemple ?

sauf a définir un jeu d'interfaces et utiliser le dynamic_cast pour vérifier que le ptr est "castable" et après utiliser la méthode setPos() (par exemple)
mais du coup ya pas de méthode magique, il faut implémenter "setPos" dans toutes les classes animables. vrai ?
« Last Edit: 21 December 2012 à 16:32:36 by Elrick »

Offline u2Popsy

  • Base
    • View Profile
    • u2 Blog
  • Ancienneté: 1996
  • Groupe: PoPsY TeAm
  • Rôle: coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #11 on: 21 December 2012 à 16:39:58 »
Elrick : haha heuuu avec la RTTI tu dois pouvoir faire cela.
De mon coté je ne l'utilise pas, j'ai fait mon propre système de reflection.
L'inconvénient est qu'il faut les déclarer à la main.
Tiens je te paste une classe sur laquelle je suis en train de travailler :

dans le .H :
Code: [Select]
class uTreeViewItemData : public cMObject {

//---------------- Types
public:

DECLARE_META1( uTreeViewItemData, cMObject, 1, 0 )


//---------------- Datas
protected:

cMObjectRef m_Obj ;
uItemsCollectionRef m_Items ;

mbool m_Expanded ; // est-ce que l'element est expanded ?

}

dans le .CPP :
Code: [Select]
START_INI_META( uTreeViewItemData )

g->AddField( 0,"Obj",t->m_Obj );
g->AddField( 1,"Items",t->m_Items );
g->AddField( 2,"Expanded",t->m_Expanded );

END_INI_META()

Mais je te rassure je me suis fait un Tool sous Visual qui parse automatiquement le .H pour créer les déclarations dans le CPP.

La mauvaise nouvelle pour toi c'est que ca prend pas mal de temps avant d'avoir qq chose de productif ( entre le debug, tool a se faire, etc.. ).

Je te conseil si tu veux aller vite soit d'avoir un language qui le fait pour toi ( genre java ).. soit ( si c'est pour une 64Ko ) de te faire des macros assez simple pour récupérer l'offset d'un membre de classe que tu fou ensuite dans une tableau avec un nom et un type

Cette macro te permet de récupérer l'adresse relative d'un memebre de classe par exemple
Code: [Select]
#define OFFSET_POS( CLASS, MEMBER ) (size_t)&(((CLASS*)0)->MEMBER)
Good luck ;)


Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #12 on: 21 December 2012 à 16:44:42 »
Avant de faire de la RTTI et te trimballer des milliards de trucs lourds (et qui bouffent de la place à la compilation parce que si tu vises une intro 64K je te conseille quand même de disable la RTTI et les exception), tu devrais d'abord partir de tes besoins :

Est-ce que tu ne peux pas par exemple envisager une structure (peut-être héritée d'une structure mère) qui contiendrait une liste de champs animables, puis déclarer un descripteur de cette structure qui indique le nom, l'offset et le type de chaque champ ?

Alors okay, ça te fait remplir les descripteurs à la main, si tu rajoutes un champ dans la structure faut penser à le rajouter dans le descripteur mais pose-toi la question de savoir si ça va t'arriver si souvent que ça ?

Au final, qu'est-ce que tu vas vouloir animer : une position, une position+rotation, une position+rotation+scale, etc. (limite je vois pas trop d'autres types de trucs à animer en fait).
Ca te fait donc 3 structures avec 3 descripteurs ultra simples. Limite 1 seule (la plus complexe, PRS) si tu t'en fous d'optimiser la place.

Mais bien sûr si ton but est également d'apprendre à utiliser les RTTI pendant que tu codes ta démo alors fais-toi plaisir. Je te préviens juste que tu vas avoir une usine à gaz pour pas grand-chose au final... (je parle dans le cadre d'une démo, je sais bien que U2 ton truc c'est bien plus complexe et donc qu'il est nécessaire d'automatiser le processus au risque de devenir dingue).

Mais bon, si tu choisis de faire ce modèle d'une petite structure simple, ensuite tu peux l’agréger comme champ dans tes classes et l'utiliser très simplement, surtout si tu te fais un set de fonctions helpers dans la structure parente pour te simplifier la vie (je pense par exemple à un truc qui te retourne la matrice de transform à partir de l'état actuel de ta structure, ce genre de choses).

Tu noteras que je suis toujours mon moto : aller au plus simple, taper le moins de code possible, donc commencer par écrire les besoins.
.  Pom  .

Offline u2Popsy

  • Base
    • View Profile
    • u2 Blog
  • Ancienneté: 1996
  • Groupe: PoPsY TeAm
  • Rôle: coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #13 on: 21 December 2012 à 17:06:37 »
Elrick : ecoute patapom c'est la voie de la raison raisonnable ;)

Pour Pata exemple de truc a animer  : le nombre de particules a afficher a l'écran peut être animé, la puissance du vent qui y s'applique, le fait de faire un fade entre 2 scene, le paramètre de Fresnel de ta reflection, Bref tout les paramètres de tes shaders + de tes systèmes physiques + de tes scenes en générale  ;D


Offline Patapom

  • Base
    • View Profile
    • www.patapom.com
  • Ancienneté: 1988
  • Groupe: Bomb!
  • Rôle: Coder
  • Ville: Lyon
Re : Comment gérer simplement et efficacement ses animations ?
« Reply #14 on: 21 December 2012 à 18:21:56 »
Pour Pata exemple de truc a animer  : le nombre de particules a afficher a l'écran peut être animé, la puissance du vent qui y s'applique, le fait de faire un fade entre 2 scene, le paramètre de Fresnel de ta reflection, Bref tout les paramètres de tes shaders + de tes systèmes physiques + de tes scenes en générale  ;D

Oui effectivement, j'avais oublié ces "détails" (je me focalisais toujours sur l'anim de persos)...
Bon du coup ça te fait ce qu'on pourrait appeler des "structures de contrôle", effectivement tu peux commencer à en avoir pas mal, au mieux 1 par effet, au pire 1 par objet... Faut voir le nombre de paramètres animables et en déduire la méthode à utiliser... A priori dans tous les cas tu passes quand même par des descripteurs de champs à un moment où un autre, tu peux déjà commencer par là.
.  Pom  .