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 ! ![]()
Si tu veux des mouvements "smooth" il faut que objet.move(vitesse) soit appelé en permanence
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à.
Merci à vous deux, je reviendrais vers vous demain lorsque j'aurai testé tout ça ![]()
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).
Omg
On m'avait clairement dit que les maths n'était pas utile en programmation et voilà ce qu'on me sort
Je vais devenir poissonnier
N_Near
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
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. ![]()
"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
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?
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)
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" (
) :
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!
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
Héhé ça m'a pas l'air simple, je verrais ça demain à tête reposée.^^
Merci de ton aide en tout cas!
Ca serait pas plus simple d'utiliser ce type d'algo ?
http://en.wikipedia.org/wiki/Trajectory_of_a_projectile
Pas plus simple qu'un pauvre position = position + vitesse * temps
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 ! ![]()
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. "
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...