H-Anim est une norme standard internationale (n° ISO/IEC FCD 19774) pour la description de personnages 3D animés destinée à rendre les personnages virtuels compatibles avec les différents systèmes de modélisation, animation, capture de mouvements et visualisation.
La version actuelle de la spécification H-Anim est 200x.
La représentation d'un personnage 3D articulé est appelée personnage H-Anim, constituée:
On parlera également de niveau d'articulation (LOA) correspondant au nombre de joints de l'humanoid.
Même si la norme concerne principalement les personnages humains, il est possible d'enrichir la hiérarchie d'autres membres, têtes etc.
La géométrie d'un personnage H-Anim peut être décrite selon deux méthodes différentes:
Des conventions ont été mises en place pour assurer la compatibilité d'une animation avec n'importe quel personnage H-Anim ainsi que la cohérence de ces personnages. Les contraintes concernent la pose initiale d'un personnage avant animation:
![]() |
|
Dans cette position initiale, tous les angles des joints sont à 0 (champs rotation =(0 0 1 0), translation=(0 0 0), échelle=(1 1 1) ).
Un corps H-Anim est une hiérarchie d'objets joint, auxquels peuvent être associés des objets segment. Les paires joint-segment doivent suivre la convention de nommage établie dans le standard H-Anim. La hiérarchie complète des joints et leurs segments associés est donnée ci-dessous:
HumanoidRoot : sacrum sacroiliac : pelvis | l_hip : l_thigh | l_knee : l_calf | l_ankle : l_hindfoot | l_subtalar : l_midproximal | l_midtarsal : l_middistal | l_metatarsal : l_forefoot | r_hip : r_thigh | r_knee : r_calf | r_ankle : r_hindfoot | r_subtalar : r_midproximal | r_midtarsal : r_middistal | r_metatarsal : r_forefoot vl5 : l5 vl4 : l4 vl3 : l3 vl2 : l2 vl1 : l1 vt12 : t12 vt11 : t11 vt10 : t10 vt9 : t9 vt8 : t8 vt7 : t7 vt6 : t6 vt5 : t5 vt4 : t4 vt3 : t3 vt2 : t2 vt1 : t1 vc7 : c7 | vc6 : c6 | vc5 : c5 | vc4 : c4 | vc3 : c3 | vc2 : c2 | vc1 : c1 | skullbase : skull | l_eyelid_joint : l_eyelid | r_eyelid_joint : r_eyelid | l_eyeball_joint : l_eyeball | r_eyeball_joint : r_eyeball | l_eyebrow_joint : l_eyebrow | r_eyebrow_joint : r_eyebrow | temporomandibular : jaw l_sternoclavicular : l_clavicle | l_acromioclavicular : l_scapula | l_shoulder : l_upperarm | l_elbow : l_forearm | l_wrist : l_hand | l_thumb1 : l_thumb_metacarpal | l_thumb2 : l_thumb_proximal | l_thumb3 : l_thumb_distal | l_index0 : l_index_metacarpal | l_index1 : l_index_proximal | l_index2 : l_index_middle | l_index3 : l_index_distal | l_middle0 : l_middle_metacarpal | l_middle1 : l_middle_proximal | l_middle2 : l_middle_middle | l_middle3 : l_middle_distal | l_ring0 : l_ring_metacarpal | l_ring1 : l_ring_proximal | l_ring2 l_ring_middle | l_ring3 : l_ring_distal | l_pinky0 : l_pinky_metacarpal | l_pinky1 : l_pinky_proximal | l_pinky2 : l_pinky_middle | l_pinky3 : l_pinky_distal r_sternoclavicular : r_clavicle r_acromioclavicular : r_scapula r_shoulder : r_upperarm r_elbow : r_forearm r_wrist : r_hand r_thumb1 : r_thumb_metacarpal r_thumb2 : r_thumb_proximal r_thumb3 : r_thumb_distal r_index0 : r_index_metacarpal r_index1 : r_index_proximal r_index2 : r_index_middle r_index3 : r_index_distal r_middle0 : r_middle_metacarpal r_middle1 : r_middle_proximal r_middle2 : r_middle_middle r_middle3 : r_middle_distal r_ring0 : r_ring_metacarpal r_ring1 : r_ring_proximal r_ring2 : r_ring_middle r_ring3 : r_ring_distal r_pinky0 : r_pinky_metacarpal r_pinky1 : r_pinky_proximal r_pinky2 : r_pinky_middle r_pinky3 : r_pinky_distal
Les pré-requis pour ajouter de nouveaux joints et segments à la hiérarchie de base sont:
Ces points caractéristiques de surface sont généralement spécifiés dans les objets Displacers, leur CoordIndex est l'index du sommet du maillage le plus proche. Ils peuvent également être utilisés pour définir des Sites (cf exemples sur le site h-anim).
|
![]() |
|
Dans les hiérarchies, les cases vertes représentent les Joints, les bleues les Segments.
C'est le niveau minimal supporté pour un personnage h-anim. Seul le joint HumanoidRoot est requis (avec le Segment sacrum pour fils).
![]() |
![]() |
Ce niveau est généralement employé pour les personnages temps réels à basse polygonisation.
![]() |
![]() |
Ce niveau correspond à des personnages ayant une colonne simplifiée (3 lombaires, 3 thoraciques, 2 cervicales), des plantes de pied articulées (subtalar, midtarsal, metatarsal), et l'ensemble des phalanges pour chacun des doigts de la main.
Ce niveau supporte la hiérarchie h-anim complète comme présentée au paragraphe structure.
Cet objet contient la définition du personnage hanim au travers de ses différents champs.
Champ | Type | Description | Valeur par défaut |
bboxCenter | float[3] | bounding box du
personnage elle peut ne pas être définie (valeurs par défaut) | 0 0 0 |
bboxSize | float[3] | -1 -1 -1 | |
center | float[3] | translation par rapport au repère local (0, 0, 0) | 0 0 0 |
translation | float[3] | translation du repère du personnage h-anim | 0 0 0 |
rotation | float[4] | rotation du repère du personnage h-anim | 0 0 1 0 |
scale | float[3] | facteur d'échelle non uniforme du personnage h-anim | 1 1 1 |
scaleOrientation | float[4] | orientation dans laquelle sera effectué le facteur d'échelle | 0 0 1 0 |
info | sequence<string> | informations
générales sur le personnage h-anim du type: "authorName=xxx" "authorEmail=xxx" "copyright=xxx" "creationDate=xxx" "usageRestrictions=xxx" "humanoidVersion=xxx" "age=xxx" "gender=xxx" habituellement female male or neuter "height=xxx" "weight=xxx" | [ ] |
version | string | version de la norme h-anim utilisée | "200x" |
name | string | nom (obligatoire) du personnage h-anim | "" |
skeleton | sequence<Object> | contient le Joint HumanoidRoot, racine de la hiérarchie des Joints du personnage h-anim ainsi que la définition de cette dernière. Toute transformation appliquée à l'objet Humanoid est donc répercutée à l'ensemble de la hiérarchie. Il peut également contenir des objets Sites | [ ] |
joints | sequence<Object> | contient une liste des Joints utilisés dans la hiérarchie définie dans le champ skeleton (liste de références) | [ ] |
segments | sequence<Object> | contient une liste des Segments utilisés dans la hiérarchie définie dans le champ skeleton (liste de références) | [ ] |
sites | sequence<Object> | contient une liste des Sites utilisés dans la hiérarchie définie dans le champ skeleton (liste de références) | [ ] |
viewpoints | sequence<Object> | peut contenir des objets Sites qui seront affectés uniquement par les transformations appliquées à l'objet Humanoid (caméras virtuelles) | [ ] |
skin | sequence<Object> | contient une ou plusieurs définitions d'indexed face sets. | [ ] |
skinCoord | sequence<float[3]> | contient une séquence de points utilisés dans la définition des indexed face sets du champ skin | [ ] |
skinNormal | sequence<float[3]> | contient une séquence de normales utilisées dans la définition des indexed face sets du champ skin | [ ] |
Note: les différences de h-anim 200x par rapport à h-anim 1.1 sont:
PROTO Humanoid [ field SFVec3f bboxCenter 0 0 0 field SFVec3f bboxSize -1 -1 -1 exposedField SFVec3f center 0 0 0 exposedField MFString info [ ] exposedField MFNode joints [ ] exposedField SFString name "" exposedField SFRotation rotation 0 0 1 0 exposedField SFVec3f scale 1 1 1 exposedField SFRotation scaleOrientation 0 0 1 0 exposedField MFNode segments [ ] exposedField MFNode sites [ ] exposedField MFNode skeleton [ ] exposedField MFNode skin [ ] exposedField SFNode skinCoord NULL exposedField SFNode skinNormal NULL exposedField SFVec3f translation 0 0 0 exposedField SFString version "200x" exposedField MFNode viewpoints [ ] ] { Transform { bboxCenter IS bboxCenter bboxSize IS bboxSize center IS center rotation IS rotation scale IS scale scaleOrientation IS scaleOrientation translation IS translation children [ Group { children IS viewpoints } Group { children IS skeleton } ] } } DEF Humanoid Humanoid { info [ "humanoidVersion=BipLow v1.0", "authorName=Laurence Boissieux", "authorEmail=Laurence.Boissieux@inrialpes.fr", "copyright=2005 INRIA , all rights reserved.", "creationDate=Mon Feb 28 2005", "usageRestrictions=Noncommercial usage is ok if INRIA name is present and proper credit is given." ] name "BipLow" version "200x" skeleton [ DEF hanim_HumanoidRoot Joint {... } ] joints [ USE hanim_HumanoidRoot, ... ] segments [ USE hanim_pelvis, ... ] viewpoints [ DEF FrontView Viewpoint { ... } ... ] }
Cet objet contient la définition des éléments articulaires du personnage h-anim
Champ | Type | Description | Valeur par défaut |
name | string | seul champ obligatoire, le nom doit suivre
les conventions suivantes:
| "" |
center | float[3] | coordonnées du centre du Joint par rapport à la racine du personnage h-anim (objet Humanoid) | 0 0 0 |
translation | float[3] | translation du Joint dans le repère père | 0 0 0 |
rotation | float[4] | rotation du Joint dans le repère père | 0 0 1 0 |
scale | float[3] | facteur d'échelle non uniforme du Joint | 1 1 1 |
scaleOrientation | float[4] | orientation dans laquelle sera effectué le facteur d'échelle | 0 0 1 0 |
skinCoordWeight | sequence<float> | séquence de points de valeurs entre 0 et 1 utilisés pour pondérer les sommets contenus dans le champ skinCoord de l'Objet Humanoid | [ ] |
skinCoordIndex | sequence<int> | séquence d'indices indiquant quelles cooronnées influencer | [ ] |
llimit | sequence<float[3]> | limite inférieure de rotation du Joint autour de X Y et Z, aucune contrainte par défaut | [ ] |
ulimit | sequence<float[3]> | limite supérieure de rotation du Joint autour de X Y et Z, aucune contrainte par défaut | [ ] |
limitOrientation | float[4] | orientation des axes contraintes sur lesquels s'appliquent les limites, ce repère ayant pour origine l'origine du Joint | 0 0 1 0 |
stiffness | sequence<float[3]> | si présent, contient des valeurs entre 0 et 1 indiquant l'amplitude à appliquer à chacun des degrés de liberté pour calculer la rotation à chaque pas dans le cadre d'un solver de cinématique inverse | [0 0 0] |
displacers | sequence<Object> | liste d'objets Displacer utilisés pour déformer le maillage | [ ] |
children | sequence<Object> | contient la suite de la hiérarchie (objet(s) Segment et Joints enfants) | [ ] |
... PROTO Joint [ exposedField SFVec3f center 0 0 0 exposedField MFNode children [ ] exposedField MFFloat llimit [ ] exposedField SFRotation limitOrientation 0 0 1 0 exposedField SFString name "" exposedField SFRotation rotation 0 0 1 0 exposedField SFVec3f scale 1 1 1 exposedField SFRotation scaleOrientation 0 0 1 0 exposedField MFInt32 skinCoordIndex [ ] exposedField MFFloat skinCoordWeight [ ] exposedField MFFloat stiffness [ 0 0 0 ] exposedField SFVec3f translation 0 0 0 exposedField MFFloat ulimit [ ] ] { Transform { center IS center children IS children rotation IS rotation scale IS scale scaleOrientation IS scaleOrientation translation IS translation } } ... DEF hanim_HumanoidRoot Joint { name "HumanoidRoot" translation 0 0 0 rotation 0 0 1 0 center 0 0.903 -0.025 children [ DEF hanim_sacroiliac Joint { name "sacroiliac" rotation 0 0 1 0 center 0 0.903 0.025 children [ DEF hanim_pelvis Segment {...} ... ] } ... ] } ...
Cet objet contient la définition des éléments constituant le corps du personnage h-anim
Champ | Type | Description | Valeur par défaut | bboxCenter | float[3] | bounding box de l'ensemble
des enfants du Segment elle peut ne pas être définie (valeurs par défaut) | 0 0 0 |
bboxSize | float[3] | -1 -1 -1 | |
name | string | seul champ obligatoire, le nom doit suivre
les conventions suivantes:
| "" |
mass | float | masse du Segment | 0 |
centerOfMass | float[3] | coordonnées du centre de masse dans le repère du Segment, par défaut il n'y a pas de masse | -1 -1 -1 |
momentsOfInertia | float[9] | matrice du moment d'inertie | [ 0 0 0 0 0 0 0 0 0 ] |
coord | sequence<float[3]> | pour les Segments dont le maillage est déformable, ce champ contiendra les coordonnées référencées à partir de l'IndexedFaceSet défini pour le Segment. La convention de nommage de ces coordonnées est nomSegment_coords (ex: l_thigh_coords) | NULL |
displacers | sequence<Object> | liste d'objets Displacer utilisés pour déformer le maillage | [ ] |
children | sequence<Object> | enfants du Segment (Shape pour définir la géométrie entre autres) | [ ] |
addChildren | sequence<Object> | enfants à ajouter au Segment | |
removeChildren | sequence<Object> | enfants du Segment à supprimer |
... PROTO Segment [ field SFVec3f bboxCenter 0 0 0 field SFVec3f bboxSize -1 -1 -1 exposedField SFVec3f centerOfMass 0 0 0 exposedField MFNode children [ ] exposedField SFNode coord NULL exposedField MFNode displacers [ ] exposedField SFFloat mass 0 exposedField MFFloat momentsOfInertia [ 0 0 0 0 0 0 0 0 0 ] exposedField SFString name "" eventIn MFNode addChildren eventIn MFNode removeChildren ] { Group { addChildren IS addChildren bboxCenter IS bboxCenter bboxSize IS bboxSize children IS children removeChildren IS removeChildren } } ... DEF hanim_pelvis Segment { name "pelvis" children Shape { appearance Appearance { material Material { diffuseColor 0.102 0.6941 0.102 } } geometry IndexedFaceSet { coord Coordinate { point [ .... ] } coordIndex [ .... ] creaseAngle 1.14 } } } ....
Cet objet contient des informations pour positionner des caméras, des points d'attachement d'accessoires etc.
Champ | Type | Description | Valeur par défaut |
name | string | champ obligatoire, le nom doit suivre
les conventions suivantes:
| "" |
center | float[3] | coordonnées du centre du Site par rapport à la racine du personnage h-anim (objet Humanoid) | 0 0 0 |
translation | float[3] | translation du Site dans le repère père | 0 0 0 |
rotation | float[4] | rotation du Site dans le repère père | 0 0 1 0 |
scale | float[3] | facteur d'échelle non uniforme du Site | 1 1 1 |
scaleOrientation | float[4] | orientation dans laquelle sera effectué le facteur d'échelle | 0 0 1 0 |
children | sequence<Object> | enfants du Site | [ ] |
addChildren | sequence<Object> | enfants à ajouter au Site | |
removeChildren | sequence<Object> | enfants du Site à supprimer |
... PROTO Site [ exposedField SFVec3f center 0 0 0 exposedField MFNode children [] exposedField SFString name "" exposedField SFRotation rotation 0 0 1 0 exposedField SFVec3f scale 1 1 1 exposedField SFRotation scaleOrientation 0 0 1 0 exposedField SFVec3f translation 0 0 0 eventIn MFNode addChildren eventIn MFNode removeChildren ] { Transform { addChildren IS addChildren center IS center children IS children removeChildren IS removeChildren rotation IS rotation scale IS scale scaleOrientation IS scaleOrientation translation IS translation } } .... DEF hanim_crotch Site { # CAESAR Feature Point #73 name "crotch" translation 0.0034 0.8266 0.0257 children [ ] } ....
Cet objet contient des informations pour positionner des contraintes de mouvement sur les élémens du personnage h-anim.
Champ | Type | Description | Valeur par défaut |
name | string | seul champ obligatoire, le nom doit suivre
les conventions suivantes:
| "" |
coordIndex | sequence<int> | indices des sommets du maillage affectés par le Displacer | [ ] |
displacements | sequence<float> | valeurs 3D de déplacement maximum pour chacun des points du maillage référencés dans coordIndex | |
weight | float | poids à appliquer aux valeurs de déplacement, en modulant ce poids on peut effectuer un morphing linéaire |
Les déplacements des Displacers contenus dans les champs des objets Segment sont définis et appliqués dans le repères des Segments. Ceux contenus dans les champs des objets Joint s'appliquent au maillage défini dans le champ skinCoord de l'objet Humanoid et dans le repère des Joints.
Note: le champ weight est une nouveauté de h-anim 200x par rapport à h-anim 1.1
... PROTO displacer [ exposedField MFInt32 coordIndex [ ] exposedField MFVec3f displacements [ ] exposedField SFString name "" exposedField SFFloat weight 0.0 ] ... DEF hanim_l_eyebrow_raiser_action Displacer { coordIndex [ 7, 12, 21, 18 ] displacements [ 0 0.0025 0, 0 0.005 0, 0 0.0025 0, 0 0.001 0 ] name "l_eyebrow_raiser_action" } ...
Les applications supportant le standard h-anim doivent au minimum supporter les noeuds suivants:
Nom | Type | Linux | Windows | Mac | URL |
cortona | plug-in | X | X | http://www.parallelgraphics.com/products/browsers/ | |
freewrl | standalone | X | X | http://sourceforge.net/projects/freewrl/ | |
octaga | standalone | X | X | http://www.octaga.com/start/start.php?startpage=download_octaga |