• 24 Avril 2025, 00:31:32


Auteur Sujet: Rotation Object  (Lu 2694 fois)

0 Membres et 2 Invités sur ce sujet

Hors ligne cristab

  • *
  • Messages: 8379
    • Voir le profil
Re : Rotation Object
« Réponse #15 le: 23 Octobre 2008, 15:55:46 »
perso je me lancerai pas ladedans moi ^^
pas d'aide en PM, vous êtes sur un forum est il me semble que vous êtes la pour avoir de l'aide donc pourquoi MP une seul personne qui ne vous répondra pas alors qu'il y a plein de membre ici

Hors ligne Nikko™

  • *
  • Mafioso
  • Messages: 2393
    • Voir le profil
Re : Re : Rotation Object
« Réponse #16 le: 23 Octobre 2008, 16:27:27 »
perso je me lancerai pas ladedans moi ^^

S'il en est capable ....

++
nikko

vincentdu90

  • Invité
Re : Re : Re : Rotation Object
« Réponse #17 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

Hors ligne Dark_revan

  • Serveur RPG : *¤REAL DREAM¤*
  • *
  • Bandit
  • Script Serveur RolePlay.
  • Messages: 338
    • Voir le profil
Re : Rotation Object
« Réponse #18 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.

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Re : Rotation Object
« Réponse #19 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
Courtesy of GtaManiac