Amener à la vie un sujet statique

Voir les définitions relatives à Seamless3d à la fin de ce didacticiel

Ce didacticiel montre comment transformer un personnage statique importé, fabriqué avec n'importe quel éditeur de Vrml, en un personnage constitué de segments mobiles et dynamiquement animé.

Ce didacticiel a été rédigé spécialement pour accompagner la demo robot bring static model to life (amener à la vie un sujet statique)

Le fonctionnement de cette demo repose sur des fichiers disponibles ici. Ces fichiers devront être dézippés par vos soins et placés dans un répertoire que vous aurez créé à cette fin sur votre disque dur :

My Documents\Seamless3d\Application Data For Seamless3d\For Robot Demos Only

Note du traducteur : Si cela fonctionne ainsi sur votre ordinateur, tant mieux. Sinon, essayez donc de laisser votre ordinateur dézipper les fichiers où il croit devoir le faire et n'intervenez pas. Il y a des chances pour que, dès lors, tout fonctionne sans histoires.
Ah ... il va sans dire que vous avez téléchargé et dézippé la dernière mouture disponible de Seamless3d, c'est à dire la 2.117 ! C'est cette version qui comporte maintenant deux Noeuds Part (Partie). Il y a la Partie bleue en plus de la Partie blanche. Rappelons qu'une Partie blanche (classique) ne contient pas de données, c'est une pièce de squelette vide, la nouvelle Partie bleue au contraire est utilisée pour la construction et on y éditera soi-même les triangles. Importez 2.117, faute de quoi ... Fin de note.
Pour voir cette demo, déplacez le curseur de la souris vers l'angle haut à gauche de l'écran 3d et choisissez scene tree (arbre logique de la scène) puis bring static model to life demo (amener à la vie un sujet statique, démonstration) :

 

La demo montre toutes les actions successives nécessaires pour préparer le sujet statique à l'animation.

Note du traducteur : Le robot de démonstration est un programme extraordinaire. Ce n'est pas un film, il effectue réellement ce qu'il montre, au fur et à mesure que le curseur de la souris se déplace tout seul, clique, clique-et-tire les parties nécessaires et les ajoute là où il le faut, modifie les paramètres dans les tableaux... et enregistre finalement le résultat du travail accompli.
      Maintenant, dites-vous bien que vous pouvez regarder avec attention un pianiste aussi talentueux qu'amical jouer devant vous les douze études d'exécution transcendante de Franz Liszt, cela ne vous fera progresser en rien dans l'étude du piano...
      Lisez, relisez les tutoriels, exercez-vous, aussi maladroitement que ce soit, et vous apprendrez. Lisez et surtout relisez le présent didacticiel, ce n'est que lorsque vous saurez bien "quoi fait quoi", que l'observation attentive du robot démonstrateur vous aidera à remettre un ordre exact dans vos idées fraîchement acquises. Ce didacticiel est donc finalement là pour ça : méditez chacune des étapes, mémorisez ce que chacune entreprend et comment, puis regardez le robot accomplir avec adresse des gestes dont vous avez déjà compris le sens.
      Enfin et surtout, n'hésitez pas à revoir plusieurs fois la même étape : il suffit de cliquer Play (exécutez) à nouveau sans incrémenter l'opération. Voir, voir et revoir... c'est tout le secret. Fin de note.

Ce sont les mêmes Noeuds Interpolators, les ROUTEs et les scripts utilisés habituellement pour animer des modèles en Vrml faits de multiples Noeuds Transform ou Shape (forme) qui vous permettront aussi d'animer ce sujet quand il sera prêt à l'être (à la fin de la démonstration).

Le modèle statique utilisé ici a été fabriqué avec Seamless3d puis converti en un fichier qui ne comporte qu'une seule Shape (forme) Vrml, laquelle contient la géométrie et la texture et rien d'autre (aucun script). Si l'on ouvre ce modèle statique dans un navigateur Vrml, la géométrie sera conservée.

En fait ce modèle statique aurait pu être écrit avec n'importe quel modeleur 3d, toutefois celui qui a été établi avec Seamless3d l'a été tout spécialement pour en faire une animation de surface en réseau maillé, des triangles supplémentaires ont déjà été prévus pour établir les épaules, coudes, genoux et ainsi de suite, de façon à conserver la qualité des articulations quand elles seront pliées.

