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

[SFML] Physique, gravité..

maxdeoxis
maxdeoxis
Niveau 10
01 février 2014 à 16:17:23

Bonjour à tous,
Je m'intéresse à la réalisation d'un projet de jeu de volley ball en 2 dimensions, et pour cela j'utilise SFML.
Dans un premier temps je souhaite avoir un prototype permettant de :
- afficher deux shapes en forme de cercle, l'un représentant un personnage, l'autre le ballon;
- le cercle "personnage" étant situé en bas de l'écran, et pouvant uniquement se déplacer à gauche, à droite ainsi qu'effectuer un saut
- le cercle "ballon" qui apparait par ex. au milieu de l'écran et qui subit la gravité;il réagit de plus aux différentes collisions ballon/sol, ballon/murs et ballon/personnage

Ce que j'ai déjà:
- le cercle personnage qui bouge et qui peut sauter. Néanmoins, le but de mon projet est d'avoir un maximum de réalisme ( au niveau de la physique ).
Mon saut n'étant pas très réaliste, je me suis tourné vers les différentes équations que l'on peut voir en Terminale, par exemple:
y=y0 -(1/2*g*t*t) + v*t

- les différents tests de collisions
- les rebonds contre les murs
J'ai aussi quasiment les rebonds balle/balle mais j'attend d'avoir tout bien règler avant de tester.

Donc mes questions sont:
- vaut-il mieux utiliser monObjet.move(maVitesse) ou monObjet.setPosition(x,y) ?
- en essayant d'implémenter un saut réaliste ( plutôt une chute puisque la balle est initialement en l'air ) j'ai ceci:

if(inAir)
speed.y+=k*grav*clock.getElapsedTime().asSeconds()
;

où k est une constante que j'ai fixé et grav est égale à 9.81

Cependant je n'arrive pas à bien gérer le cas où la balle/le joueur effectue un saut en partant du sol?

Merci d'avance pour vos conseils
Bonne journée ! :)

dezq
dezq
Niveau 7
01 février 2014 à 17:02:16

Si tu veux des mouvements "smooth" il faut que objet.move(vitesse) soit appelé en permanence

Pseudo supprimé
Pseudo supprimé 01 février 2014 à 17:25:01

Un saut c'est juste une impulsion vers le haut. Donc concrètement si tu as déjà la gravité d'implémentée, t'as juste à affecter une valeur négative (à toi de voir laquelle) à speed.y quand tu veux déclencher un saut. Ça aura pour effet de déplacer ta boule vers le haut, de plus en plus lentement (puisque speed.y augmente avec la gravité) jusqu'à retomber vers le bas, de plus en plus vite.

Quant à utiliser move ou setPosition, c'est suivant tes préférences.
Mais vu que t'utilises une vitesse c'est légèrement plus simple d'utiliser move, puisque setPosition te fait calculer la nouvelle position à la main alors que move le fait pour toi. Je ne vois pas d'intérêt à utiliser setPosition dans ce cas-là.

maxdeoxis
maxdeoxis
Niveau 10
01 février 2014 à 18:08:44

Merci à vous deux, je reviendrais vers vous demain lorsque j'aurai testé tout ça :)

papy386
papy386
Niveau 10
02 février 2014 à 04:50:09

Bonjour

En fait il te manque un niveau avant l'application de ta fonction c'est a dire la somme des forces appliqué a ton object (ici le joueur au sol) est égale a la masse multiplié par l'accélération (sF = ma).

Puis tu a par intervalle de temps D (delta t) : V = (a x D) + V0. Ou V est ta vitesse, et V0 la vitesse de départ (au moment ou il y a eu du changement en général).

N_Near
N_Near
Niveau 10
02 février 2014 à 11:05:32

Omg :(

On m'avait clairement dit que les maths n'était pas utile en programmation et voilà ce qu'on me sort :snif:

Je vais devenir poissonnier

Euclidien
Euclidien
Niveau 10
02 février 2014 à 12:12:17

N_Near :d)

Les maths sont utiles en programmation, la trigonométrie et l'algèbre linéaire sont par exemple à la base de la 3d (matrices de rotation / projection, produit vectoriel / scalaire pour des tas d'opérations qui interviennent en 3d, quaternions) l'analyse numérique est également importante.

--

Sinon pour le mouvement d'un projectile comme ta balle, pour le maximum de réalisme tu pourrais essayer de rajouter les frottements avec l'air. Typiquement la force exercée par l'air sur la balle sera du type f = -kv² (ou -kv si tu veux une approximation plus simple à résoudre)
On suppose que tu lances le projectile avec une vitesse v_0 et un angle α par rapport à l'horizontale.
Si tu projettes en x et en y t'as :
∑f = ma_x = - kv_x
∑f = ma_y = - mg - kv_y

t'obtiens deux équations différentielles,
a_x = - kv_x / m = dv_x/dt
a_y = 1/m(-kv_x - mg) = -kv_x/m - g = dv_y/dt

Si on pose µ = k/m on obtient :

Sur x : dv_x/dt = -µv
Sur y : dv_y/dt = -µv_y - g

On a aussi dx(t)/dt = dv_x/dt et dy(t)/dt = dv_y/dt

d'où (il est explicite que x et y dépendent de t donc je mets pas les parenthèses mais faut bien considérer deux fonctions du temps.)

(a) d²x/dt² = - µdx/dt
(b) d²y/dt² = -µdy/dt - g

(a) <=> d²x/dt² + µdx/dt = 0
(b) <=> d²y/dt² + µdy/dt + g = 0

(Après des calculs savants :noel: on arrive à : )

dx/dt = v_x(t) = V_0cos(α) exp(-µt)
dy/dty = v_y(t) = -g/k + (V_0 sin(α) + g/k)exp(-µt)

Si tu veux une modélisation par f = - kv² ça devient un peu plus compliqué (t'obtiens un machin avec du ln(cosh(...)))

Un TD de licence 1 avec la démarche sans frottements et avec frottements :
http://www.edu.upmc.fr/sdi/meca_class/derniers_pdf/TD03_Balistique_dans_air_S.pdf

Malgré l'approximation en f = - kv cette modélisation reste très réaliste. :noel:

N_Near
N_Near
Niveau 10
02 février 2014 à 13:57:53

"dx/dt = v_x(t) = V_0cos(α) exp(-µt)"
"dy/dty = v_y(t) = -g/k + (V_0 sin(α) + g/k)exp(-µt)"

Ceux qui n'ont rien compris te saluent

maxdeoxis
maxdeoxis
Niveau 10
02 février 2014 à 15:19:02

Merci à tous pour vos réponses, je vais essayer de voir ce que je peux faire et je reviens vers vous si j'ai des soucis.
Euclidien -> comment je détermine k?

Euclidien
Euclidien
Niveau 10
02 février 2014 à 15:43:05

Dans l'air la trainée d'une sphère de rayon r est donnée par :

F = kv = 1/2*ρ*C*S*v

ρ : masse volumique de l'air
C : coefficient de trainée pour une sphère ~ 0.45
S : π*r²

Dans un fluide visqueux faut utiliser la loi de stokes pour une sphère :

http://fr.wikipedia.org/wiki/Loi_de_Stokes

F = - 6πηrv

η étant la viscosité.

Par exemple si tu veux modéliser le lancement de ton ballon dans un milieu fluide avec une viscosité importante faudra utiliser la Loi de Stokes.

(Du coup faudra réappliquer la loi de Stokes et résoudre à nouveau des équations différentielles)

maxdeoxis
maxdeoxis
Niveau 10
02 février 2014 à 21:12:54

Encore merci! Décidément tu m'aides beaucoup.
Je profite du fait d'avoir quelqu'un qui semble très bon en physique "sous la main" ( :p) ) :
J'ai du mal à trouver sur le web une équation/explication concrète de comment déterminer la direction ( = vitesse par rapport à x et y ) que prendra une balle on se collisionnant contre une autre, ayant toutes deux une vitesse quelconque?
Ce serait génial que tu puisse m'aider à ce niveau là^^
Bonne soirée!

