llTargetOmega : une vraie explication

Répondre
Partager Rechercher
Bonjour à tous,

je scripte depuis peu mais après trois jours entier à apprendre...
Je me trouve devant un probleme, je veux faire pivoter un objet enfant (child prim) suivant l'axe de l'objet parent (root prim) porté par l'avatar(donc pas physique).
1. Est ce possible avec llTargetOmega ?

2. Meme après avoir lu plusieurs wiki en anglais, le fonctionnement de cette fonction me laisse perplexe. Je voudrais savoir si il y a un wiki en en francais, ou sa description (surtout celle des arguments).

3. Si 1.=oui faut il utiliser la fonction dasn le prim maitre ou esclave ? Avec un llMessageLinked ou autre ?
Une réponse simple : pour ton objet enfant, avec llTargetOmega tu ne peux le faire tourner que par rapport à ses axes locaux, en aucun cas par rapport aux axes de son parent. Conclusion : ce n'est pas la bonne fonction à utiliser et tu dois passer par llSetRot.

Mais il faut bien comprendre la différence entre les deux. Avec llTargetOmega la rotation est permanente et calculée sur le client, alors que llSetRot est une commande de rotation unique calculée sur le serveur. Avec llTargetOmega on a une rotation fluide mais déconnectée de ce qui se passe sur le serveur, ce qui n'est pas sans poser un certain nombre de problèmes. Avec llSetRot on a une ortation sacadée mais que tous les utilisateurs de SL partagent.

En ce qui concerne les arguments de llTargetOmega ce n'est pas bien compliqué :
  1. l'axe autour duquel on veut la rotation, par exemple avec <1,0,0> on tourne autour de l'axe X,
  2. la vitesse angulaire en radians par seconde (avec 0 on arrête le mouvement), mais attention à bien normaliser le vecteur qui représente l'axe avec llVecNorm pour ne pas avoir des surprises au niveau de la vitesse de rotation qui est en fait le produit entre le vecteur de l'axe et l'argument de vitesse angulaire,
  3. la force de la rotation qui ne concerne que les objets "physiques"
Il faut aussi préciser que llTargetOmega réserve des surprise, il suffit de faire une recherche avec llTargetOmega et bug sur les forums de SL pour avoir une foule de réponses
Merci beaucoup, je vais chercher de ce coté la.

(plus tard) J'ai cherché et je suis perplexe. llLookAt sert à definir un point comme repere ? llRotLookAt agit apparement comme llSetRot (mon objet est attaché).
Les paramètres servent à quoi ? J'ai l'impression qu'il y en a trop.
maintenant je le sais.
Finalement je n'ai pas trouvé de moyen d'y arriver donc j'utilise llSetLocalRot() et llSetPos() juste après. Ca n'est pas si moche mais je pense qu'avec une boucle ce serait mieux mais la je dois aller dormir.
Peux tu preciser ce que tu veux faire exactement ?

Car, si ton but est de faire tourner une child prim autour de sa root prim, tu peux sans probleme utiliser lLTargetOmega dans le ROOT prim

Cdlt
Laurent
oui, mais l'axe de rotation est placé au centre du prim child, je voudrais qu'il se trouve au bout du prim child, sachant que je ne peux pas le couper (flexible).
Voila.
mhhh
Je suis neswbie, c'est peut etre un peu bete mais :

tu as un prim A lié a un prim B(root)

Sinon B fait une rotation, l'objet A va bouger avec lui, autour de l'axe de B ?
apres, si tu veux que B semble immobile, un llTargetOmega de (- angle) ca devrais le faire nan ?

Pour faire dans le trash : je pense que les quaternions servent a ca, quand a savoir comment ca marche ces machins ?
(ca me rappelle les torseurs de méca et autre matrices a la con)
Les Quaternions, quelle jolie bête ce truc là

Non sérieux c'est un outil magnifique pour l'infographie 3D
En gros dans SL (et en général) sa permet de calculer les trajectoire d'objet dans l'espace.

Exemple : Je veux que mon cube avance de 1m vers l'avant... (ben oui avec les angle dans un système euclidien c'est chaud de positionner en 3D le point qui se situe 1 m devant l'objet suivant un angle par rapport au 3 axes X,Y,Z..) alors qu'avec les quaterions, il suffit de multiplier un vecteur distance par la rotation (quaternion) de l'objet pour qu'il sache de suite où est la nouvelle position.

Exemple concret avec :

* llSetPos -> Définit la position de l'objet
* llGetPos -> Récupère la position
* llGetRot -> Récupère la rotation de l'objet

donc si je fais ceci : llSetPos(llGetPos()+<1,0,0>*llGetRot());
Mon objet ce déplacera de 1m selon son orientation.

CQFD - N'oubliez pas j'ai des actions chez UBSA donc l'aspirine est votre ami
D'après ton exemple, il avance de 1m sur x par rapport à sa position actuelle.
mais si je prends le vecteur <0.1,0.1,0> avec une rotation à 45° avec un timer à une seconde

il va tourner mais par rapport à quel centre? un point placer à 0.1 de sa position?
non son centre toujours^^

Si tu veux faire des rotation sans prim root affecté d'un llTargetOmega c'est possible... pour ça il suffit de lui inventer un centre imaginaire et de tourner autour via justement le llSetPos et le quaternion
Ben justement c'est ce que je veux faire.
mettre mon cube à un endroit, je le touche et il se souvient de sa position llgetpos()

et je le place ailleur et il tourne autour de ce point défini.

J'ai l'impression que je suis pas loin avec ce que tu me dis, mais en même temps tu m'embrouilles
Mat, je trouve que tu compliques avec tes quaternions ^^ J'utilise directement les fonctions LSL prévues pour !

Pour tourner de angle (en degrés) sur l'axe (vecteur) axe :

Code PHP:

llSetRot(llAxisAngle2Rot(vector axefloat angle*DEG_TO_RAD) * llGetRot()); 

Pour avancer de metres dans le sens forward et l'orientation actuelle de l'objet :

Code PHP:

llSetPos(llGetPos() + (llRot2Fwd(llGetRot()) * integer metres)); 

hth
J'ai une idée pour faire tourner en rond mon cube
Je le touch et je sauvegarde sa pos et sa rot qui sera mon centre imaginaire

je déplace mon cube sur le chemin qu'il doit faire
re touch dans un nouvel etat et la il calcul les offset de rot et de de pos
et sur timer il me reste plus que à :
changer la rot de mon centre imaginaire et de recalculer la pos et la rot de mon cube avec l'offset

ca doit bien marché ca

/me trop hate de tester ca ce soir
Peut etre qu'il manque des elements mais ta ligne elle fait juste un changement de pose, il n'y a aucune rotation. Si ?

je vois pas l'utilité en fait. J'ai essayé et l'objet fait juste une décalage de pose (lorsque j'execute le script en portant l'objet);
llSetPos(llGetPos()+<1,0,0>*llGetRot());

Bon le llLookAt(), on m'en avait mais je vois pas le comment l'utiliser AVEC la rot, il faut utiliser llRotLookAt() ? ou simplement llSetLocalRot apres le llLookAt().
Répondre

Connectés sur ce fil

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