Recherche

Recherche personnalisée

dimanche 29 mars 2009

Tutorial 7 Animation (1/2)

Blog de lsl :Les scripts de Second life, Tutorial 7 Animation (1/2)



Jusque là nous ne nous sommes intéressés qu'aux objets, voyons un peu ce que ça donne du côté des avatars. S'il est relativement facile de faire bouger des objets, de les redimensionner, de changer leur couleur et leur texture il n'en est pas de même pour les avatars, heureusement ! Un avatar dépend de son propriétaire et nous ne pouvons intervenir sur lui qu'avec son accord (sauf rare exception dont je ne parlerai pas). Commençons par quelques précisions syntaxiques. Second Life est constitué de simulateurs (simulator, on dit souvent sim ou region) dont chacun est chargé de gérer un espace de 256 m². Ces simulateurs sont mis en oeuvres par des PC, chacun chargé de gérer un certain nombre de simulateurs. Une page du wiki vous donne plus de renseignements sur les simulateurs :



http://lslwiki.net/lslwiki/wakka.php?wakka=simulator



Un utilisateur de SL, comme vous et moi est constitué d'un agent et d'un avatar. Un agent est géré directement par le simulateur comme une présence. Un avatar est l'aspect visuel d'un agent : un corps avec toutes ses caractéristiques morphologiques. Un avatar peut porter des habits, avoir des attachements et subit les lois de la physique. Dans le reste de ce tutorial je ne vous parlerai que d'avatar. Pour animer un avatar il faut utiliser des animations. Une animation est une petite séance de cinéma pour avatar... Il en existe un certain nombre incluses dans SL. Vous les avez toutes listées ici :



http://lslwiki.net/lslwiki/wakka.php?wakka=animation



Mais vous pouvez en trouver bien d'autres dans les boutiques free. Vous pouvez aussi en créer avec des logiciels comme Poser au format BVH. Pour ce tutorial je vous propose d'utiliser une animation intégrée : sleep. Comme son nom l'indique c'est pour faire dormir un avatar ! Le contexte est simple : un lit, un avatar, un clic droit sur le lit, à la place du classique "sit" apparaît "dormir" et lorsque l'avatar clique sur celui-ci il va gentiment se coucher sur le lit. Voici le code correspondant que je vais vous commenter :



// Animation
string Animation;

initialisations()
{
// Animation
Animation = "sleep";
// Changement du menu
llSetSitText("Dormir");
// Positionnement de l'animation
llSitTarget(<0,0,1>, ZERO_ROTATION);
}

default
{
state_entry()
{
initialisations();
}

on_rez(integer start_param)
{
initialisations();
}

changed(integer change)
{
// Test de changement dans les liaisons
if (change & CHANGED_LINK)
{
// Determination de la clef de l'avatar
key AgentKey = llAvatarOnSitTarget();
// Un avatar present ?
if (AgentKey)
{
// Permission d'animation
llRequestPermissions(AgentKey, PERMISSION_TRIGGER_ANIMATION);
}
else
{
// Arret de l'animation
llStopAnimation(Animation);
// Reinitialisation du script pour le prochain avatar
llResetScript();
}
}
}

run_time_permissions(integer permissions)
{
if(permissions == PERMISSION_TRIGGER_ANIMATION)
{
// Arret de l'animation par defaut
llStopAnimation("sit");
// Annimation
llStartAnimation(Animation);
}
}
}



