perdu la tête

Répondre
Partager Rechercher
Bonjour,

J'ai besoin de connaitre la position globale de la tête de mon avatar...
Je peux trouver la position globale du centre de mon avatar donc de coté c'est ok.
Je cherche donc a obtenir la position relative de la tête / Référentiel de l’Agent.
J'ai pensé porter un prim attaché à la tête qui contient un script me renvoyant sa position.
Malheureusement la fonction llGetLocalPos() renvoie <0,0,0> puisque dans le cas d'un attachement elle renvoie "la position dans un référentiel lié au point d’attache.", et la fonction llGetPos() me renvoie la position globale du centre de l'avatar...
Bref je coince
Une idée ?
Cela sert a rien . Laisse tomber cette idée .

Les parties de ton avatar sont sujettes aux animations BVH , entre autre chose .( comme shape , et autres déformations )
Ta tête bouge donc continuellement et le calcul est fait sur le viewer.
Si ta tête peut apparaître à un endroit pour une personne , elle peut apparaître au même instant à un autre endroit pour une autre personne ( par exemple parce que cette dernière doit attendre du réseau de recevoir les données de l animation BVH , alors que l autre personne l a déjà reçue , ou parce l animation n a pas démarré au même instant pour les deux personnes etc ... )

Par contre, tu peux éventuellement deviner où se trouvent les bounding boxes physiques. Mais ce n est pas un résultat visuel.

Dernière modification par redpurple ; 19/08/2014 à 16h01.
Ok je vois...
Merci pour cette prompt réponse

Mais les prims portés sont donc sujets aux anims coté viewer ?
Il existe des fonctions de mouvements coté viewer non ?

Les bounding boxes physiques...
C'est a dire détecter les collisions entre 2 prims portés par l'avatar a des points différents ?

Si ça sert a rien c'est diablement intéressant !!!

Dernière modification par yvoz ; 19/08/2014 à 16h19.
Les prims portées sont sujettes aux animations , oui. Dans le sens qu elles suivent le point d attachement , que cela soit avec un offset par rapport a celui ci ou non.
Exemple , tu portes un casque .
Tu es debout , tu appuies sur la touche C pour te mettre en accroupi : tu as bien ton casque qui s est déplacé en suivant ta tête.
Tu ne peux pas déplacer tes prims attachées sur une position régionale puisqu en fait elles suivent le mouvement de tes points d attachements.
Par contre , tu peux déplacer tes prims avec des positions relatives à tes points d attachements.
Pour reprendre l exemple , tu ne pourras pas déplacer ton casque au centre de la sim , mais par contre tu peux faire rebondir ton casque sur ta tete . Le mouvement suivra une composition
- du mouvement de la tête définie dans l animation BVH que tu joues et
- du mouvement relatif du casque par rapport à son point d attachement donc ta tête

**edit**
je parlais de la bounding box de ton avatar .
La bounding box ne change pas suivant l animation jouée.
Ton sommet de la tête , hors attachement , se trouve en limite de la bounding box de ton avatar.
dans certaines circonstances particulières , ( pas d hover dans ta shape ( hover = 50) , en position debout , non away, avec l animation "stand" par défaut )
Code PHP:

        vector pos llDetectedPos(0);
        
key avatar llDetectedKey(0) ;
        
vector bb llList2VectorllGetBoundingBoxavatar ), 1);
        
vector positionSommetDuCrane pos + <0,0,bb.z
Mais ce n est pas généralisable à des circonstances usuelles

Dernière modification par redpurple ; 19/08/2014 à 17h12.
Je suis un peu stupide, je souhaite quand même déplacer des prims coté viewer
Ou tout au moins expérimenter un peu...
Je n'ai trouvé que ces deux fonctions qui permettent ce genre de choses :
llSetKeyFramedMotion
llTargetOmega
Et rien de particulier en tuto...
Help
Personnellement je n'ai rien compris à ce que tu veux faire mais pour info :


  • llSetKeyFramedMotion ne peut pas s'appliquer à des attachements,
  • llTargetOmega permet juste de faire tourner des primitives et affiche un résultat différent pour chaque utilisateur.
