Rotation a ignorer.

Répondre
Partager Rechercher
Bonjour tout le monde !

- Je tente de faire un script de mobile avec une programmation du parcours facile , je suis content du résultat, dans mon cas le mobile s'oriente vers la bonne direction avant d'effectué son déplacement (logique en même temps ) sauf que je n'arrive pas a lui faire ignorer une orientation en cas de changement d'altitude donc sur l'axe Z , je souhaite donc que le mobile reste " a plat ".

- A grand coup de wiki et consultation de forum j'ai compris ( je pense ...) que mon script utilise "llRot2Fwd" alors que je dois composer avec "llRot2Left" , "llRot2Up" et de lui imposé une rotation nulle dans le cas de "llRot2Up" , mais alors la ....je n'y arrive pas du tout .

voila mon script :

Code PHP:

integer input =-10112018
float VITESSEdeplacement = 3.0; //temps en seconde pour exécuter chaque étape du déplacement
float VITESSErotation = 1.0; // temps en seconde pour effectuer la rotation du mobile vers le prochain déplacement
// les listes rawoffsets sont représenté sur la x, y, z donc : list rawOffsets = [ <x,y,z> ...
list rawOffsets =
[
<7.0,0.0,0.0>
,<0.0,4.0,2.0>
,<0.0,4.0,-2.0>
];
vector posBase = ZERO_VECTOR;
rotation rotBase = ZERO_ROTATION;
object_move_to(vector position)
{
vector last;
do {
last = llGetPos();
llSetPos(position);
} while ((llVecDist(llGetPos(),position) > 0.001) && (llGetPos() != last));
}
vector U;
vector V;
default
{
state_entry()
{
llListen(input,"","","");
}
listen(integer channel, string name, key id, string message)
{
if(message == "on")
{
posBase = llGetPos();
posBase = llGetPos();
rotBase = llGetRot();
llLoopSound("cee4669b-bd83-50aa-fafd-aae5fd12bf0a",0.3);
list kfmList;
U = llRot2Fwd( llGetRot());
integer offsetIdx;
integer offsetCount = llGetListLength(rawOffsets);
while (offsetIdx < offsetCount)
{
V = llList2Vector(rawOffsets, offsetIdx++) * llGetRot();
kfmList += [ ZERO_VECTOR, llRotBetween( U, V), VITESSErotation];
kfmList += [V, ZERO_ROTATION, VITESSEdeplacement];
U = V;
}
kfmList += [ ZERO_VECTOR, llRotBetween( U, llRot2Fwd( llGetRot())), 1.0];
llSetKeyframedMotion( kfmList, []);
}
}
moving_end()
{
/*llParticleSystem(
[
PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_EXPLODE,
PSYS_SRC_BURST_RADIUS,0,
PSYS_SRC_ANGLE_BEGIN,0,
PSYS_SRC_ANGLE_END,0,
PSYS_SRC_TARGET_KEY,llGetKey(),
PSYS_PART_START_COLOR,<1.000000,0.000000,0.000000>,
PSYS_PART_END_COLOR,<1.000000,1.000000,1.000000>,
PSYS_PART_START_ALPHA,1,
PSYS_PART_END_ALPHA,1,
PSYS_PART_START_GLOW,0,
PSYS_PART_END_GLOW,0,
PSYS_PART_BLEND_FUNC_SOURCE,PSYS_PART_BF_SOURCE_ALPHA,
PSYS_PART_BLEND_FUNC_DEST,PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA,
PSYS_PART_START_SCALE,<4.000000,0.331000,0.000000>,
PSYS_PART_END_SCALE,<0.331000,4.000000,0.000000>,
PSYS_SRC_TEXTURE,"0cf2d616-3481-bc01-9ef0-88d31c8cd52c",
PSYS_SRC_MAX_AGE,0,
PSYS_PART_MAX_AGE,0.3,
PSYS_SRC_BURST_RATE,0,
PSYS_SRC_BURST_PART_COUNT,44,
PSYS_SRC_ACCEL,<0.000000,0.000000,0.000000>,
PSYS_SRC_OMEGA,<0.000000,0.000000,0.000000>,
PSYS_SRC_BURST_SPEED_MIN,4.1,
PSYS_SRC_BURST_SPEED_MAX,4.7,
PSYS_PART_FLAGS,
0 |
PSYS_PART_EMISSIVE_MASK |
PSYS_PART_FOLLOW_VELOCITY_MASK |
PSYS_PART_INTERP_COLOR_MASK |
PSYS_PART_INTERP_SCALE_MASK |
PSYS_PART_RIBBON_MASK
]);*/
object_move_to(posBase);
llSetRot(rotBase);
}
Code PHP:


Merci d'avance de votre aide !

Dernière modification par mappa story ; 14/11/2018 à 10h35.
Citation :
Publié par black cats
Je n'ai pas regardé ton script en détail, mais ces deux discussions pourraient peut-être aider à faire avancer le schmilblick
https://forums.jeuxonline.info/showthread.php?t=1250278
https://forums.jeuxonline.info/showthread.php?t=1210755
je pense que le probléme vien de "U = llRot2Fwd( llGetRot());" mais pour que mon mobile reste bien a plat je ne pige pas comment faire
Citation :
Publié par mappa story
- Je tente de faire un script de mobile avec une programmation du parcours facile , je suis content du résultat, dans mon cas le mobile s'oriente vers la bonne direction avant d'effectué son déplacement (logique en même temps https://jolstatic.fr/forums/jol/images/smilies/lol.gif ) sauf que je n'arrive pas a lui faire ignorer une orientation en cas de changement d'altitude donc sur l'axe Z , je souhaite donc que le mobile reste " a plat ".
Soit .. tu veux que ton mobile reste à plat .
Or tu as déjà 4 points dans ton trajet :

le point où l objet est
le point où l objet est auquel on ajoute l offset <7.0,0.0,0.0>
,le point où l objet est auquel on ajoute l offset <0.0,4.0,2.0> + <7.0,0.0,0.0> = <7,4,2>
,le point où l objet est auquel on ajoute l offset <0.0,4.0,-2.0> + <0.0,4.0,2.0> + <7.0,0.0,0.0> = <7,8,0>


Or ces 4 points ne se retrouvent pas dans le même plan ( que ce soit un plan incliné ou non )
<0,0,0> <7,0 ,0>, <7,4,2>, <7,8,0> ne sont pas coplanaires ,
Donc premier problème

Car classiquement , pour avoir un rendu harmonieux , les rotations se font autour de l axe normal ( orthogonal si tu préfères ) au plan dans le quel tu veux que l objet se déplace
Supposons par exemple que tu veille forcer les rotations autour de l axe Z régional :,
mais tout en gardant tes translations actuelles qui ne sont pas coplanaires :
c est réalisable mais l observateur sera titillé par le mouvement , le trouvant non "naturel", ressemblant plus au mouvement des mongolfières

Si tu veux que ton objet gravisse 3 pentes , alors ce n est pas un mouvement plat , mais un mouvement successif sur 3 plans avec un pivotage entre chaque intersection de plan

Dernière modification par redpurple ; 16/11/2018 à 16h56.
Citation :
Publié par redpurple
Soit .. tu veux que ton mobile reste à plat .
Or tu as déjà 4 points dans ton trajet :

le point où l objet est
le point où l objet est auquel on ajoute l offset <7.0,0.0,0.0>
,le point où l objet est auquel on ajoute l offset <0.0,4.0,2.0> + <7.0,0.0,0.0> = <7,4,2>
,le point où l objet est auquel on ajoute l offset <0.0,4.0,-2.0> + <0.0,4.0,2.0> + <7.0,0.0,0.0> = <7,8,0>


Or ces 4 points ne se retrouvent pas dans le même plan ( que ce soit un plan incliné ou non )
<0,0,0> <7,0 ,0>, <7,4,2>, <7,8,0> ne sont pas coplanaires ,
Donc premier problème

Car classiquement , pour avoir un rendu harmonieux , les rotations se font autour de l axe normal ( orthogonal si tu préfères ) au plan dans le quel tu veux que l objet se déplace
Supposons par exemple que tu veille forcer les rotations autour de l axe Z régional :,
mais tout en gardant tes translations actuelles qui ne sont pas coplanaires :
c est réalisable mais l observateur sera titillé par le mouvement , le trouvant non "naturel", ressemblant plus au mouvement des mongolfières

Si tu veux que ton objet gravisse 3 pentes , alors ce n est pas un mouvement plat , mais un mouvement successif sur 3 plans avec un pivotage entre chaque intersection de plan
"ressemblant plus au mouvement des mongolfières" le voila l'idée de mouvement justement , je ne compte pas faire une mongolfière mais un déplacement dans le style.
Si tu veux tourner "à plat", il faut projeter les vecteurs U et V dans le plan horizontal avant de chercher la rotation entre les deux.
Attention : la fonction llRotBetween impose de normaliser au préalable les deux vecteurs.

Tu peux faire un fonction de rotation à plat :
Code:
rotation rotH(vector Vu, vector Vv)
{
Vu.z = 0.0;
Vv.z = 0.0;
return llRotBetween(llVecNorm(Vu),llVecNorm(Vv));
}
Ensuite tu remplaces llRotBetween dans ta kfmlist :
Code:
if(message == "on")
{
posBase = llGetPos();
posBase = llGetPos();
rotBase = llGetRot();
llLoopSound("cee4669b-bd83-50aa-fafd-aae5fd12bf0a",0.3);
list kfmList;
U = llRot2Fwd( llGetRot());
integer offsetIdx;
integer offsetCount = llGetListLength(rawOffsets);
while (offsetIdx < offsetCount)
{
V = llList2Vector(rawOffsets, offsetIdx++) * llGetRot();
kfmList += [ ZERO_VECTOR, rotH( U, V), VITESSErotation];
kfmList += [V, ZERO_ROTATION, VITESSEdeplacement];
U = V;
}
kfmList += [ ZERO_VECTOR, rotH( U, llRot2Fwd( llGetRot())), 1.0];
llSetKeyframedMotion( kfmList, []);
}
Répondre

Connectés sur ce fil

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