Le gros avantage qu'il y a à utiliser des Noeuds Build (constructeurs) c'est qu'on évitera de dégrader accidentellement le modèle puisque le modèle d'origine pourra à tout instant être rechargé. Les Noeuds constructeurs apportent une grande liberté dans ce que l'on peut faire dans notre travail. Une fois qu'ils ont été ajustés, ils peuvent être réutilisés pour importer tel autre modèle statique qui ferait appel aux mêmes formes de base.

L'Idée de base


Les modèle statique est importé en tant que Part (partie) unique et seulement ensuite les sommets sont transférés dans les autres parties à l'aide d'un cylindre transparent qui sert à choisir les sommets à transférer. Quand tout est fait, les Pivot points (points de flexion) sont déplacés vers leur position correcte dans chaque partie de sorte que ces parties puissent être animées.

Commencer

Lancement du robot de démo :

bring static model to life (amener à la vie un sujet statique)

Note du traducteur : Thyme précise ci-dessous que tous ses titres, avec leur numéro de référence, sont en gras. Il est nécessaire de les laisser dans leur anglais d'origine pour qu'on puisse les reconnaître dans le programme qui se déroule automatiquement sous les yeux (ébahis) du (futur) programmeur. Comme d'habitude, une traduction en italiques est proposée à chaque fois.

Tous les titres des opérations du robot de démonstration sont en gras et commentcent par leur numéro suivi du titre lui-même. Les commentaires éventuels figurent en dessous des titres.

0. Create A New Seamless File
0. Créer un nouveau fichier Seamless


1. Import Empty Skeleton of Parts
1. Importer le squelette vide des parties.
On commence avec un squelette préfabriqué de parties vides.
Les noms de parties commençant par l- sont les parties left (gauches) et les noms de parties commençant pat r- sont les parties right (droites). C'est pour éviter d'avoir deux noms différents pour chaque partie qu'elles sont désignées par leur articulation, la partie du bras droit par exemple sera appelée r_shoulder (d_épaule) parce que c'est par cette articulation que le bras se rattache à sa partie ancêtre. De ce fait :

Part Includes La partie comprend
shoulder upper arm épaule bras
elbow forearm coude avant bras
wrist hand poignet main
hip thigh hanche cuisse
knee shin & calf genou jambe
ankle foot cheville pied

2. Replace ColorEffect with TextureEffect
2. Remplacer l'effet couleur par l'effet texture.


 

Comme le modèle statique utilise une texture, nous remplacerons d'abord le Noeud ColorEffect (effet couleur) par un Noeud TextureEffect (effet texture). Si on ne le fait pas avant d'importer le modèle dans un Noeud Partie, toutes les applications de textures seront perdues. Bien entendu on n'en fait rien si le modèle à importer n'a pas de textures ainsi par exemple quand la Shape (forme) utilise des "color per vertex" (couleurs par sommets) ou seulement le Noeud Material pour colorer sa geometry (géométrie).

3. Import Static Model Into a Part
3. Importer le sujet statique dans une Partie.

Une Partie bleue immédiate nommée model_source est créée pour héberger tous les triangles importés à partir du fichier static_model.wrl

Cette Partie devient la première source des sommets pour le modèle et elle ne devra pas être modifiée par aucun Noeud de construction de façon à rester constamment la réserve de tous les sommets d'origine.

Un "build cycle" (cycle de construction) sera le terme utilisé chaque fois qu'un build node (Noeud de construction) sera actif (c'est assez l'équivalent de l'exécution d'une macro). Un cycle de construction intervient automatiquement chaque fois que nous modifions un champ appartenant à un Noeud de construction. Au cours d'un cycle de construction chaque Noeud de construction active sa fonction "doBuild" (construire) en ordre séquentiel de haut en bas. Le fait de réduire les Noeuds dans l'arbre logique de scène n'a aucune influence sur les cycles de construction.

Le sujet statique a les bras étendus à l'horizontale ce qui permet de choisir plus aisément les sommets autour des épaules pour en faire les parties des bras mais si le modèle doit observer le standard H-Anim strict, les bras devraient rester le long du corps.