Qui partirait de la tête ou de la main puis irait se poser quelque part peu importe
Par forcement en attachement, mais l'attachement sur le centre de l'avatar permet de "poser" sans rezzer. Donc c'est un peu indispensable...
C'est aussi de la simple curiosité pour voir ce qui est possible ou pas

Il existe aussi peut être des outils de synchro des animations BVH entre les utilisateurs ?
"puis irait se poser quelque part peu importe": cela implique donc un détachement non?

Sinon, il est possible d'animer le(s) "child(ren)" d'un objet porté, dont le "root" attaché à un endroit du corps, serait fixe (et par exemple invisible).

Exemple: tu lies 2 cubes: l'un est "root" (en jaune quand on l'édite), l'autre est "child" (en bleu) .

Tu glisses ces deux scripts dans le "child":

L'un concerne les translations:

Code PHP:

default
{
on_rez(integer r)
{
    
llResetScript();
}

link_message(integer sinteger nstring mkey id)
{
  
if(
m=="position0"){

vector translation=<0.18967, -1.946330.00000>;

llSetPrimitiveParams([6translation]);
}

if(
m=="position1"){

vector translation=<0.18967, -1.946332.02570>;

llSetPrimitiveParams([6translation]);

}

if(
m=="position2"){

vector translation=<-2.54750, -1.946332.02570>;

llSetPrimitiveParams([6translation]);
 
}
 
if(
m=="position3"){

vector translation=<-2.547502.093482.02570>;

llSetPrimitiveParams([6translation]);
}

if(
m=="position4"){

vector translation=<3.014683.093483.02570>;

llSetPrimitiveParams([6translation]);

}
  }
  } 
L'autre les rotations (relatives au prim root):

Code PHP:

default
{
on_rez(integer r)
{
    
    
llResetScript();
    }
link_message(integer sinteger nstring mkey id)

{
   
    
if(
m=="position0")
{
llSetLocalRot(<0.000000.000000.000001.00000>);
}
 
if(
m=="position1")
{
llSetLocalRot(<0.000000.366500.000000.93042>);
}
 
if(
m=="position2")
{
llSetLocalRot(<0.250370.008440.002180.96811>);
}
  
if(
m=="position3")
{
llSetLocalRot(<0.200250.150520.557070.79178>);
}

if(
m=="position4")
{
llSetLocalRot(<0.400250.550520.557070.69178>);
}
 
  }
  } 
A toi de changer les translations/rotations selon tes besoins et de multiplier les "positions" si nécessaire: ce n'est qu'un exemple avec 5 positions.

Maintenant, un script "play on touch" que tu mets dans le root:

Code PHP:

float delai=0.5;


default
{
    
on_rez(integer r)
    {
        
llResetScript();
        }
        
    
state_entry(){
        
llMessageLinked(LINK_SET,2,"position0","");  
    }

    
touch_start(integer total_number)
    {
    
llMessageLinked(LINK_SET,2,"position1","");  
    
llSleep(delai);
    
llMessageLinked(LINK_SET,2,"position2","");
     
llSleep(delai);
    
llMessageLinked(LINK_SET,2,"position3","");
         
llSleep(delai);
      
llMessageLinked(LINK_SET,2,"position4","");     
       
llSleep(delai);
    
llMessageLinked(LINK_SET,2,"position0","");   
   
      
llResetScript();
    }
    

Il ne te reste qu'à porter ton objet, cliquer sur lui quand tu veux actionner le mouvement.

Je ne sais pas du tout si ce genre d'"animation" correspond à ce que tu veux faire (et je suppose qu'il existe une façon moins laborieuse de l'écrire).

Dernière modification par Worstbobo ; 21/08/2014 à 15h16.
Si si c'est bien comme cela que je souhaite le faire

Mais pour obtenir un effet "crédible" qui faut que l'objet apparaisse et démarre son mouvement dans la main (ou tête ou etc.) de l'avatar !
Et c'est là la difficulté puisque au même instant l'avatar peut avoir les mains en l'air dans le viewer de Pierre et les avoir croisées dans celui de Paul...
Par contre si il est possible de synchroniser les anims c'est peut être jouable
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés