1

#curiosités#

C'est dur de programmer un personnage 3d qui danse? Je voudrais synchroniser les mouvements des bras/jambes avec les beats d'une chanson (connue à l'avance donc la beat detection peut etre faite à l'avance).

Je crois savoir que dans les modeles 3d on peut définir une animation et la carte graphique/librairie s'en charge. Dans ce cas comment se fait la transition? Le personnage passe d'une animation à une autre sans interpolation je crois? (d'après ce que j'ai cru voir dans les jeux) Ou ca dépend de comment on programme?

[ Admins: pouvez-vous corriger le titre svp? ]

2

Ya plusieurs moyen pour faire des animations. D'apres ce que j'ai lu:
Dans Quake 1 (et peut etre Quake 2) les animations étaient précalculées => meme quand le jeu tournait à 100fps, les animations n'étaient pas fluide.
Pour Quake 3, les animations sont interpolées, mais parfois les membres se croisent.

Dans les jeu modernes, c'est beaucoup plus compliqués. Déja, quand un personne meurt, il s'écroule sans suivre une animation prédéfinie, mais en suivant des lois physique http://en.wikipedia.org/wiki/Ragdoll_physics.

Pour passer d'une animation a une autre, c'est ce genre de truc qui est appliqué. Pour GTA4, il y a l'euphoria engine: http://www.youtube.com/watch?v=0n9KkKbGR_Y

3

Documente toi sur ce qu'on appelle"mesh skinning" et tu devrais trouver ton bonheur.
Globalement, la technique (quasi ancestrale cheeky ) consiste à utiliser un squelette constitué d'os pour animer ton modèle. A priori la partie la plus compliquée est celle qui concerne la transformation des coordonnées (soit sur le CPU soit sur la carte graphique), mais pour le reste tu ne devrais avoir aucun mal à définir tes animations et à interpoler entre elles.
Après, sache juste qu'il n'y a rien de magique dans la programmation graphique et que tu dois à peu près tout faire toi même, ou bien utiliser une librairie déjà écrite qui le fera à ta place. (OpenGL et Direct3D ne servant que d'interface entre ton programme et la carte graphique, à le niveau dépendant de l'API choisi) Enfin bref, c'est toi qui décide de ce que tu fais et comment tu le fais, la technique des os étant certainement la plus naturelle mais pas nécéssairement la plus simple ni la plus adaptée selon ce que tu veux faire.
Le papier de nvidia sur le mesh skinning à l'air pas mal même si je ne l'ai lu qu'en diagonale: http://developer.nvidia.com/object/skinning.html
Tu peux le lire si ça t'intéresse, tout en sachant que c'est par moment assez bas niveau, mais bon, un petit coup de google et tu auras d'autres infos tongue
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

4

Ok merci pour vos réponses.
Le mesh skinning, j'en aurai besoin mais j'ai l'impression que ça vient après. J'aimerais déjà arriver à faire danser un squelette (avec des lignes). Je vais essayer de faire un ragdoll avec un squelette, si j'y arrive j'aurai déjà une belle démo.

5

