CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Gérer la gravité

Menthaloyd
Menthaloyd
Niveau 10
18 janvier 2012 à 21:25:08

Bonjour à tous, j'aimerai savoir comment gérer la gravité dans un petit programme en C. Je pars d'une image qui si sa position y baisse doit activer une fonction qui le fait retomber.
Mais je vois pas quoi mettre dedans :x Il faudrait qu'il puisse redescendre même si sa position x change et que ce soit un minimum fluide.

De plus j'utilise la SDL :o))

Merci de vos futurs réponses.

godrik
godrik
Niveau 30
18 janvier 2012 à 21:28:37

Tu as fais de la physique en terminal? Si oui, utilise les equations de la mecanique du point. Si non, tu peux lire wikipedia [1] et nous donne ton niveau scolaire.

[1] http://fr.wikipedia.org/wiki/Attraction_gravitationnelle

Menthaloyd
Menthaloyd
Niveau 10
18 janvier 2012 à 21:31:46

Je suis en seconde.
C'est si compliqué que ça? Je pensais pas devoir me servir de quelques cours de physiques.

Sinon j'ai entendu parler de translation par vecteurs. Mais là non plus je vois pas comment m'y prendre.

caelacanthe
caelacanthe
Niveau 10
18 janvier 2012 à 22:14:01

sur le principe, il suffit de considérer la position de l'objet, son vecteur de déplacement actuel (qui vient s'additionner a la position à chaque mise à jour), et un vecteur de gravité qui vient s'ajouter au vecteur de déplacement à chaque mise à jour de la position de l'objet. :(

tbop2
tbop2
Niveau 10
18 janvier 2012 à 22:24:34

Oui enfin compliqué c'est pas avec un bac qu'on devient prix nobel non plus, rien d'inatteignable donc. Godrik et caelacanthe t'ont donné la voie.

Aldebran
Aldebran
Niveau 10
18 janvier 2012 à 23:26:06

Trouver comment bouger un objet selon les lois de la physique est loin d'être évident si on n'a pas la connaissance de la seconde loi de Newton.

Pour un niveau seconde il manque pas mal de concepts physiques et même mathématiques pour appréhender le problème, même si caelacanthe a bien résumé la chose.

Globalement il faut comprendre que la position d'un objet est mise à jour en fonction de sa vitesse :

OM(t+1) = OM(t)+v(t) où OM(t) représente la position (x, y) de ton objet à l'instant t et v(t) la vitesse (vx, vy) de ton objet à l'instant t

Seulement là on n'a pas encore mis en relation la position de l'objet et la force qui s'y applique (la gravitation). Pour cela il faut utiliser la seconde loi de Newton qui nous dit (dans le cas d'un temps discret) que v(t+1) = v(t) + (1/m)*F(t) où m est la masse de l'objet et F(t) la somme des forces s'appliquant à l'objet à l'instant.

Ici la gravitation/le poids est la seule force s'appliquant à l'objet, cette force a pour expression P = m*g où g est le vecteur de gravité.
On en déduit que v(t+1) = v(t) + g car (1/m)*F(t) = (1/m)*m*g = g

Ensuite comme caelacanthe l'a précisé, on procède en deux étapes :
- calcul de la vitesse v(t+1) = v(t) + g
- calcul de la position OM(t+1) = OM(t)+v(t)

D'un point de vue plus technique j'imagine que tu as bien compris qu'en plus de la position de ton objet, il faut aussi que tu stockes quelque part sa vitesse dans ton programme C.

chris_27
chris_27
Niveau 10
19 janvier 2012 à 12:11:58

« Globalement il faut comprendre que » dans ce cas précis, il y a une formule clause (un polynôme de degré 2 en t) pour x et y. Donc discrétiser c'est à la fois beaucoup plus dur à concevoir sur papier, beaucoup plus dur à coder, et beaucoup moins précis numériquement.

