Manière courante d'animer le «mouvement» pour les animations de cycle de marche

13

Je viens de poster ceci sur les forums d'artistes de Blender avant de réaliser que j'obtiendrais probablement une meilleure réponse d'un public plus spécifique au développement de jeux, donc excuses pour la publication croisée! C'est pour les bonnes raisons :)

Je suis un programmeur essayant d'animer un personnage marchant pour un projet de jeu, en utilisant Ogre. J'ai fait un cycle de marche très simple dans Blender et je l'ai exporté vers Ogre, et ça fonctionne très bien. Enfin, je veux dire que cela fonctionne, mais il y a un terrible glissement du pied. C'est parce que je viens d'animer la marche sur place (à l'origine) dans Blender, et bien sûr je ne sais pas à quelle "vitesse de marche" cela correspond, donc quand je déplace le personnage dans le jeu le mouvement ne marche pas ' t nécessairement correspondre avec le mouvement des pieds dans l'animation.

Donc ma question est: quelle est l'approche normale pour ce genre de chose? Au travail, nous utilisons Maya, et les animateurs animent un nœud spécial 'moveTrans' qui représente la "position" du personnage (ou demandent à l'exportateur de le générer pour eux à partir du mouvement du nœud racine), alors le jeu peut lire ceci pour savoir à quelle vitesse l'animation déplace le personnage. Ainsi, dans le fichier Maya, le personnage avancera pendant un cycle et ce nœud supplémentaire les suivra par ses pieds. Je n'ai rien vu de tel dans un pays open-source, et il n'y a certainement aucune disposition pour cela dans le script Ogre Exporter. Que faites-vous normalement les gars pour cela?

Ben Hymers
la source
1
Voici une discussion avec quelques explications fantastiques du concept: blog.wolfire.com/2011/08/…
Ben Hymers

Réponses:

10

Il y a deux façons de le faire: le mouvement racine ou "dans le code".

Avec le mouvement racine, vous avez essentiellement exactement ce que vous proposez avec le nœud "moveTrans". Vous utilisez le mouvement de cet objet pour déterminer la vitesse de lecture des cycles de marche. Vous pourriez être en mesure de faire une recherche inversée de toutes sortes pour comprendre que si vous voulez être à la position X, quelle image vous devez être. Mais le véritable avantage du mouvement racine est que pour obtenir des animations vraiment réalistes, vous devez tenir compte du fait que le mouvement n'est pas un véritable chemin linéaire. Les vraies personnes se déplacent à une vitesse variable dans le temps, ou peut-être qu'elles changent un peu de gauche et de droite, ou autre chose.

Mixamo a fait un bon exemple avec le contrôle de mouvement racine en utilisant Unity. Il y a une vidéo de celui-ci ici: http://vimeo.com/12052874

Maintenant, le mouvement racine a ses inconvénients. Cela peut devenir délicat avec des choses comme essayer de faire fonctionner l'animation "marche" dans les escaliers (idéalement, vous auriez un animateur d'escalade / échelle séparé et feriez tout le mouvement pour cela dans l'animation également). Je ne suis pas non plus vraiment sûr de savoir comment IK y joue vraiment, voire pas du tout.

Maintenant, le faire "dans le code" est beaucoup plus facile du côté de la programmation. Ce que je suggère de faire, c'est d'abord de s'assurer que toutes vos unités sont cohérentes. Par exemple, 1 unité en Maya et votre jeu fait 1 mètre. Ensuite, vous demandez à vos artistes d'animer un personnage qui marche (avec un mouvement vers l'avant). Utilisez-le pour déterminer la vitesse de l'animation et exporter l'animation sans la vitesse vers l'avant. Utilisez-le pour déterminer la vitesse de lecture de l'animation. Donc, si l'animation de marche à une vitesse de 1x est de 5 m / s et que vous voulez que le joueur tourne à 7 m / s, vous jouez simplement à 7/5 = 1,4x de vitesse. Si votre modèle est agrandi ou réduit, multipliez le taux de lecture de l'animation par l'inverse de l'échelle. Un mec à mi-hauteur devra marcher deux fois plus vite pour se déplacer au même rythme qu'un gars à l'échelle 1x.

Tetrad
la source
Je n'avais pas vu le Root Motion Computer de Mixamo, je ne l'ai pas entendu appeler ça, alors merci pour le lien et l'explication! Donc, fondamentalement, c'est comme je le pensais, soit l'animer explicitement, soit le générer automatiquement, et soit au moment de la construction soit au moment de l'exécution. Je suppose que je vais devoir coder cela moi-même dans le script d'exportateur. Une chose dont je suis maintenant confus est le mouvement qui change au cours d'un cycle - comment diable pourriez-vous chasser cela du gameplay? "Déplacer à 5m / s" signifie maintenant autre chose ... Et les changements de direction seront un cauchemar pour l'IA! Peut-être est-il préférable d'utiliser le mouvement d'agerage?
Ben Hymers
Manqué de personnages; J'attendrai un peu avant de marquer cela comme accepté pour avoir plus d'opinions. Merci pour votre réponse!
Ben Hymers
Pour le mouvement racine, vous ne contrôlez pas directement la vitesse du lecteur. En réalité, vous ne contrôlez que la lecture du taux d'animation, puis vous laissez l'animation contrôler directement la valeur z vers l'avant. L'exemple de 5 m / s que j'ai donné était pour la manière traditionnelle de résoudre le glissement du pied, qui est d'essayer de faire correspondre le taux de lecture avec la vitesse à laquelle vous vous déplacez et en supposant une vitesse constante.
Tetrad
En tant que programmeur de gameplay, cela ressemble à un cauchemar complet :) Mettre les animateurs en contrôle de quelque chose d'aussi important que la vitesse de déplacement de tout ce qui est animé? Non merci! Je préfère de loin extraire les informations afin de pouvoir les inverser et définir la vitesse de lecture de l'animation en fonction de la vitesse de déplacement, plutôt que l'inverse. C'est pourquoi le mouvement non linéaire me rend fou, et c'est peut-être une bonne raison de le faire dans l'autre sens.
Ben Hymers
Gah, maudissez Stack Exchange pour avoir entré le commentaire sur la tentative de commencer une nouvelle ligne ... J'allais dire, même si vous laissez l'animation conduire le mouvement, ce sera toujours un problème pour, par exemple, les personnages de l'IA. Que se passe-t-il s'ils essaient d'arriver à un point mais que leur animation de mouvement oscille d'un côté à l'autre (disons, c'est une animation chancelante ivre)? Comment peuvent-ils savoir dans quelle direction faire face?
Ben Hymers