GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: nds84 le 22 Octobre 2008, 13:51:54

Titre: Rotation Object
Posté par: nds84 le 22 Octobre 2008, 13:51:54
Bonjour,
Je voudrais faire une rotation d'un object comme sa :


Comment faire ?
Merci
Titre: Re : Rotation Object
Posté par: Nikko™ le 22 Octobre 2008, 16:35:35
Je pense que ce n'est pas possible.

++
nikko
Titre: Re : Rotation Object
Posté par: Dark_revan le 22 Octobre 2008, 16:52:06
Si j'ai vu sur un serveur sa. c'était le mien Xd.Enfin bref et je crois que je ne l'ai plus se systeme si je le trouve je vous le dit mais attention sa bug defois donc ses chaud a faire.
EDIT voila de l'aide.

SetObjectRot(pdgateSF2, 0.0000, 90.0000, 270.0000);
tu renomme le pdgate a ton create object et voila.
Titre: Re : Rotation Object
Posté par: nds84 le 22 Octobre 2008, 17:19:16
merci :) je test
Titre: Re : Rotation Object
Posté par: Nikko™ le 22 Octobre 2008, 19:25:40
ah ben je savais pas tien :)

++
nikko
Titre: Re : Rotation Object
Posté par: nds84 le 22 Octobre 2008, 19:35:13
Pour moi sa ne marche pas
Titre: Re : Rotation Object
Posté par: Azz45 le 22 Octobre 2008, 19:40:00
Moi aussi je l'ai ...

Mais le souci es que sa ne fait pas sa , moi sa monte doucement :)
et sa se bloque en haut puis sa redescend doucement :)

C'est joli  :lock
Titre: Re : Rotation Object
Posté par: [StAfF]MaN le 22 Octobre 2008, 20:24:48
C'est avec un moveobject c'est pour ça ^^ La ton rotate ne sert a rien, utilise les MoveObject ;) Tu as ta position initiale (barrière en bas) tu créé un autre objet en position haut, tu sauvegarde, et tu prend les positions des deux objet, initiale et haut, et après tu met dans un MoveObject.
Titre: Re : Rotation Object
Posté par: MrFredo le 22 Octobre 2008, 20:41:19
Sa ne marchera pas avec un MoveObject car le move objet ne prend pas encore la rotation il ne prend en compte que les coordoné X,Y et Z , pour faire une simulation de rotation il faut paser par un timer qui augmenter la rotation de l'objet tout les 500ms par exemple
Titre: Re : Rotation Object
Posté par: Dark_revan le 22 Octobre 2008, 21:26:55
Oui ses vrai j'est essayer avec un moveobject sa fesait nymp
Titre: Re : Rotation Object
Posté par: dylle76620 le 22 Octobre 2008, 21:50:34
je n'arrive toujours pas a faire la rotation, aidez moi svp
Titre: Re : Rotation Object
Posté par: Dark_revan le 23 Octobre 2008, 06:21:35
Bah ses plus compliquer qu'on le croit la rotation.
PS : je regarderai au soir la je doit aller en cour.

++
Titre: Re : Re : Rotation Object
Posté par: Syg le 23 Octobre 2008, 11:10:54
Sa ne marchera pas avec un MoveObject car le move objet ne prend pas encore la rotation il ne prend en compte que les coordoné X,Y et Z , pour faire une simulation de rotation il faut paser par un timer qui augmenter la rotation de l'objet tout les 500ms par exemple

Oui, c'est la seule solution par contre, le timer de 500 ms est peu long, je dirais plutôt 50 ms.
500 ms -> 2 images par secondes (donc des saccades)
50 ms -> 20 images par secondes (pas super top mais beaucoup plus fluide quand même, par contre, gourmand en ressource)

Pour faire ça, on commence par faire comme [StAfF]mAn à dit pour déterminer les positions de départ et d'arrivée.
On se retrouve donc 2 sextuplets : (Xd, Yd, Zd, Axd, Ayd, Azd) et (Xa, Ya, Za, Axa, Aya, Aza).
X, Y, Z sont les coordonées de l'objet (d=départ, a=arrivée)
Ax, Ay, Az sont les angles selon les axes X, Y et Z (d=départ, a=arrivée).


Si l'on veut que notre barrière s'ouvre (on se ferme) en 3 secondes avec un timer de 50 ms, il faudra  3*20 images=60 images=60 pas.

Pour chaque couple (Xd, Xa), (Yd, Ya), ... (Azd, Aza) on calcul la valeur de chaque pas :
PasX = (Xa-Xd)/60
PasY = (Ya-Yd)/60
...
PasAz = (Aza-Azd)/60

Nb : Ces valeurs peuvent être négatives

Ensuite, on lance notre timer 60 fois et à chaque fois on incrémente les données de la valeur du pas correspondant :
X = Xd + PasX * IndexDuPas
Y = Yd + PasY * IndexDuPas
..
Az = Aza + PasAz * IndexDuPas

Et on affiche l'objet en (X, Y, Z, Ax, Ay, Az)

Tout ceci fait beaucoup de données mais on peut en pré-calculer la plupart sur le papier et les mettre en dur dans le script.
Je vous laisse mettre tout ça en place.