Note du traducteur : comme on peut le voir, le robot importe non seulement les triangles du fichier static_model.wrl mais aussi la texture du fichier static_model.png fin de note.
4. Copy All of the Triangles to the Pelvis
4. Copier les Triangles vers le bassin.

Du fait que nous utilisons des Noeuds TransferBCyl (transfert par cylindre) pour transférer l'appartenance des sommets depuis une Partie qui contient la source des sommets vers les autres Parties, et parce qu'il en résultera une modification (la perte de l'appartenance des sommets entraîne la perte des sommets) au lieu de transférer directement ces sommets à partir de la première source, nous allons donc les copier d'abord dans une autre Partie, le Pelvis (Bassin) et c'est seulement de là qu'aura lieu de transfert par le Noeud TransferBCyl. Cette copie se fait à l'aide d'un Noeud CopyPart (copier une Partie).

Regardez bien le robot demo qui tire les Noeuds Part (Parties) depuis le squelette vers le Noeud CopyPart (copier une Partie) en maintenant pressée la clé Alt de sorte que les parties sont tirées à titre de références. Notez aussi que le Noeud source est déposé dans la moitié supérieure (et à droite) de la vignette (icône) du CopyPart de façon à être déposé comme Noeud source et que la Partie destination est tirée vers la moitié inférieure de l'icône de façon à être tirée à titre de Partie destination. La Partie source est distinguée de la partie destination dans l'arbre logique de scène par le blue dot (point bleu) à gauche de l'icône de référence:

La partie model_source est réduite à partir de maintenant de sorte que les seuls triangles qui resteront visibles seront ceux qui sont contenus dans le modèle véritable.

5. Place the Avatar to the Floor
5. Placer l'Avatar sur le sol.

Il s'agit d'un sol installé à -1.75 mètre, ce qui convient à un avatar destiné à un monde multi-utilisateur de Blaxxun contact.

Si en revanche l'avatar devait être destiné à un standard H-Anim strict, le sol devrait être ajusté à zéro.

6. Zoom in View to l_shoulder
6. Zoomer la vue vers l'épaule gauche.

Montre comment centrer la vue sur la position du sommet choisi puis comment zoomer sur ce point.

7. Transfer from pelvis to 1st group for shoulder
7. Transférer depuis le bassin vers le 1er groupe pour l'épaule.

C'est ici que le premier Noeud TransferBCyl est ajouté. La tâche des Noeuds TransferBCyl consiste à choisir les sommets du Noeud Partie source (la partie supérieure de référence avec le point bleu) et à les transférer à la Partie dest(ination) (la partie inférieure de référence sans le point bleu).
La position des sommets ne change cependant pas, parce que tous les Noeuds Partie sont à ce stade centrés sur la même location (0 0 0) (position) de sorte que seule l'appartenance des sommets change du fait de ce transfert. Les sommets venus de la source, pelvis (le bassin) sont choisis au moyen d'un cylindre semi transparent.
Les proportions de ce cylindre sont ajustées avec les champs radius et height (rayon et hauteur) du Noeud TransferBCyl.
La position de ce cylindre est ajustée avec les champs location et orientation.
Le cylindre est bien visible dans la fenêtre 3d quand le Noeud TransferBCyl est choisi et lorsque le champ in est coché. Les indices des sommets choisis sont placés dans le champ indices. De ce fait la propriété length (étendue) du champ vertex montre combien de sommets ont été choisis (pour le transfert).

Si le robot décoche ensuite le champ in chaque fois qu'un Noeud TransferBCyl est ajouté, c'est seulement pour accélérer le cycle de construction. En effet, lorsque in est décoché le transfert n'a pas à accomplir la longue tâche de s'assurer que les sommets tiennent bien dans le cylindre, dès lors que grâce au champ vertex la liste des sommets à transférer est connue.

Lorsqu'une Partie comme l'épaule plie pendant une animation, il est possible d'accroître la qualité de l'articulation en faisant en sorte que les différents groupes de sommets tournent d'une fraction seulement du champ total rotation de cette Partie.
On peut voir dans la figure suivante à quoi ressembleraient l'épaule et le coude si tous les sommets de ces Parties tournaient ensemble du montant total du champ rotation :



Au contraire nous voyons ici comment l'épaule et le coude deviennent réalistes lorsque le premier et le second rang de sommets tournent respectivement de 1/3 et de 2/3 du montant total du champ rotation.



Ce regroupement des sommets en 3 différents groupes s'opère en faisant appel à 3 Noeuds TransferBCyl, chacun des cylindres des Noeuds TransferBCyl étant ajustés pour choisir chaque groupe issu de l'épaule (ici gauche).
Le champ group est ajusté à 0 pour que le champ coordGroup de la partie de destination soit ajustée au nombre de sommets correspondant au premier groupe (élément d'indice 0 du coordGroup).
Le Noeud TransferBCyl se charge de trier les indices des coordonnées, mais du fait que les groupes sont définis par l'étendue de leurs indices (de coord 0 à coord 9 pour le premier groupe, de coord 10 à coord 19 pour le second groupe) il est nécessaire que nous traitions le premier groupe de l'épaule en premier, puis ensuite le groupe suivant de la série dans le cycle de construction. Autrement, les groupes ne seraient pas triés dans l'ordre voulu pendant l'animation.

Après que les champs du TransferBCyl sont ajustés, le champ weight de l'épaule (gauche) est fixé à .333 (weight de l'élément d'indice 0) pour indiquer que le premier groupe doit tourner de 1/3 de la rotation totale (1 = rotation totale) pendant l'animation.

Note : le champ group du Noeud TransferBCyl peut être laissé à sa valeur par défaut de -1 (il ne changera donc pas les coordGroup des Parties avec cette valeur par défaut). Si on contraire on spécifie manuellement dans les champs coordGroup des Parties le nombre des sommets que l'on veut dans le groupe, nous aurions toutes les chances d'ajouter une bogue. En revanche si on laisse le Noeud TransferBCyl écrire lui-même le nombre de sommets qu'il a choisis dans le cylindre tout ira bien.

Notez aussi qu'au lieu d'ajouter un nouveau Noeud TransferBCyl pris dans la barre des Noeufs nouveaux, on recopie le précédent en maintenant la clé Contrôle (Ctrl) cependant qu'on clique-tire le Noeud TransferBCyl précédent vers le Noeud GroupBuild. Cela présente l'avantage de commencer avec un nouveau Noeud dont tous les champs sont ajustés aux valeurs du Noeud précédent.

9. Transfer Vertices from pelvis to rest of shoulder
Parce que celui-ci est le troisième et dernier groupe de l_shoulder (l'épaule gauche) il n'est pas utile d'ajuster le champ group à 2 ni le champ weight de cette partie à 1, parce qu'on peut laisser ce dernier groupe tourner de la valeur totale par défaut.


10. Transfer from pelvis to 1st group for l_elbow
10. Transfert du bassin vers le 1er groupe de l'épaule gauche.
11. Transfer from pelvis to 2nd group for l_elbow
11. Transfert du bassin vers le 2em groupe de l'épaule gauche.
12. Transfer Vertices from pelvis to rest of l_elbow
12. Transfert des sommets du bassin vers le reste de l'épaule gauche.
13. Transfer from pelvis to 1st group for l_wrist
13. Transfert du bassin vers le 1er groupe du poignet gauche.
14. Transfer Vertices from pelvis to rest of l_wrist
14. Transfert des sommets du bassin vers le reste du poignet gauche.
15. Transfer Vertices for the Right Arm
15. Transfert des sommets pour le bras droit.

Note du traducteur : lors de cette étape 15, très longue, le robot démo va se lancer dans une série d'opérations qu'il faut observer très attentivement. Cette étape 15 est une épreuve pour le débutant, qui aura intérêt à la répéter plusieurs fois avant d'être en état de la suivre avec bonheur. Fin de note.
Comme le sujet est symétrique, les Noeuds TransferBCyl du bras droit sont exactement les mêmes que les Noeuds TransferBCyl gauches, sauf pour les location et orientation des cylindres. Comme ces champs sont ajustés pour reproduire le côté gauche en miroir, tout ce qu'il y a à faire consiste à ajouter un signe moins aux composantes x des champs location et de tourner d'un demi tour les champs orientation. On tient enfoncée la clé Contrôle cependant qu'on clique les boutons des champs orientation, de sorte que les valeurs des orientation tournent à angles droits bien propres.

16. Transfer pelvis to 1st group for l_hip
16. Transfert du bassin vers le 1er groupe de la hanche gauche.
17. Transfer from pelvis to 2nd group for l_hip
17. Transfert du bassin vers le 2em groupe de la hanche gauche.
18. Transfer Vertices from pelvis to rest of l_hip
18. Transfert des sommets du bassin vers le reste de la hanche gauche.
19. Transfer from pelvis to 1st group for l_knee
19. Transfert du bassin vers le 1er groupe du genou gauche.
20. Transfer from pelvis to 2nd group for l_knee
20. Transfert du bassin vers le 2em groupe du genou gauche.
21. Transfer Vertices from pelvis to rest of l_knee
21. Transfert des sommets du bassin vers le reste du genou gauche.
22. Transfer from pelvis to 1st group for l_ankle
22. Transfert du bassin vers le 1er groupe de la cheville gauche.
23. Transfer Vertices from pelvis to rest of l_ankle
23. Transfert des sommets du bassin vers le reste de la cheville gauche.
24. Transfer Vertices for the Right Leg
24. Transfert des sommets pour la jambe droite.

>25. Transfer pelvis to tummy0
26. Transfert du bassin vers le ventre0.

Parce que les Parties ventre0, ventre1, thorax, cou0, cou1 et tête sont des parties de l'épine dorsale et plient plutôt à la façon des articulations d'un serpent (chaque segment ne tournant que dans une une faible mesure), ces Parties ne seront pas divisées en groupes plus petits, comme on l'a fait pour les parties des membres.

26. Transfer pelvis to tummy1
26. Transfert du bassin vers le ventre1.
27. Transfer pelvis to thorax
27. Transfert du bassin vers le thorax.
28. Transfer pelvis to neck0
28. Transfert du bassin vers le cou0.
29. Transfer pelvis to neck1
29. Transfert du bassin vers le cou1.
30. Transfer pelvis to head
30. Transfert du bassin vers la tête.

Maintenant que le dernier lot de sommets a été transféré vers la tête, il ne reste plus dans le bassin que les triangles qui lui appartiennent en propre et ils y restent.

31. Move the Pivot Points
31. Déplacer les Points de flexion.

C'est maintenant que les Parties sont centrées de telle sorte que, lorsqu'elles sont mises en rotation par leur champ rotation pendant l'animation, leur Point de flexion est en position correcte. Pour tous les Noeuds CenterJoint (centre d'articulation) sauf celui relatif au bassin, le champ numOf des Noeuds CenterJoint est utilisé pour moyenner le premier rang des sommets en vue de fixer la position du Point de flexion. Cela fonctionne bien parce que le premier rang des sommets des Parties est indicé de 0 au nombre total des sommets du premier rang moins 1. (de 0 à n-1).

Bien que Seamless3d construise ses modèles avec des sommets indicés de manière ordonnée relativement à leur position, il serait sans inconvénient à cette étape d'avoir un modèle statique dont les sommets seraient indicés de façon aléatoire parce que les Noeuds TransferBCyl trient les indices des sommets pour pouvoir les grouper. Lorsque le premier rang est choisi par le cylindre semi transparent du Noeud TransferBCyl, les coordonnées de ce rang peuvent être regroupées par l'étendue de leurs indices et pour des Parties comme le bassin, la tête et le thorax dont le premier rang ne peut être choisi individuellement par le cylindre, cela n'a pas d'importance non plus car le champ indexPosition du Noeud TransferBCyl a été coché pour toutes les parties ce qui entraîne le tri des sommets par ordre de hauteur en relation avec l'orientation du cylindre. (Si le cylindre est horizontal, les sommets sont triés en ordre horizontal).

Note : le fait de laisser indexPosition sans coche augmente significativement la vitesse du cycle de construction d'un TransferBCyl dans le cas où le champ in est coché. Cependant, comme la plupart des parties auront un champ in non coché à toute étape de la démo, cela ne fera que peu de différence, si même on en remarque une, de décocher le champ indexPosition des parties où ça n'est pas nécessaire. C'est pourquoi ce champ a été laissé coché partout dans cette démo.

Demo Completed
La démonstration est terminée.

Animating The Model
Animation du sujet.


Après modification des Points de flexion le sujet est prêt à être animé. Puisque l'animation de ce sujet sera la même que celle qui a été décrite dans build avatar demo (démo de construction d'un avatar),

 

Les mêmes opérations que celles qui commencent avec l'opération 26 Setup Animation (26 installer l'animation) vous montreront comment animer ce modèle-ci.

Making Modifications to the TransferBCyl Fields at a Later Date
Apporter des modifications ultérieures aux champs des TransferBCyl

Un des grands avantages qu'il y a à utiliser les build nodes (Noeuds constructeurs) tient à ce qu'on peut revenir en arrière pour modifier son travail. Bien entendu cette possibilité entraîne celle d'écrire des bogues qui amèneraient un cycle de construction à fonctionner de travers. Par exemple si un champ in d'un TransferBCyl est décoché et que le cylindre est changé pour choisir d'autres sommets et que d'autres Noeuds TransferBCyl viennent ensuite dans le cycle de construction avec leur champ in décoché, il est bien possible qu'ils ne soient plus liés aux bons sommets ce qui les amènerait à indicer des sommets inexistants au moment où viendrait leur tour d'entrer en fonction.
Ce problème pourrait cependant être évité si, avant de modifier les champs d'un Noeud TransferBCyl, on clique-droit sur le build node (Noeud constructeur) pour choisir :

Ceci coche automatiquement le champ in du Noeud en cause ainsi que celui de tous ceux qui le suivent, s'ils en ont un.

Un tel cycle de construction entier ralentira évidemment les choses (uniquement pour la correction en cours) mais les champs in peuvent tout aussi facilement être décochés en cliquant-droit dans le même Noeud constructeur et en chisissant fast build.
Si votre ordinateur est rapide, ou si vous aimez rester du côté sûr, vous pouvez décider de rester en permanence avec tous les champs in cochés, de sorte que l'indexation ajustera toujours tout dynamiquement quelques soient les changements apportés, n'importe où dans le cycle de construction. Si vous choisissez cette approche, il est bon de décocher le champ indexPosition des parties qui n'en ont pas besoin.



