Un petit problème de rotation qui laisse perplexes ceux qui abordent pour la première fois les rotations dans les objets de plus d'une prim
Si l'on modifie la rotation de la prim parent de l'objet, tout l'objet tourne ; il arrive qu'il ne faut faire tourner qu'une prim enfant, le reste de l'objet demeure immobile

 

//Soit une prim enfant ayant au départ une rotation : <90.0,295.0,0.0>, en degrès
//On doit lui ajouter une rotation de <-59.7,31.95,17.65>, en degrès
//Comment le faire sans faire pivoter tout l'objet, seule la prim enfant doit tourner

vector vRot_Dep = <90.0, 295.0, 0.0>; // rotation de départ de la prim
vector vRot_Add = <-59.7, 31.95, 17.65>; //rotation additionnelle
default
{
state_entry()
{
//Donner à la prim enfant sa rotation de départ
llSetLocalRot(llEuler2Rot(vRot_Dep * DEG_TO_RAD));
}

touch_start(integer total_number)
{
//Relever la rotation actuelle
vector vRot_Actuelle = llRot2Euler(llGetLocalRot()) * RAD_TO_DEG;

//Additionner les rotations à faire
//il y a différente manière de le faire
//1) on additionne élément par élément
vRot_Actuelle.x = vRot_Actuelle.x + vRot_Add.x;
vRot_Actuelle.y = vRot_Actuelle.y + vRot_Add.y;
vRot_Actuelle.z = vRot_Actuelle.z + vRot_Add.z;

//2) On fait une addition de vecteur
vRot_Actuelle = vRot_Actuelle + vRot_Add;

//3) on incrémente le vecteur d'origine
vRot_Actuelle += vRot_Add;

//Version pro : incorporer l'addition à la mise en oeuvre de la rotation
llSetLocalRot(llEuler2Rot((vRot_Actuelle + vRot_Add) * DEG_TO_RAD));
}
}

 

 


Créer un premier cube, le teindre en rouge
Créer un deuxième cube, le teindre en vert
Sélectionner et lier les 2 cubes en sélectionnant le rouge en dernier
Le cube rouge est la prim parent, la cube vert est la prim enfant
Placer le script dans le contenu de la prim verte
Donner une rotation quelconque à l'objet et cliquer
A chaque click, la prim verte tourne indépendamment de la prim rouge


 

Messages 

 
#2 Barbidule 2009-04-28 16:32 bon, ben voila un truc que je trouve utile avec les rotations de prim enfant :
key k = llGetLinkKey(num_prim);
rotation localRot = llList2Rot(llGetObjectDetails(k,[OBJECT_ROT]),0);

avec ça on a la rotation d'un prim enfant connaissant son numéro. a partir de laquelle on peut calculer une nouvelle rotation (il vaut mieux bosser avec des rotations plutôt que des vecteurs, a moins de réellement vouloir des effets indésirables ^^), a combiner en général avec la rotation du prim parent, je ne m'étend pas plus sur le sujet, la littérature sur les rotations 3d est déjà assez lourde ^^
 
 
 
#1 Barbidule 2009-04-22 13:36 hello,
j'ai un petit doute sur les methodes d'addition des rotations… c'est vrai qu'il y a de quoi avoir des migraines. Je posterai + tard une version perso pour avoir un llGetChildRot(numLink)…

(en fait je teste le forum du site que je viens de découvrir :)