Pas tout a fait .
Cela dépend :
- si tu travailles en physique ou non
- si ton objet est un linkset , si ton script est dans la prim root ou non
Exemple pour faire tourner autour de l axe local X pour une prim simple non liée
L objet est orienté initialement à des coordonnées Eulers de rotation <90,30,27>
En physique tu fairais
llTargetOmega( <1,0,0>, PI, 1.0);
exemple :
integer tourne = FALSE;
default
{
state_entry()
{
// desactive la gravite
llSetPhysicsMaterial(GRAVITY_MULTIPLIER , 0.0,0.0,0.0,0.0);
llSetStatus(STATUS_PHYSICS, TRUE);
}
touch_end(integer n)
{
if( tourne = !tourne )
{
// on arrete le mouvement
llTargetOmega(ZERO_VECTOR, 0, 1.0);
llSetStatus(STATUS_PHYSICS, FALSE);
// on se repositionne aux coordonnes de rotation intiale de l objet
llSetRot(llEuler2Rot(<90,30,27>*DEG_TO_RAD));
// on active la rotation suivant l axe X local
llSetStatus(STATUS_PHYSICS, TRUE);
llTargetOmega( <1,0,0>, PI, 1.0);
}
else
{
// on arrête le mouvement
llTargetOmega(ZERO_VECTOR, 0, 1.0);
}
}
}
en non-physique tu fairais
llTargetOmega(llRot2Fwd(llGetLocalRot()), PI, 1.0);
exemple
integer tourne = FALSE;
default
{
state_entry()
{
llSetStatus(STATUS_PHYSICS, FALSE);
}
touch_end(integer n)
{
if( tourne = !tourne )
{
llTargetOmega(ZERO_VECTOR, 0, 1.0);
llSetRot(llEuler2Rot(<90,30,27>*DEG_TO_RAD));
llTargetOmega(llRot2Fwd(llGetLocalRot()), PI, 1.0);
}
else
{
llTargetOmega(ZERO_VECTOR, 0, 1.0);
}
}
}
Si ton objet avait 2 prims , que la prim root n etait pas alignée avec les axes du monde mais a des coordonnées d eulers e <90,30,27>,
que ta seconde prim n était pas alignée avec la prim root ( par exemple avec une rotation locale en Y <0,45,0> par rapport à la prim root )
et que tu voulais tourner la seconde prim autour de son axe local X , tu fairais ,
avec un script dans la prim root :
llSetLinkPrimitiveParamsFast( 2, [ PRIM_OMEGA,
llRot2Fwd(llList2Rot(llGetLinkPrimitiveParams(2 , [ PRIM_ROT_LOCAL ]) ,0 ) )
, PI,1.0 ]);
Exemple :
integer tourne = FALSE;
default
{
state_entry()
{
llSetStatus(STATUS_PHYSICS, FALSE);
}
touch_end(integer n)
{
if( tourne = !tourne )
{
llSetLinkPrimitiveParamsFast( 2, [ PRIM_OMEGA, ZERO_VECTOR, 0.0 ,1.0 ]);
// le script est dans la prim root , donc on tourne l objet en entier de <90,30,27> pour l orientation initiale
llSetLocalRot(llEuler2Rot(<90,30,27>*DEG_TO_RAD));
// la seconde prim fait un angle de 45 degres sur l axe local Y par rapport à la prim root
llSetLinkPrimitiveParamsFast(2 , [ PRIM_ROT_LOCAL, llEuler2Rot(<0,45,0> * RAD_TO_DEG ) ] );
llSetLinkPrimitiveParamsFast( 2, [ PRIM_OMEGA,
llRot2Fwd(llList2Rot(llGetLinkPrimitiveParams(2 , [ PRIM_ROT_LOCAL ]) ,0 ) )
, PI,1.0 ]);
}
else
{
llSetLinkPrimitiveParamsFast( 2, [ PRIM_OMEGA, ZERO_VECTOR, 0.0 ,1.0 ]);
}
}
}