++
Syg
Titre: Re : Rotation Object
Posté par: [StAfF]MaN le 23 Octobre 2008, 11:49:20
le maitre a parlé  :laugh
Titre: Re : Rotation Object
Posté par: Nikko™ le 23 Octobre 2008, 14:22:24
Cest hard a faire quand meme ...

++
nikko
Titre: Re : Rotation Object
Posté par: cristab le 23 Octobre 2008, 15:55:46
perso je me lancerai pas ladedans moi ^^
Titre: Re : Re : Rotation Object
Posté par: Nikko™ le 23 Octobre 2008, 16:27:27
perso je me lancerai pas ladedans moi ^^

S'il en est capable ....

++
nikko
Titre: Re : Re : Re : Rotation Object
Posté par: vincentdu90 le 23 Octobre 2008, 19:07:22
Oui, c'est la seule solution par contre, le timer de 500 ms est peu long, je dirais plutôt 50 ms.
500 ms -> 2 images par secondes (donc des saccades)
50 ms -> 20 images par secondes (pas super top mais beaucoup plus fluide quand même, par contre, gourmand en ressource)

Pour faire ça, on commence par faire comme [StAfF]mAn à dit pour déterminer les positions de départ et d'arrivée.
On se retrouve donc 2 sextuplets : (Xd, Yd, Zd, Axd, Ayd, Azd) et (Xa, Ya, Za, Axa, Aya, Aza).
X, Y, Z sont les coordonées de l'objet (d=départ, a=arrivée)
Ax, Ay, Az sont les angles selon les axes X, Y et Z (d=départ, a=arrivée).


Si l'on veut que notre barrière s'ouvre (on se ferme) en 3 secondes avec un timer de 50 ms, il faudra  3*20 images=60 images=60 pas.

Pour chaque couple (Xd, Xa), (Yd, Ya), ... (Azd, Aza) on calcul la valeur de chaque pas :
PasX = (Xa-Xd)/60
PasY = (Ya-Yd)/60
...
PasAz = (Aza-Azd)/60

Nb : Ces valeurs peuvent être négatives

Ensuite, on lance notre timer 60 fois et à chaque fois on incrémente les données de la valeur du pas correspondant :
X = Xd + PasX * IndexDuPas
Y = Yd + PasY * IndexDuPas
..
Az = Aza + PasAz * IndexDuPas

Et on affiche l'objet en (X, Y, Z, Ax, Ay, Az)

Tout ceci fait beaucoup de données mais on peut en pré-calculer la plupart sur le papier et les mettre en dur dans le script.
Je vous laisse mettre tout ça en place.

++
Syg

 :blink
Franchement Syg tu as réponse a tout .
Je me met a genou devant toi "Ohh grand Syg "  :angelnot

 :lmao
 :dejadehors
Titre: Re : Rotation Object
Posté par: Dark_revan le 23 Octobre 2008, 19:18:07
Encore un lecon de syg mais moi mon systeme est plus simple et marche.
MAsi j'avoue que c'est long desoler j'ai pas trop le temps.
Titre: Re : Re : Rotation Object
Posté par: Syg le 23 Octobre 2008, 23:16:58
Encore un lecon de syg mais moi mon systeme est plus simple et marche.
MAsi j'avoue que c'est long desoler j'ai pas trop le temps.

Et c'est exactement ce qu'il faut chercher à faire.
Je ne donnais là qu'une solution générique qui marche dans tous les cas.
Dans le cas d'une rotation simple (X, Y, Z constants donc avec PasX, PasY et PasZ = 0) et sur un seul axe (Ax at Ay constants donc PasAx et PasAy = 0), les calculs deviennent vite très simples aussi.

Et c'est encore plus simple dans le cas d'une translation (déplacement rectiligne) car la fonction MoveObject fait tout pour nous.

Voici un très petit exemple de ce qu'on peu faire avec la méthode dont a parlé mister-fred et quelques notions sur les courbes paramétrées :
/* Le tonneau qui tourne */
new Barrel;
forward BarrelTurn ();
new Float:Ax=0.0, Float:Ay=0.0, Float:Az=0.0;
new Float:BX=0.0, Float:BY=0.0, Float:BZ=0.0;
new Float:T;

public OnGameModeInit ()
{
/* Le tonneau qui tourne au dessus du skate park à Los Santos */
Barrel = CreateObject (1225, 1912.0, -1390.0, 15.5, 0.000000, 0.000000, 0.000000);

/* On demarre un timer pour le tonneau qui tourne */
SetTimer ("BarrelTurn", 20, true);
}

/* Fonction de timer pour faire tourner le tonneau */*
public BarrelTurn ()
{
/* Les angles */
Ax += 1.0;
Ay += 1.5;
Az += 2.0;

/* On repasse par l'origine */
if (Ax == 360.0) Ax = 0.0;
if (Ay == 360.0) Ay = 0.0;
if (Az == 360.0) Az = 0.0;
SetObjectRot (Barrel, Ax, Ay, Az);

/* La position de l'objet */
T += 2.0;
if (T > 360.0) T=T-360.0;
BX = 1912.0 + 2.0 * floatcos (2.0*T, degrees);
BY = -1390.0 + 2.0 * floatsin (3.0*T, degrees);
BZ = 15.5;
SetObjectPos (Barrel, BX, BY, BZ);
}

Le jeu consiste à toucher le tonneau avec une moto (c'est possible et si on réussi, on le sait tout de suite .... BOUM !!).

++
Syg