Definitions Specific to Seamless3d
(Définitions spécifiques à Seamless3d)


Vertex
Un vertex est un sommet d'un polygone. Un sommet contient toujours une composante de coord (coordonnées).
La composante coord (coordonnées) indique la position du sommet. Les valeurs des coord tiennent en 3 nombres x y et z qui représentent les 3 dimensions de l'espace 3d.
Un sommet peut comporter une composante de couleur. Les valeurs de la couleur tiennent en 3 nombres r g et b (rouge vert et bleu) qui représentent les proportions des trois couleurs de base.
Un sommet peut comporter une composante texCoord (coordonnée de texture). Les valeurs de TexCoord tiennent en deux nombres x et y qui désignent le point de la texture utilisé pour le sommet.

coord
La position d'un sommet.
Dans un Noeud Partie Seamless3d le champ coord contient de multiples valeurs de coordonnées.
Dans un IndexedFaceSet (ensemble de faces indicées) le champ coord est utilisé pour contenir un Noeud Coordinate. C'est le champ point de ce Noeud Coordinate qui utilise les multiples valeurs des coord de l'IndexedFaceSet.

coordIndex
L'indice d'une coordonnée. Toutes les coords (coordonnées) sont indicées. Les valeurs d'une coordIndex (indices des coordonnées) consistent en un seul nombre. Ceci permet de désigner chacune des coordonnées par un nombre unique, en quelque sorte son nom. Les indices d'une Part (Partie) commencent toujours par zéro.

coord value
Les valeurs des coordonnées tiennent en 3 nombres en virgule flottante représentant les 3 dimensions x y et z.

transform fields
Les champs transform d'un Noeud Part (Partie) sont les champs scale (échelle), rotation et translation

vertex index
Quand on fait référence à un sommet par son indice (le nombre qui est son nom), c'est l'indice de la composante coord (coordonnée) qui est utilisé.


Copyright © 2000-2006 Graham Perrett thyme@seamless3d.com
traduction de Matthieu