Affichage des articles dont le libellé est llGetRot. Afficher tous les articles
Affichage des articles dont le libellé est llGetRot. Afficher tous les articles

vendredi 11 janvier 2008

llSitTarget


La fonction du jour llSitTarget détermine la position de l'avatar après l'action sit. Une application courante est le téléporteur. En effet on peut determiner la position d'assise mais elle n'est pas forcement sur l'objet lui même, la distance maximum est de 300m.
Le premier paramêtre est la distance relative par raport à notre objet. Attention ce n'est pas les coordonnées d'arrivé mais la distance entre les deux et il ne faut pas oublié de prendre en compte la rotation de l'objet sinon on se retrouve pas au même endroit.
Le deuxième paramètre est la rotation, ce n'est pas important dans le cadre d'un teleport la position finale alors on le mets à ZERO_ROTATION.
j'ai rajouté une autre fonction aujourd'hui llUnSit qui force l'avatar à se relever, sinon il arrive en position assise. Et on ne fait cette action que si il est assis dessus.

default
{
    state_entry()
    {
        // position de destination x,y,z
        vector Destination=<512,34,10>;

        // distance relative au teleport
        vector offset=(Destination-llGetPos())/llGetRot();

        // la fonction du jour
        llSitTarget(offset,ZERO_ROTATION);
    }
    // l'evenement se produit d'un changement avec un prim
    // dans le cas qui nous interesse je m'assieds ou je me lève
    changed(integer change)
    {
        // verifie si il s'agit d'un changement de liaison
        if(change==CHANGED_LINK)
        {
            // la fonction du jour
            key user=llAvatarOnSitTarget();

            // on verifie la presence de l'avatar
            if(user!=NULL_KEY)
                // remet debout l'avatar à la destination
                // sinon il arrive en position assise
                llUnSit(user);
        }
    }
}

vendredi 28 décembre 2007

llGetRot

La notion d'aujourd'hui est très compliqué, c'est pourquoi nous ne ferons que la survolée pour le revoir plus en profondeur plus tard.
llGetRot nous donne la rotation d'un objet sous forme d'un vecteur. Vous avez pu le constater que lorsque l'on change la position d'un prim, ca n'a pas le même effet si on a changé la rotation.
En effet le déplacement reste le même mais plus dans le sens de la rotation. Pour ceux qui ont des notions de trigonométrie, cela sera plus facile à comprendre.

tout le secret réside ici:
offset*=llGetRot();

ca pourrait déja s'ecrire offset=offset*llGetRot() mais on utilise généralement se raccourci d'ecriture
En faisant le produit entre la rotation(ou angle) et le vecteur de position on modifie la position en fonction de la rotation.
Intuitivement on peut se douter que la rotation doit rentrer en ligne de compte.
Pour l'instant admettez juste pos*rot prise compte de la rotation.


Notre script de porte a aussi une amélioration notable, on utilise un seul script pour les deux portes, il suffit juste de mettre -1 ou 1 dans la description

// defini un vecteur pour la position de l'objet
vector pos;
integer sens;
default
{
state_entry()
{
// fonction que l'on a déja vu qui recupère la description de l'objet
// la valeur de la description de l'objet sera -1 ou 1
// cette valeur permetra à le porte de s'ouvrir vers la gauche ou la droite
// en fonction de si il s'agit d'une porte de gauche ou de droite
// (integer) permet de transformer en entier le string en provenance de la description
sens=(integer)llGetObjectDesc();
}

touch_start(integer total_number)
{
vector size;
// float est un nombre décimal(a virgule)
float largeur;

// sauvegarde la position initiale
pos=llGetPos();

// recupère les dimension de l'objet
size=llGetScale();
largeur=size.y;

// on appelle un offset la différence de distance entre deux point
// en multipliant par le sens notre porte ira vers la gauche ou la droite
vector offset=<0,sens*largeur,0>;

// la fonction du jour
offset*=llGetRot();

// on ajoute l'offset à la porte pour la déplacer
llSetPos(pos+offset);


// delenchera l'evenement timer dans 20 secondes
llSetTimerEvent(20);
}
timer()
{
//remet en place l'objet
llSetPos(pos);

//empêche le déclenchement de l'evenement timer
llSetTimerEvent(0);
}
}