NB: et oui, on peut vraiment faire des choses délirantes si on se lourde trop sur la précision :
http://fr.wikipedia.org/wiki/MIM-104_Patriot#.C3.89chec_.C3.A0_Dharan
(spas la meilleure source, mais j'ai pas mieux sous la main là)

Au passage, OM(t), v(t) et compagnie, c'est vraiment mortel comme notations. On dira ce qu'on voudra, mais les x, 'x point', 'x point point' c'est beaucoup plus concis ET beaucoup plus clair (parce qu'on voit tout de suite que 'x point' c'est la dérivée de x, contrairement à x et vx).

tbop2
tbop2
Niveau 10
19 janvier 2012 à 13:19:36

Ouais enfin x point sur les forum JV.com c'est pas genial non plus eheh.

C'est vrai qu'etant donne que c'est une formule close tu peux aussi t'amuser a simplement dynamiser ca a la place... mais des que l'on veut mettre un peu plus de variables et de conditions au bout d'un moment il n'y a plus trop de choix et faut bien simuler. Cela dit ici on fait de l'interpolation lineaire, on peut aussi faire de l'interpolation un peu plus fine comme avec RK4.

pilo1488
pilo1488
Niveau 10
19 janvier 2012 à 14:36:24

RK4 pour ce genre de cas, c'est un peu violent quand meme :)

tbop2
tbop2
Niveau 10
19 janvier 2012 à 14:37:48

Completement !

Aldebran
Aldebran
Niveau 10
19 janvier 2012 à 16:12:29

"« Globalement il faut comprendre que » dans ce cas précis, il y a une formule clause (un polynôme de degré 2 en t) pour x et y. Donc discrétiser c'est à la fois beaucoup plus dur à concevoir sur papier, beaucoup plus dur à coder, et beaucoup moins précis numériquement."

Je suis d'accord sur le fond mais OP est en seconde et a parlé d'image et de SDL, j'ai donc supposé qu'il était en train de faire jeu et pas un simulateur pour la NASA. De plus je ne suis pas d'accord sur la difficulté de concevoir la discrétisation, pour moi (c'est mon point de vue) c'est beaucoup facile de concevoir et pas plus difficile à coder, et ce d'autant plus qu'on va augmenter le nombre de forces à appliquer à l'objet.

Ici on se limite à un cas simple car la seule force qui s'exerce est la gravité. Par contre, l'approche qui consiste à décrire le mouvement par les équations devient lourde dès qu'on a un plus grand nombre de forces qui s'appliquent sur l'objet et que le nombre de forces appliquées à l'objet peut varier. Avec l'approche discrète, on peut très simplement ajouter une force à l'objet (frottement fluide, tension d'un ressort, choc élastique ou non, etc.) quasiment sans avoir à toucher au code, alors qu'avec l'approche continue je vois beaucoup plus difficilement comment faire.

"Au passage, OM(t), v(t) et compagnie, c'est vraiment mortel comme notations. On dira ce qu'on voudra, mais les x, 'x point', 'x point point' c'est beaucoup plus concis ET beaucoup plus clair (parce qu'on voit tout de suite que 'x point' c'est la dérivée de x, contrairement à x et vx)."

Pas évident à écrire le x point. Bon j'aurais pu écrire dx/dt mais vu que OP est en seconde et ne verra les dérivées qu'en 1ère, je préférais ne pas le perdre et faire appel à des notions plus intuitives comme la notion de vitesse.

Menthaloyd
Menthaloyd
Niveau 10
19 janvier 2012 à 18:32:42

Merci pour vos réponses.
Mais je vois pas comment mettre la vitesse de l'objet dans un variable.

Au pire j'attends un an, vu que mon niveau en programmation est celui de SdZ et que l'année prochaine je vais prendre des cours dans mon lycée.

chris_27
chris_27
Niveau 10
19 janvier 2012 à 18:41:55

Aldebran: oui, l'OP est en second. Qu'il donne ses données initiales, et je lui donnerai le polynôme de degré 2. On peut raisonnablement penser qu'il ne saura pas coder (ou en tout cas pas facilement) toute chose plus complexe que ça.

Sinon, j'ai bien précisé « dans ce cas précis ». Dans un cas réel, je suis bien d'accord que c'est beaucoup plus dur et qu'il faut faire de l'intégration numérique (potentiellement sur des fonctions approchées, en prime). Mais ce n'est, pour moi, pas le sujet ici. :-)