Pour un peu vous reposer du tuto précédent j'ai fait tout simple cette fois. Une seule variable globale Animation chargée de mémoriser le nom de l'animation. Pour mon exemple j'ai choisi sleep mais vous pouvez évidemment prendre n'importe laquelle, enfin presque mais j'y reviendrai. Au niveau de l'initialisation, après avoir affecté la variable Animation, je change le texte du menu du clic droit. Par défaut on voit apparaître sit, ici je le remplace avec "dormir". C'est la fonction llSetSitText qui nous permet de faire ça. Attention vous n'avez droit qu'à 9 caractères ! Le dernier élément de l'initialisation est assuré par la fonction llSitTarget. Cette fonction a une double utilité. D'abord elle permet de définir l'emplacement exact de l'animation par rapport à l'objet (un vertor d'offset et une rotation). Ensuite elle permet d'utiliser la fonction llAvatarOnSitTarget qui détermine si un avatar vient de s'asseoir et nous renvoie sa clef (Key). En plus un événement changed est renvoyé lorsqu'un avatar s'assoit. Autrement dit à l'issue de cette initialisation on attend l'événement changed... Cet événement est important, regardons le de plus près :



http://lslwiki.net/lslwiki/wakka.php?wakka=changed



Vous constatez qu'il survient dès qu'il se passe quelque chose au niveau de l'objet : inventaire, couleur, forme, taille, texture, liaisons, possession, region, téléportation... Le seul paramètre de l'événement est un integer, autrement dit une variable de 32 bits. A chacun de ces bits correspond une valeur vraie ou fausse. Ce qui permet de stocker 32 valeurs booléennes. Pour extraire une de ces valeurs il faut utiliser un "et" logique. Considérons le CHANGED_LINK, qui nous concerne pour notre script puisque lorsqu'un avatar s'assoit sur un objet il se retrouvé lié à celui-ci en dernière position de la hiérarchie. Dans le tableau du WIKI nous voyons que cette constante a pour valeur 0x20. Cette valeur peut vous paraître étrange si vous n'êtes pas habitué à d'autre système de numération que la décimale ! Elle est en hexadécimal. Pour ceux qui ignorent de quoi il s'agit je vous renvoie à cette page :



http://fr.wikipedia.org/wiki/Syst%C3%A8me_hexad%C3%A9cimal



La valeur hexadécimale 20 (le "0x" placé devant sert juste à signifier qu'il s'agit d'un hexadécimal) correspond donc à 32 en décimal et à 10000 en binaire. Donc lorsqu'il survient un changement dans les liaisons des prims d'un objet l'événement changed renvoie la valeur binaire 100000. Si nous appliquons un "ET" logique entre la valeur du paramètre renvoyé par l'événement et la valeur 100000 (on appelle cela un masque en programmation) le résultat sera "VRAI". Voilà comment nous détectons la présence d'un avatar. Une fois que nous l'avons détecté nous devons savoir de qui il s'agit, pour cela la fonction llAvatarOnSitTarget nous donne sa clef (Key). Ensuite il faut quand même effectuer un test pour savoir si le lien supplémentaire est vraiment un avatar et pas un simple prim ajouté ! Si nous avons une valeur correcte de clef alors c'est bon, c'est bien un avatar. Nous devons alors lui demander la permission de lui appliquer une animation avec la fonction llRequestPermissions. Regardez cette page :



http://lslwiki.net/lslwiki/wakka.php?wakka=llRequestPermissions



Vous constatez qu'on l'interroge pour pas mal de choses ! Ce qui nous intéresse là est représenté par la constante PERMISSION_TRIGGER_ANIMATION qui est aussi un masque de valeur 16 en décimal, donc 1000 en binaire. On sait si l'avatar est d'accord par l'intermédiaire de l'événement run_time_permissions dont le paramètre unique détermine le type d'autorisation. Vous en avez la liste ici :



http://lslwiki.net/lslwiki/wakka.php?wakka=run_time_permissions



Vous constatez qu'on retrouve notre PERMISSION_TRIGGER_ANIMATION avec la même valeur. Dans l'interception de l'événement nous faisons un test pour savoir si nous recevons la bonne valeur de paramètre. Ensuite il faut désactiver l'animation par défaut sit avec la fonction llStopAnimation puis lancer notre animation avec la fonction llStartAnimation.

Le dernier point à prendre en compte c'est que nous recevons l'événement changed aussi lorsque l'avatar se lève. A ce moment là il faut stopper notre animation et faire un Reset du script.

4 commentaires:

  1. Mes vives félicitations pour votre site! Ça m'a beaucoup aidé et plu, surtout que tous vos partages sont intéressants. Longue vie à votre site. Surtout ne vous découragez jamais ; votre blog est vraiment au top !

    voyance gratuite par mail ; voyance gratuite mail

    RépondreSupprimer
  2. Ton blog est vraiment génial, je tenais à te remercier pour l’aide que tu apporte.
    voyance par mail gratuite

    RépondreSupprimer
  3. Je trouve c’est article hyper intéressants , des notions de base qui peuvent aider ..
    Merci à la personne.
    voyance gratuite par mail rapide

    RépondreSupprimer
  4. Je suis tellement émerveillée de voir tous ces beaux changements. Merci à toute l'équipe .
    voyance en ligne email

    RépondreSupprimer