Euclidien
Euclidien
Niveau 10
02 février 2014 à 22:10:31

En 1 dimension, je sais pas si t'as vu ça en physique mais la quantité de mouvement, elle est donnée par le produit de la masse par la vitesse : p = mv
pour un système donné elle se conserve au cours du temps :

dp/dt = 0

Cette propriété est fondamentale en physique et les lois de conservation sont à la base des équations de mouvement (ça permet de faire pas mal de chose en dynamique des fluides par exemple !)

De plus l'énergie cinétique du système se conserve, ça donne 3 équations dans le plan (1 pour la conservation de l'énergie, 1 pour la conservation de la quantité de mouvement en X et 1 en Y) :

(1) 1/2∑m_i*(v_i)² = 1/2∑m_i*(v'_i)²
(2) ∑m_i*v_ix = ∑m_i*v'_ix
(3) ∑m_i*v_iy = ∑m_i*v'_iy

Tu as 3 équations pour 4 inconnues, donc le modèle nécessite de faire des suppositions supplémentaires (sur l'angle d'une des balles après la collision par exemple), en fait en 2d tu peux te ramener à une problème 1d avec une rotation :

http://static.wixstatic.com/media/f02be2_c0b969512c814d0477a4edca98a48c61.jpg_srz_p_396_296_75_22_0.50_1.20_0.00_jpg_srz

Ensuite tu appliques la conservation de la quantité de mouvement en une seule dimension ce qui te donne les valeurs des vitesses.

Tu peux ensuite effectuer une rotation pour retrouver les valeurs des composantes en x et en y des des deux balles.

http://williamecraver.wix.com/elastic-equations

maxdeoxis
maxdeoxis
Niveau 10
02 février 2014 à 22:30:25

Héhé ça m'a pas l'air simple, je verrais ça demain à tête reposée.^^
Merci de ton aide en tout cas!

MDA-Hack
MDA-Hack
Niveau 9
03 février 2014 à 10:54:59

Ca serait pas plus simple d'utiliser ce type d'algo ?
http://en.wikipedia.org/wiki/Trajectory_of_a_projectile

Pseudo supprimé
Pseudo supprimé 03 février 2014 à 14:56:25

Pas plus simple qu'un pauvre position = position + vitesse * temps

maxdeoxis
maxdeoxis
Niveau 10
07 février 2014 à 20:49:45

Re-bonsoir,
Finalement j'ai opté pour un modèle similaire mais d'apparence plus simple pour gérer les réactions aux collisions entre mes deux cercles :
http://fr.wikipedia.org/wiki/Choc_%C3%A9lastique#Choc_de_2_boules_de_m.C3.AAme_masse

J'ai bien implémenté les formules, mais j'ai un problème : mes deux sphères se "rentrent dedans ".

J'ai trouvé un début de solution juste ici :
http://gregorycorgie.developpez.com/tutoriels/physic/#LIV-B-3

Mais je ne comprends pas du tout l'équation...

Merci de ton aide ! :)

Euclidien
Euclidien
Niveau 10
08 février 2014 à 11:21:12

L'équation donne les distances dont il faut reculer les cercles pour qu'ils se touchent en un seul point de contact.

L'auteur donne cette explication (pour collision sphère / plan ):

" Du fait que le calcul des positions ne peut se réaliser de manière continue (il s'effectue à chaque frame donc tous les Dt secondes), les objets seront déjà interpénétrés au moment où l'on détecte la collision. Il est alors nécessaire de replacer les objets au point de contact exact pour être certain qu'à la frame suivante, les deux objets se seront bien séparés.

En effet si l'on ne réalise pas ce recalage, il est possible que les objets n'aient pas eu le temps de compenser l'interpénétration à la frame suivante (notamment si le Dt suivant est faible). Dès lors, le moteur va détecter de nouveau une collision, etc. "

maxdeoxis
maxdeoxis
Niveau 10
08 février 2014 à 11:33:55

J'ai bien compris l'explication et le concept, mais dans le schéma concernant la collision cercle/cercle, je ne comprends pas à quoi correspond b par exemple...

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