chris_27
chris_27
Niveau 10
19 janvier 2012 à 18:44:01

Pas évident à écrire le x point » :d) la faute à JVC et son absence de support de l'UTF-8. Moi mon clavier produit des 'x point' et des 'x trema' (qui font office de 'x point point'). :(

tbop2
tbop2
Niveau 10
19 janvier 2012 à 18:47:40

Hey j'ai pas ca sur mon clavier ! ...... "jveuuuux l'meme claviiiieer"

"Mais je vois pas comment mettre la vitesse de l'objet dans un variable. "
Comment est representee mathematiquement la vitesse instantanee dans tes cours de physique au lycee ?

Menthaloyd
Menthaloyd
Niveau 10
19 janvier 2012 à 18:53:00

Vitesse instantanée?

On a fait que la lumière en physique pour l'instant.

041
041
Niveau 10
19 janvier 2012 à 21:31:43

Tu peux tout simplement utiliser la loi de la gravitation universelle, suffit de la distance et de la masse des objets.
Après si tu compte faire plein d'objets gravitationnel, faudra gérer les modifications des forces avec les angles etc.

Aldebran
Aldebran
Niveau 10
19 janvier 2012 à 22:02:51

"Vitesse instantanée?

On a fait que la lumière en physique pour l'instant."

Apparemment c'est loin d'être intuitif pour toi pour l'instant (et en plus z'avez l'air sacrément en retard sur le programme en physique !), donc voilà la formule toute faite qui te donne ta position en fonction du temps pour un objet soumis à la gravité :

x(t) = vx0*t + x0
y(t) = (1/2)*g*t² + vy0*t + y0

Avec x(t) la position de l'objet en x en fonction du temps, y(t) sa position en y en fonction du temps, vx0 la vitesse initiale en x, x0 la position initiale en x, g la constante gravitationnelle (g ~ 9.81 m.s-2), t le temps, vy0 la vitesse initiale en y et y0 la position initiale en y (je sais la mise en page de la formule est moche :( ).

Si par exemple la position de départ est (200, 100) et que la vitesse de départ est (5, -2) alors l'équation de la trajectoire devient :
x(t) = 5 * t + 200
y(t) = (1/2)*g*t² - 2 * t + 100

Et pour la démonstration de la formule, tu attendras d'être en terminale (ou tu chercheras par toi-même sur internet, comme tu le sens :-))) ).

pilo1488
pilo1488
Niveau 10
20 janvier 2012 à 10:06:32

Il y a la théorie, et la pratique....
9.81 m.s-2, dans un jeu en 2D? ca rime à quoi?

Menthaloyd:

donc je suppose déja que tu as une run loop, un truc du genre

float x = 0;
float y = 0;
while(0) {
drawImage(x, y); (je connais pas la syntaxe de ce que tu utilise)
}

bon, bien pour gérer la gravité, tu fait:

float x = 0;
float y = 0;

float vy = 0;

while(0) {
if(objet_en_lair)
vy += 0.4;

else
vy = 0;

y += vy;

drawImage(x, y); (je connais pas la syntaxe de ce que tu utilise)
}

Quand j'écrit vy += 0.4, c'est au pif. Il faudra que tu choississent une valeur de facon empirique (une grande valeur le fera retomber plus vite).

Glosoli
Glosoli
Niveau 10
20 janvier 2012 à 11:26:36

Au pire tu ajoutes une variable constamment sur ton personnage lorsqu'il ne touche pas le sol, tout simplement. :hap:

int gravité = 4;

If(perso ne touche pas le sol) gravité.y += vitesseperso;

C'est très simplifié n'est-ce pas. :hap:

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment