GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: chneuls le 21 Octobre 2010, 14:13:13
-
Jour', :D
Alors voila pour mon système de caravane, j'utilise une fonction similaire à celle ci ( Celle ci est de Sasuke)
GetXYFrontOfAngle( &x, &y, angle, distance )
{
x += distance * floatsin( -angle, degrees );
y += distance * floatcos( -angle, degrees );
}
Mais je me suis rendu compte que de chercher le Z en fonction de la velocité de la voiture, et de l'ajouter a l'objet etc.. ça rendez pas terrible.
Comment avoir le Z ? via cette formule là.
J'ai chercher un peu sur internet et l'orientation vectorielle dans l'espace c'étais un peu compliqués, mais j'ai rien trouvé sur ce sujet.
Merci de votre aide.
:cheers
-
Hum je pense qu'il que tu utilise les tangente pour trouve la position ^^
-
Si on résonne sur la logique, je pense comme toi. Mais j'sais pas ^^
Ben j'vais tester et on verra bien ;)
Encore mieux :)
J'vais demander à mon prof d'étude de construction, c'est une bête en math..etc.. ^^
Et comme tout ce qui touche les vecteurs et son domaine d'enseignement, ben il saura :p
Merci quand même, j'te tiens au courant ^^
-
Pas du tout, c'est encore un sin ou un cos mais avec un autre angle.
En 2D, un seul angle et une distance suffise à positionner un point dans le plan.
En 3D, il faut 2 angles et une distance mais il est impossible de les avoir dans SAMP (il n'y a pas les fonctions pour).
De plus, l'altitude dépend surtout de la configuration du terrain. Sur un terrain plat, l'altitude est constante alors qu'en montée ou en descente, elle est croissante ou décroissante.
Le mieux serait de trouver une fonction qui donne l'altitude sur la carte en fonction des coordonnées X et Y. Je ne suis pas sûr que ça existe pour SAMP.
++
Syg
-
Hum, j'ai fail alors ^^
Sinon pour avoir la position Z à partir de x et y tu peut utiliser map andreas
-
Normalement c'est les deux angles de quoi ?
Je confirme avec X et Y on peut avoir le Z via le plugin MapAndreas ici (http://forum.sa-mp.com/showthread.php?t=120013&highlight=mapandreas)
-
C'est exactement de ça que je parlais.
Par contre, le plugin en question est très gourmand (70 Mo de mémoire utilisé) et a beaucoup de limitations.
Pour les deux angles, on garde l'angle de rotation par rapport à l'axe Z (qui pointe vers le haut) et il faut l'angle par rapport au plan (XY). Ce dernier angle n'est pas disponible sous SAMP.
++
Syg
-
Salut,
si vous voulez un peu de visualisation des angles en question, recherchez système de coordonnées sphérique sur google. C'est exactement ce principe et c'est une des choses que l'on a abordé dans mon cours de calcul vectoriel.
++Sim++
-
Salut :D
Merci beaucoup, je vais regarder ça Sim.
Syg j'ai pas eu le temps de demander à mon prof on été en TD aujourd'hui et j'ai eu le temps de finir à temps et de partir pour quitter ^^
Sim ? J'ai regardais un peu.. --> Wikipédia (http://fr.wikipedia.org/wiki/Coordonn%C3%A9es_sph%C3%A9riques)
j'aurais besoins des coordonnées cartésienne, j'ai vue le produit de ça en cours, mais on a pas plus approfondi..
Mais genre ils donnent :
z = p cos o(barré)
mais o(barré) c'est ensemble vide ?
-
Salut,
le o barré comme tu dit, c'est téta, c'est une lettre grecque (comme on en utilise plein en math). Ici c'est l'angle entre ton vecteur et l'axe des X dans le plan de XY. L'angle phi, le I sur un o, c'est l'angle entre l'axe des Z et ton vecteur. Regarde les images et ça devrait être clair.
Donc, ici c'est pour montrer ce que Syg disait, qu'on a besoin da la grandeur et de deux angles.
Sinon, on peut très bien le faire sans le moindre angle, en ayant le vecteur en coordonnées cartésienne.
Si tu cherche à faire un élément qui suit le joueur, tu peut utiliser les proportions des X, Y et Z pour savoir où le positionner.
Suffit de diviser chaque élément de la vitesse par la grandeur de la vitesse. Ensuite, tu multiplie par la distance désirée entre le joueur et ce qui le suit. Attention, tu dois le mettre derrière, je te laisse réfléchir à comment le faire. Indice: La différence est dans le signe du facteur par lequel tu multiplie chaque composante.
++Sim++
-
Ce que je veut faire c'est un système de caravane, et donc, j'avais besoin de pouvoir placé mon objet dans une demi sphère derrière la voiture mais en fonction de l'angle j'veut mettre en face une correspondance pour utiliser une fonction comme celle précédemment citée, qui va être utiliser dans le paramètre angle. Après il me suffisait de faire un p'tit calcul et de positionner l'attache de la caravane derrière la voiture.
J'ai un peu compris le cours sur wiki, je vais essayer de l'approfondir encore.. mais téta on peut vraiment pas le calculer avec le produits cartésiens ?
-
Salut,
j'y pense là, si tu veut vraiment tous les angles de la voiture, utilise la fonction GetVehicleRotationQuat
Il te faudra convertir en autre système d'angles (va voir sur le forum officiel) pour être capable de travailler avec.
Bonne chance
++Sim++
-
Wouah, Oo, j'avais jamais vu ça. Merci Sim. J'ai regardais sur le wiki, elle y est :D
Clique :D (http://wiki.sa-mp.com/wiki/GetVehicleRotationQuat)
Qu'elle est l'angle '' w '' ?
The first quaternion angle.. ? Mouais..
Sam. :cheers
ps : En tapant ta fonction sur le forum sa-mp j'ai trouvé un post. Ou quelqu'un avait besoin de la même fonction que moi et j'ai trouvé ça.
GetXYZInFrontOfVehicle(vid, Float:distance, &Float:x, &Float:y, &Float:z)
{
new Float:r[3];
GetVehicleAngle(vid, r[0], r[1], r[2]);
GetVehiclePos(vid, x, y, z);
x += (distance * floatsin(-r[2], degrees));
y += (distance * floatcos(-r[2], degrees));
z += (distance * floatsin(-r[0], degrees));
return 1;
}
stock GetVehicleAngle(vid, &Float:x, &Float:y, &Float:z)
{
new
Float:qw,
Float:qx,
Float:qy,
Float:qz;
GetVehicleRotationQuat(vid, qw, qx, qy, qz);
QuatToEulers(qw, qx, qy, qz, x, y, z);
return 1;
}
stock QuatToEulers(Float:qw, Float:qx, Float:qy, Float:qz, &Float:rX, &Float:rY, &Float: rZ)
{
/**Can be non-normalised/normalised Quaternion will return Eulers Angle*/
new Float:sqw = qw*qw;
new Float:sqx = qx*qx;
new Float:sqy = qy*qy;
new Float:sqz = qz*qz;
new Float:unit = sqx + sqy + sqz + sqw; // if normalised is one, otherwise is correction factor
new Float:test = qx*qy + qz*qw;
//Check for Gimbal Lock
if (test > 0.499*unit) { // singularity at north pole
rX = 2 * atan2(qx,qw);
rZ = 3.1415926535/2;
rY = 0;
while(rX < 0.0) rX += 360.0; while(rX > 360.0) rX -= 360.0;
while(rZ < 0.0) rZ += 360.0; while(rZ > 360.0) rZ -= 360.0;
return 1;
}
if (test < -0.499*unit) { // singularity at south pole
rX = -2 * atan2(qx,qw);
rZ = -3.1415926535/2;
rY = 0;
while(rX < 0.0) rX += 360.0; while(rX > 360.0) rX -= 360.0;
while(rZ < 0.0) rZ += 360.0; while(rZ > 360.0) rZ -= 360.0;
return 1;
}
//No Gimbal Lock
rX = atan2(2*qy*qw-2*qx*qz , sqx - sqy - sqz + sqw);
rZ = asin(2*test/unit);
rY = atan2(2*(qx*qw-2)*(qy*qz) , -sqx + sqy - sqz + sqw);
while(rX < 0.0) rX += 360.0; while(rX > 360.0) rX -= 360.0;
while(rY < 0.0) rY += 360.0; while(rY > 360.0) rY -= 360.0;
while(rZ < 0.0) rZ += 360.0; while(rZ > 360.0) rZ -= 360.0;
return 1;
}
Il y aussi une include (http://forum.sa-mp.com/showthread.php?t=167645&highlight=GetVehicleRotationQuat)
et un pastebin (http://pastebin.com/7L2yi3gz):
J'ai envie de dire quel script choisir ? Ils ont tous des calculs différents Oo
-
Salut,
J'ai envie de dire quel script choisir ? Ils ont tous des calculs différents Oo
normalement, s'ils sont bons, tous ces calculs sont équivalents (toutefois certains peuvent être faits de façon plus efficace).
Choisi celui qui te plait le plus à l'utilisation.
++Sim++
-
Merci beaucoup Sim :)
Je vais prendre l'include moins de calcul ^^