juste une petite remarque sur ./2: ca m'etonne que dans Q1 et Q2 les animations l'aient pas ete fluides Oo parceque normalement c'est des animations avec keyframes (des snapshots de la mesh du perso dans les differentes poses de l'anim), qui sont interpolees lineairement en fonction du temps.
et c'est pareil pour Q3, a la difference qu'ils ont une solution mixe qui utilise quelquechose comme deux ou trois bones, pour skinner en rigide differentes parties du corps animees en keyframes (il y a le haut du corps, les jambes, et la tete qui des mesh separees relies par des bones, pour pouvoir plus facilement melanger les anims (et il y a un bone supplementaire au bout de la main pour attacher l'arme), mais les mesh en elles memes ne sont pas skinnees).

sinon, rien de plus a dire que ce qui a deja ete dit. depuis au moins 10 ans, quasiment tout le monde utilise l'option squelette de bones + skinning rigide ou soft avec rarement plus de 4 poids par vertex.
apres t'as differentes methodes plus ou moins evoluees cote skinning pour eviter les deformations classiques de la mesh, comme le dual-quaternion skinning.

et pour ton truc sur caler une anim sur des beats, ma foi.. tu peux avoir une liste de timestamps cales sur ton anim qui te disent quand ca correspond a un 'beat', et ajuster la vitesse de lecture en fonction de quand est cense tomber le prochain beat de l'anim, et quand tu prevois que le prochain beat de la musique tombera.

et si l'anim est pas connue a l'avance, bah, a part retourner le probleme et predire, en fonction d'un historique de "beats" detectes dans l'anim, quand t'espere que le prochain va peut-etre, eventuellement, tomber, je vois pas trop.

(pour la detection en elle meme, les criteres dependront completement de l'anim, ca peut etre certaines zones du squelette qui sont tagguees (comme les mains, les pieds, et les chaines de bones qui forment les bras et les jambes, ou bien les bones du cou si t'as une anim de headbanging), et apres tu peux eventuellement calculer la derivee de la vitesse angulaire de ton bone (dans le cas du headbanging), et considerer qu'il y a eu un 'beat' lorsqu'elle change de signe par rapport a la valeur precedente (genre... if (currentAngularAccel.Dot(prevAngularAccel) < treshold) alors y a eu un beat), ou bien aussi pourquoi pas dans le cas des chaines de bones des bras et des jambes utiliser le dot de chaque bones de la chaine de bones et considerer que lorsqu'ils sont proches de 1, c'est un beat (ca se traduirait par la chaine de bones quasiment alignee, genre le bonhomme tend le bras vers le ciel en rythme... bref))
avatarHURRRR !

6

ah merde il a 5 mois le topic... gol


(ah et aussi, tant qu'a faire, c'est interessant de remarquer que les animations par keyframes de mesh entieres reviennent a la mode dans le temps reel, sous forme de morph targets, pour par exemple les anims faciales, ou les corrections de skinning (comme dans la zone des hanches, typiquement tres chiante a bien faire deformer avec que du skinning classique, du coup en bindant des morph targets dont le poids depend, par exemple, de l'angle entre le bone du femur et de la hanche, tu peux utiliser une version deformee de la mesh lorsque la jambe se plie trop)
(et en pratique, c'est souvent des sparse morphs qui sont utilises, cad pas un snapshot a l'arrache de toute ta mesh, mais juste les vertex qui changent, et sous forme de deltas/offsets (plus facile a compresser que les coordonnees pures), parceque bon, quand t'as une mesh a 30 000 vertices, et que t'en as que 200 qui changent pour un sourire, c'est quand meme con de stocker tous les autres, surtout lorsque, sous forme de delta, ils sont == {0,0,0}))
avatarHURRRR !

7

Il y a environ 50% des termes que vous utilisez que je ne comprends pas. J'y connais absolument rien a la 3d. Le but est d'arriver a faire danser un squellette, y aura tjrs moyen de trouver qqun pour transformer ca en vrai personnage 3d.

Je pense prendre l'option de Ragdoll physics. J'ai acheté ce bouquin pour ce faire.

Ca me parait quand meme difficile de faire en sorte que:
1 - le bonhomme subisse les lois de la physique (gravité en l'occurence)
2 - le bonhomme soit controlé par l'utilisateur et qu'il arrive a rester en equilibre (ca revient a faire un robot capable de rester en equilibre je suppose sorry )
3 - ajouter la contrainte que ses gestes soient le plus synchro possible avec la musique.

Si j'en arrive a faire ca, ca serait une belle prouesse technologique.

8

ah. merde.. c'est quoi les "termes"? (pas 50% du texte quand meme? trifus)

mais heu sinon, t'es au courant que les ragdolls, c'est bien, mais juste pour l'animation d'un perso "inerte", qui subit des forces externes sans reagir? (genre un type mort qui s'effondre sur lui meme, avec les membres qui se comportent correctement suivant des contraites d'articulation, et leurs collisions entre eux, ou bien un perso qui a un bras inerte qui se balance suivant ses mouvements comme un vieux chiffon qui pend)
si tu veux animer ton perso, les ragdolls, j'ai du mal a voir a quoi ca va te servir, en fait.

concretement tu veux pouvoir faire quoi avec ton squelette et sa simulation? que l'utilisateur lui donne des impulsions (genre tape dans l'epaule) pendant qu'il danse et qu'il se retablisse/reagisse tout seul? ou juste que l'utilisateur dise a ton application de facon abstraite quels mouvements de danse il doit faire, avec par dessus une synchro sur la musique?
avatarHURRRR !

9

Bah genre "mesh" je sais meme pas ce que c'est sorry Ni morph targets etc.

En effet les ragdoll c'est peut etre une mauvaise idée, je connais pas leur utilisation habituelle.

Je souhaite que l'utilisateur puisse activer des mouvements "locaux" genre un bouton pour un geste de bras particulier, un autre pour un autre geste de bras, un bouton pour un geste du pied. Avec "geste" =~ un mouvement qui est synchronisé sur la musique, genre un mouvement de bras simple ca pourrait etre le mec qui fait mouvement genre "salut" en oscillant sa main synchro avec la musique. L'idée est de permettre a l'utilisateur de pouvoir faire combiner plusieurs de ces gestes sur le personnage, de maniere a lui permettre de creer une choregraphie (on peut penser par exemple le bras qu'on active avec le geste "salut" et les pieds qui font des va-et-vient (c'est ridicule mais bon ca illustre bien grin ) ) Il faut bien sur permettre toute une panoplie de gestes predefinies.

10

Mesh c'est ton objet 3d (ou tout au moins une partie). Morph target c'est de la techno trop récente pour moi je sais pas ce que c'est (j'ai une petite idée avec ce qu'à dit momotte mais... ^^)
Et si tu veux faire des animations normales (i.e. rien de spécialement aléatoire comme le permet le ragdoll physics), le skinning de base fonctionnera très bien. Tout ce que tu veux c'est pouvoir animer différentes parties de manière indépendante, et c'est entièrement possible. Après, si tu as définis tes animations toi même tu connais la durée donc tu peux savoir quand précisément la partie animer va "taper" sur un truc, donc pour suivre la musique c'est tout bon (en supposant que tu connaisses à l'avance ce qui va sortir des HP), par contre tu dois garder en tête que malgré ça, ça ne te permettra pas de prévoir les mouvements induits aléatoirement par l'utilisateur.
En gros si tu veux des animations fluides (pas brusques) pour les actions utilisateurs, il y a nécéssairement un lag entre l'appui du bouton "'cule un mouton" et le moment où l'action se produit à l'écran. Sinon si faut que ça soit vraiment instantané, il faut que tu étudies bien toute la mise en scène pour que ça passe le plus inaperçu possible (dans ce genre: le mec tape des mains instantanément mais ça se voit pas trop car il est pas au premier plan et les mains étaient déjà super proches au départ), mais dans la plupart des cas il vaut quand même mieux tenter de caser une animation très rapide.
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

11

ah. ok.
bon pour mesh, cf ce qu'a dit GoldenCristal... mesh == maillage.
les morph targets, c'est aussi appele "blend-shapes", et c'est une serie de differentes versions de la meme mesh, que tu blende (enfin, interpole trioui) entre elles suivant diverses sources exterieures.

par exemple pour un visage, si tu veux faire du lipsync a partir d'une liste de phonemes et de timestamps, il te faut des versions du visage dans differentes poses distinctes, genre une version qui fait "o" une autre "i", une autre "mmmmh", etc... (+ une qui sourit, qui fait la gueule, qui est triste, bref...)
ca c'est les morph targets (== les destinations de morphing, les "poses finales" quoi).

bref

pour ton probleme, en fait c'est un peu comme un DJ qui mixe des pistes audio, sauf que c'est des anims de morceaux de corps d'un gars?

tu peux tres simplement faire ca en melangeant les animations en utilisant des masques, cad en marquant tes bones comme etant "actifs" dans l'animation (ou mieux: en leur donnant un poids d'influence, quand c'est 0 c'est inactif, quand c'est 1 c'est actif, etc...) par exemple l'anim de ton gars qui fait "salut", tu peux mettre un poids a 1 au bras qui fait salut, et un poids nul pour tout le reste.
apres au moment de blender, t'utilise les poids pour savoir quel pourcentage de anim tu prends en compte pour l'animation finale.

et pour la synchro, tu peux caler au debut toutes tes anims sur le beat de ta musique, et toutes les faire evoluer en arriere plan, meme si elles sont pas utilisees, ce qui fait que quand l'utilisateur les activera, il n'y aura pas de probleme de calage. (si il active l'anim "taper dans les mains" entre deux beats, bah c'est pas grave, l'anim sera au bon endroit entre deux claquements de mains, mais c'est le comportement auquel on s'attend, a priori)
avatarHURRRR !

12

avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

13

?

14

Non ça n'aide pas, mais c'était pas ça que tu cherchais à faire ?
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !

15

Bah des personnages qui dansent y en a un paquet. Ce que je veux pas c'est justement des animations predefinies mais que les mouvements puissent etre declenchés/arretés pendant l'execution.

La main qui fait des va-et-vient entre l'epaule et le pied, l'utilisateur appuie sur une touche qui fait lever la jambe du personnage et le va-et-vient s'adapte, la main fait des va-et-vient entre la position du pied et de l'epaule. C'est un exemple, je m'en fous de faire ca, ni meme ce genre d'action mais en tout cas je veux pas un ensemble de framekey qui definissent un personnage qui danse, mais bien le programmer.

16

Ce que sbibi essayait de te dire c'est qu'il te faut de toute façon des frames 'clé' et ensuite tu interpoles entre elles. Pour des modèles 3D ça semble déjà pouvoir donner des résultats bien plus satisfaisants qu'en 2D si tu as un squelette. Par exemple tu sais que pour tel type de beat tu vas lui faire lever une jambe (ne relisez pas cette phrase), donc tu interpoles par rapport à l'emplacement précédent.
Sinon j'imagine que tu peux animer tes bras & jambes via des formules physiques faisant intervenir une certaine élasticité pour que ça reste cohérent, mais bonne chance ^^ Quand je vois la peine que j'ai à trouver des infos basiques en 3D, je pense que tu es parti sur un chemin bien complexe grin
avatarHighway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

17

Brunni (./16) :
Quand je vois la peine que j'ai à trouver des infos basiques en 3D, je pense que tu es parti sur un chemin bien complexe grin
http://www.gamedev.net/reference/ ?
De toutes façons y'a jamais rien de bien compliqué, tout tourne la plupart du temps autour de maths basiques…

Pour le reste inutile de tout répéter, et tant pis si ce qui a été dit ne plait pas à onur tongue
avatarLe scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

18

Si si, c'est juste le lien de Folco que j'essayais d'expliquer pourquoi ca ne m'allait pas.

Je sais que ce truc la est trop compliqué, je l'ai mis de coté. Ca reste un beau challenge cela dit.

19