GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: chneubeul le 24 Juin 2010, 14:34:24
-
Biljour', j'aimerais trouver le moyen de savoir si le joueur décris une courbe en descendant ou en montant car j'aimerais faire un système de G j'ai la formule qui est :
(v²/r)/9.8
v étant la vitesse en m/s
r le rayon de la courbure
et 9.8 l'intensité de la pensanteur N.Kg-1
J'ai ma petite idée, donc quand le joueur appuiera sur la touche haut ou bas pour décrire une courbe on déclenchera un cercle qui va servir de cercle témoin et ensuite on prend la courbe et on cherche son rayon.
http://www.bibmath.net/dico/index.php3?action=affiche&quoi=./c/courbure.html
Merci de votre aide.
Sam ++
:cheers
" Avec presque rien on fait presque tout " de Syg. Je te met au défi :)
-
Dans le cas d'un avion qui monte où qui descend, la trajectoire a peu de chance d'être un cercle.
Au mieux ce sera un ligne droite, au pire une courbe dont l'équation ne tiendrait pas sur l'écran.
Mais ce que tu veux faire n'est pas impossible et avec le peu qu'apporte le PAWN, il serai possible de la faire.
La méthode :
Echantillonner la trajectoire du véhicule (c'est à dire prendre le plus de points possible pour décrire le mouvement du véhicule).
-> Ce n'est pas très difficile à réalisé mais il faut une grande quantité de mémoire
A partir des cet échantillonnage, en déduire l'équation de la trajectoire du véhicule
-> Il est certainement facile de coder ça en PAWN. Le plus dur c'est les math qui vont derrière et j'avoue ne pas savoir faire.
A partir de l'équation de la courbe représentant la trajectoire, on trouve un vecteur normal centrifuge à cet courbe ainsi que son rayon de courbure. Ceci donne l'intensité de l'accélération subie (d'après ta formule) et la direction dans laquelle elle s'applique. Tout ceci en temps réel bien sûr.
-> Là encore, PAWN permet de coder ça mais là encore, il faut de très bonnes connaissances en math (par contre, là, je pourais, sur une courbe simple, peut-être me débrouiller).
Je t'ai donné la méthode, à toi de faire le reste :)
Bon courage !!!
++
Syg
-
Merci beaucoup je vais réfléchir à sa et je pense avoir l'ami nécessaire pour les maths (( Google ^^)) Merci encore de ton aide..
Salut :)
J'ai chercher la formule sur mon amis et je n'ai trouver que des logiciels etc.. en C :s Je continue de chercher mais je crois que sa va encore être foutu le système -_-
-
Oui sa mais bon c'pas très réel, IRL quand tu monte ou tu descend tu n'a pas d'accélération assez fortes pour subir des remontés de sang etc..
-
A partir de la position de deux points il est possible de trouver l'accélération.
Petite aide:
La dérivé de la distance de deux points donne le vecteur vitesse, la dérivé du vecteur vitesse te donne le vecteur accélération après à partir du vecteur, tu peux en déduire la vitesse propre du système, ici ton avion.
Je sais pas si je suis très claire, mais c'est le programme de Terminal S donc...
Si tu comprends pas trop, j'essaierais de te ré expliquer.
-
Pour la vitesse plus besoin de se foulé les cheville, y a déjà la fonction GetPlayerVelocity()
-
Salut :) Steve j'ai vu d'la doc sur sa je vais me servir de sa merci beaucoup, Gzsume ce que je voulais c'est trouver le moyen de savoir si le mec monte ou descend oui mais en calculant l'acceleration. Et enfin sasuke, ce que je veut ce n'est pas la vitesse, j'en aurais besoin mais je sais le faire sa ^^
-
Ben a la limite j'utilise les vecteurs de steve j'ai trouver les formules et si on veut trouver le fameux nombre G il faut utiliser le rayon de la courbure peut être que steve sais puisque les vecteurs dont il parle sont souvent employés dans des courbes.. =D
-
Non c'est particulier, c'pas comme un rayon commun auquel tu pense ^^ j'ai regarder un peu sur le net c'est une formule assez compliqués ! =D
-
Salut,
ça tombe bien, je suis justement j'étudie justement en physique..... :P
Tu cherche le G subit par le joueur dans son avion, donc une accélération
Mais qu'es-ce qu'une accélération?
Un truc qui fait qu'on meurt quand on se prend un accident à trop grande vitesse?
Ça peut oui... (quand l'accélération au moment de la collision est trop grande le corps s'endommage)
La définition physique d'une accélération est une variation de vitesse.
(la vitesse en m/s, ca variation dans ce même unité de temps est la différence de vitesse (encore en m/s) par l'unité de temps (secondes) d'où m/s²).
Bref, pour ton problème, comment faire?
Regarde la vitesse à un instant (avec GetVehicleVelocity s'il te plait) et enregistre la dans des variables (3 variables pour les 3 composantes)
Puis une autre fois après avoir laisser un laps de temps s'écouler. Il te faudra donc trouver de combien la vitesse a variée.
Attention, la vitesse est un vecteur. Il te faudra donc trouver la différence vectorielle entre les deux vitesses trouvées. Pour se faire, il te suffit de soustraire chacun des composantes (vecteur 2 - vecteur 1 s'il te plait, question d'avoir la bonne direction...).
À savoir que le vecteur résultant est toujours une vitesse, il te faudrait donc maintenant le convertir dans une unité plus pratique, le m/s.
NB. j'avais codé cette fonction et le multiplicateur (180) donne environ la vitesse en km/h:
Float:GetPlayerSpeed(playerid)
{
new Float:X, Float:Y, Float:Z;
new vehid;
if((vehid = GetVehicleID(playerid)))
{
GetVehicleVelocity(vehid, X, Y, Z);
}
else
{
GetPlayerVelocity(playerid, X, Y, Z);
}
return (floatsqroot(X * X + Y * Y + Z * Z) * 180);
}NB. N'utilisez pas cette fonction car elle n'est pas claire (explication: http://www.gtaonline.fr/forums/index.php/topic,8857.msg149544#msg149544 (http://www.gtaonline.fr/forums/index.php/topic,8857.msg149544#msg149544))
Sachant le multiplicateur pour avoir la vitesse en km/h, il te suffit de trouver le multiplicateur pour la vitesse en m/s (1 m/s = 3,6 km/h).
Maintenant que tu as la différence de vitesse en m/s, il ne te reste qu'à diviser le tout par le temps en secondes écoulé entre les 2 mesures (GetTickCount() merci ;)).
Tu as donc désormais l'accélération en m/s². à savoir que le g est l'accélération gravitationnelle de la terre à sa surface. Sa valeur acceptée est d'approximativement 9,8 m/s² (plus précisément 9,80665 m/s²).
En divisant par cette valeur tu obtient donc l'accélération en g (attention le g doit être minuscule, le G = constante gravitationnelle = 6,673x10E-11) que subit le joueur.
NB. il pourrait être judicieux d'adapter cette valeur suite à certains tests car il est possible que GTA n'offre pas des accélération réalistes.
++Sim++
-
Salut :) Merci à toi Sim. Donc j'utilise la méthode de Sim ou les autres ? :)
-
En faites tu voudrai savoir si le joueur monte ou descend ?
C'est assez simple, tu fait :
new Float:x = 0.0, Float:y = 0.0, Float:z = 0.0;
GetPlayerVelocity(playerid,x,y,z);
if(z < 0)
{
// si le joueur fait une descente
}
else if( z > 0)
{
// si le joueur fait une montée
}
else
{
// si le joueur ne bouge pas en hauteur
}
-
Il ne veux pas savoir uniquement si le joueur monte ou descend, il veut l'accélération pour pouvoir calculer le g que prend le joueur.
La méthode de Sim est plus simple que la mienne, je n'y avais pas pensé xD. Donc je pense que tu peux l'utiliser.
-
Il ne veux pas savoir uniquement si le joueur monte ou descend, il veut l'accélération pour pouvoir calculer le g que prend le joueur.
La méthode de Sim est plus simple que la mienne, je n'y avais pas pensé xD. Donc je pense que tu peux l'utiliser.
Hum je comprend mieux ^^
Mais la il sait au moins si la courbe descend ou monte ^^
-
Et oui ^^ Tu savais pas ce qu'étais le nombre g ? J'te sentais perdu la x'D
-
Nombre g ? nah je connais l'intensité de pesanteur que l'on nomme g, mais pas le nombre g ^^
-
Nan Sim à dit que l'intensité c'est G et le nombre g ben g ^^ C'est par exemple les pilotes de chasses :-* ben y sont soumis aux décollages, attérissages, demi-tour, loop, trou d'air etc..
-
Sim a été clair je trouve.
g = intensité de l'apesanteur moyenne à la surface de la terre. Valeur : 9.8 kg.m/s²
G = Constante gravitationnelle utilisée pour les calcul des trajectoires des corps célestes (étoiles, planètes) en orbite les unes autour des autres. Valeur : 6.674 m3/kg.s²
La seule solution simple pour connaître l'accélération est celle donnée par Sim (et rejoint celle que j'ai donnée mais qui est vraiment trop compliquée).
Il s'agit d'échantilloner la vitesse sur des intervalles courts (voire très courts) et d'en déduire l'accélération instantanée par soustraction et division par l'intervalle de temps.
L'accélération est un vecteur qui indique la direction dans laquelle elle s'exerce. Mais cette direction n'a rien à voir avec le mouvement proprement dit. L'accélération peut très bien être inverse au mouvement, on parle alors de décélération.
Sinon, je relève un petite bêtise de la part de steve : La dérivé d'une distance ne correspond à rien.
Dans ton cours de physique de terminal S (à l'époque où j'y étais, c'était la terminal C) on a du te dire :
La fonction qui donne la vitesse instantanée en fonction du temps est la dérivée de la fonction qui donne la trajectoire en fonction du temps.
Et la fonction qui donne l'accélération en fonction du temps est la dérivée de fonction qui donne la vitesse en fonction du temps.
Par abus de langage, on dit "L'accélération est la dérivé de la vitesse et la vitesse est la dérivé la trajectoire".
Mais ceci rejoint tout à fait la solution que je donnais, le plus dur restant de trouver la fonction qui donne la trajectoire puis d'en calculer sa dérivée (tout ça en PAWN, je vous déconseille d'essayer).
Maintenant, la question que je me pose, c'est qu'une fois que tu auras l'accélération, que vas-tu en faire ? Et comment vas-tu matérialiser ceci dans le jeu ?
++
Syg
-
Salut j'ai créé un autre topic tu peut voir que je j'ai mis des fourchettes la j'ai la flemme de coder, j'me suis pas remis de mon week end porte ouverte à la caserne avec les gosses j'suis crever ^^ enfin bref.. OSEF. Pour revenir à nos moutons, la fourchette va permettre en fonction de l'accélération de terminer un ° d'effet et il y aura un random pour soit une remontée de sang soit un trou noir, impossible à savoir en pawno car il faudrait calculer avec la courbe etc.. et en fonction de l'effet choisis 3 degrés qui dure plus ou moins longtemps donc le joueur sera désorienté un peu tu comprend ? :)
http://www.gtaonline.fr/forums/index.php/topic,10734.0.html (http://www.gtaonline.fr/forums/index.php/topic,10734.0.html) mon autre sujet avec le début du code
-
Sinon, je relève un petite bêtise de la part de steve : La dérivé d'une distance ne correspond à rien.
Dans ton cours de physique de terminal S (à l'époque où j'y étais, c'était la terminal C) on a du te dire :
La fonction qui donne la vitesse instantanée en fonction du temps est la dérivée de la fonction qui donne la trajectoire en fonction du temps.
Et la fonction qui donne l'accélération en fonction du temps est la dérivée de fonction qui donne la vitesse en fonction du temps.
Par abus de langage, on dit "L'accélération est la dérivé de la vitesse et la vitesse est la dérivé la trajectoire".
Effectivement, tu as raison, c'est comme ça que l'on m'a appris, mais c'est vrai que par rapidité, on le dit comme ca, ce qui n'est pas tous à fait exact.
Merci pour le rappel, c'est assez loin pour moi ^^
++