Académique Documents
Professionnel Documents
Culture Documents
Ronan BILLON
lundi 15 janvier 2007
$ ./configure
======== Building dependencies...
...
$ make
$ ./myexecutable
hLib (Humanoid Library) est une bibliothque qui ajoute les fonctionnalits ncessaires pour crer des per-
sonnages anims base de squelette. Ces personnages ne sont pas obligatoirement des humanodes. En thorie
hLib peut tre compile sur toutes les plateformes o ARVi est disponible. Les objectifs de la hLib sont les
suivants :
Cration et importation de squelettes (depuis les types de fichier suivant : SMD (Half Life 2), MD5 (Doom 3),
BVH (Biovision)) ;
Importation danimation directe partir de keyframes (mme type de fichier) ;
Skinning animation de la peau en suivant le squelette ;
Animation par cinmatique inverse.
Animation en temps rel de plusieurs individus.
Le but de ce document est de prsenter les concepts de base ncessaires lutilisation de cette bibliothque.
Il sadresse un public avertit, connaissant dj ARVi et ayant des notions de mathmatiques gomtriques
3D (matrices, quaternions, ...). Pour avoir des informations sur les classes prsentes, une documentation a t
gnre automatiquement avec Doxygen. Vous la trouverez dans le ballot. Pour plus de dtails sur les diffrents
mcanismes dploys ici, nous invitions le lecteur consulter la bibliographie. La plupart des algorithmes utiliss
sont issus de publications scientifiques.
Pour utiliser cette bibliothque, veuillez ajouter votre compilateur le lien vers AReViHLib2.(so,dll).
2
Tutoriel AReVi/hLib 2
Avertissement
Il y a deux diffrences notables avec la premire version :
3
Tutoriel AReVi/hLib 2
Pour embellir le squelette, une peau, se dformant en suivant ses mouvements, peut tre ajoute. La classe
Skin hritant de Surface3D gre cela parfaitement. Pour un mme BodyShape, plusieurs peaux peuvent exister,
cela permet un dcoupage de la structure du personnage, pour par exemple changer seulement sa tte. Le principe
de la dformation sappuie sur lorientation et la position des joints, ainsi quune pondration. Ce qui signifie par-
ticulirement que deux squelettes ayant une forme identique peuvent avoir des orientations de joints diffrentes,
et donc un comportement de la peau diffrent.
Figure 1. Deux squelettes identiques avec une orientation des joints diffrente
Limage prcdente montre lutilisation des programmes de test $ ./testMorphet $ ./testLoad. Avec le
premier, il y a une adaptation de lorientation des joints en fonction de la peau alors que le second montre une
application brute et directe de la skin sur le squelette.
4
Tutoriel AReVi/hLib 2
ordonne les diffrentes postures appliquer un squelette pour faire un mouvement. La dure du mouvement
est calcule automatiquement au moment dune insertion ou dune suppression dimage cl.
La cinmatique inverse permet de trouver une position et une orientation de chaque joints du squelette pour
satisfaire une condition de position dun joint particulier. Par exemple, je souhaite que la main dun humanode
atteigne la porte, lalgorithme va calculer les orientations de chacun des joints de la chane jusqu la racine.
Lalgorithme utilis par la hLib est le Cyclic Coordinate Descent (CCD). En plusieurs tapes, lalgorithme modifie
lorientation de chaque joints pour tenter datteindre la position voulue.
Pour prsenter lutilisation de la hLib, nous utiliserons les exemples fournis dans le ballot. Dans lordre :
5
Tutoriel AReVi/hLib 2
tesLoadInteractive : importation dun fichier contenant le squelette et la peau, lhumanode pourra tre manipul
par cinmatique inverse.
Exemple 2. testBody.cpp
...
ArRef<Skeleton> skeleton = Skeleton::NEW();
joint = Joint::NEW();
joint->setName("joint1");
joint->setParent(skeleton->findJoint("root"));
joint->setLocalTranslation(Vector3d(1.0, 0.0, 0.0));
joint->setLocalRotation(Quaterniond(1.6,0.0, 1.0, 0.0));
skeleton->addJoint(joint)
...
La cration dun squelette vide se droule de la mme faon que tout objet ARVi avec la commande
Skeleton::NEW(). La suite correspond lajout des joints dans le squelette. Les tapes respecter dans lordre :
body = Body::NEW();
body->setShape(bodyShape);
Lors de la cration des joints, la rfrence dun a t sauvegard. Celle-ci servira durant lactivit pour faire
tourner un morceau dun angle de PI/4.
6
Tutoriel AReVi/hLib 2
Exemple 4. testBody.cpp
...
body->setPosition(1,0,0);
scene->addObject(body);
...
bool TestBody::event(ArRef<Activity> /*act*/, double /*dt*/)
{
joint_test->pitch(M_PI_4);
return true;
}
...
Le cas suivant sappuyant fortement sur cet exemple, il ne sera pas dtaill. La diffrence notable est
linstanciation du Body avec la commande : body = InteractiveBody::NEW(). Jencourage fortement la
lecture de la documentation gnre par Doxygen pour lutilisation des chanes pour la rsolution de la cinma-
tique inverse. La mthode setAutoIk() permet dactiver la rsolution. La mthode setIkChain() permet de
dfinir la propagation de la rsolution depuis le joint slectionn jusqu la racine.
La rsolution de la cinmatique inverse se base sur lalgorithme CCD. Celui-ci est implment dans la classe
IkCcd, elle contient une variable statique dfinissant le nombre de fois que la chane entire doit tre estim. Et,
une mthode statique solve(goal, end, parent) qui modifiera la chane depuis le joint end jusquau joint
parent pour atteindre la position fournit par goal. Bien que ce paramtre soit une Base3D, seul la position est
utilise.
3.2. testSkin
Cet exemple vise raliser une peau en forme de sphre qui sera dforme en suivant les diffrents mouve-
ments des joints du squelette en toile sous-jacent.
Exemple 5. testSkin.cpp
...
ArRef<Skeleton> skeleton = Skeleton::NEW();
La premire tape est la cration du squelette avec des joints disposs en toile autour dun noeud racine.
Puis dappliquer ce squelette une BodyShape. Ensuite vient la gnration de la peau, pour le cas prsent et dun
point de vue didactique, elle est gnre partir dune sphre. Toute Skin est un objet Surface3D avec deux
informations fondamentales pour chaque vertex : une liste de joints suivre et une pondration pour chaque joints
de la liste.
7
Tutoriel AReVi/hLib 2
Exemple 6. testSkin.cpp
...
ArRef<Skin> skin = Skin::NEW();
ArRef<Sphere3D> sphere = Sphere3D::NEW();
sphere->setRadius(1.0);
generate(skin, sphere, skeleton);
bodyShape->addSkin(skin);
Comme indiqu dans la documentation gnre par Doxygen, il faut imprativement utiliser la mthode
setRestPose() aprs avoir ajout toutes les peaux au corps, sinon, il risque dy avoir des dformations
tranges . Le reste du code permet de crer six cube de manipulation qui sont attachs aux joints grce la
mthode attachTo(), voici un exemple dintrt pour la classe Joint dhriter de Base3D. En manipulant les
cubes, on remarque bien la dformation de la peau.
3.3. testLoad
Cette utilisation sera la plus commune de la hLib. Ce programme prend en argument un ou deux fichiers et
affiche ce quil contient. Il peut sagir :
Exemple 7. testLoad.cpp
...
StlString str = ArSystem::getCommandLine()[1];
cerr << "Loading " << str << " ...\t";
LoaderData data = HLibLoader::loadFile(str);
if(data.failed) {
cerr << "FAILED" << endl;
} else {
cerr << "done" << endl;
}
body = data.body;
scene->addObject(body);
...
Lanimation seffectue simplement en appliquant une pose au corps. Cette pose est dtermine en fonction
du temps courant, les tapes sont les suivantes :
8
Tutoriel AReVi/hLib 2
2. animation->evaluate(dt) : lanimation retourne une pose (Keyframe) en fonction des positions cls ;
3. body->applyPose() : qui est lapplication de cette pose par recopie des donnes de la Keyframe.
Le dernier exemple testMorph ne sera pas dtaill, car une seule ligne a t ajoute. Il sagit de ladaptation
du Body pour que les orientations de dpart de lanimation correspondent aux orientations de dpart de la peau.
Si cette adaptation nest pas faite, la peau devient trange , voir les images Figure 1. Cette dformation ne
se produira pas si les joints de lanimation sont bien en correspondance avec les joints du squelette associ la
peau, ce qui arrive souvent lorsque toute la cration est faite dun coup, mais plus rarement lorsque lon rcupre
des animations venant dailleurs (exemple fichier *.bvh appliqu avec un bonhomme *.md5). La commande est
simple : body->setBaseframe(animation->evaluate(0),false). Le premier paramtre est la premire
pose de lanimation et le second paramtre est un boolen permettant lalgorithme de dformer le squelette.
Cette option nest utiliser que si les squelettes sont trs proches sinon, l trange reviendra.
Bibliographie
[HCJ06] Fabrice Harrouet, Eric Cazeaux, et Thomas Jourdan, Arvi, chapitre du volume Outils et modles
informatiques des environnements virtuels du trait de la ralit virtuelle, P. Fuchs, G. Moreau, et 72
auteurs, 4 volumes, Les Presses de lEcole des Mines de Paris, www.esnmp.fr/Presses, mars 2006.