Accueil > Forum > > > > moteur physique
moteur physique
dimanche 25 octobre 2009 à 13:22:03 |
moteur physique

Jackyzgood
|
Bonjour à tous !
J'essaye actuellement de créer une fonction qui me gère des trajectoires simple dans un champ de pesanteur avec rebond. Mon problème ne vient pas de la physique, j'ai déjà fait une trajectoire en pré-calculé, aucun soucis.
Code C/C++ : while(continuer)
{
Objet.temps = SDL_GetTicks();
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
gestion_des_evenements (&event, &Evenements, &continuer);
SDL_BlitSurface(marqueur, NULL, ecran, &(Objet.position_affichage));
SDL_Flip(ecran);
//limitation du nombre de boucle dans le temps
if(SDL_GetTicks() - Objet.temps < 20)
{SDL_Delay(20 -(SDL_GetTicks() - Objet.temps));}
//comme le nombre de boucle est limite on est sur que delta_T ne sera pas nul
Objet.delta_T = SDL_GetTicks() - Objet.temps;
//Par definition a = dV/dt <=> a * dt = dV
Objet.delta_vitesse.y = Objet.acceleration.y * Objet.delta_T;
//la vitesse sera la somme des variations de vitesse
Objet.vitesse.y += Objet.delta_vitesse.y;
/*par definition V = dOM/dt, ou OM est la position de l'objet M par rapport a l'origine O.
on en deduit : dOM = v * dt */
Objet.delta_position.y = Objet.vitesse.y * Objet.delta_T;
//la position sera la somme des variations de position
Objet.position_affichage.y += Objet.delta_position.y;
/*gestion d'une collision elastique avec le bas de l'ecran :
si l'objet sort de l'ecran (par le bas) alors on lui
donne une vitesse oppose ce qui genere le rebond.*/
if(Objet.position_affichage.y > ecran->h -50)
{Objet.vitesse.y = -Objet.vitesse.y;}
}
Voila ma boucle principale, le soucis avec cette boucle c'est que l'objet rebondit plus haut qu'il ne devrait... et je ne vois pas d'où ça peut venir. Si quelqu'un vois ou est mon erreur.
Merci
|
|
dimanche 25 octobre 2009 à 18:47:55 |
Re : moteur physique

daddou24
|
Bonjour,
Essaye une méthode d'intégration plus précise comme l'algorithme de verlet (voir wikipedia), et puis mettre un petit coef (genre 0.9) qui réduit la vitesse de ton mobile aprés un choc.
Bon courage,
Damien.
|
|
dimanche 25 octobre 2009 à 22:57:43 |
Re : moteur physique

Jackyzgood
|
Merci à toi pour ta réponse. J'ai cherché l'algorithme de Verlet et il y à quelques passage que j'ai pas compris, notamment sur l'ajout des termes de degrés 2.
http://upload.wikimedia.org/math/c/5/b/c5bf2e37ccac3265987017e65f1228d2.png
Dans cette formule (si j'ai bien compris)
le terme x(t + delta_t) correspond à la position suivante.
Le terme v(t)delta_t correspond au déplacement durant le temps delta_t.
Le terme a(t)delta_t²/2 est également équivalent au déplacement durant le temps delta_t.
Et c'est ça que je ne comprends pas. Pourquoi faire apparaitre 2 fois le déplacement ?
|
|
lundi 26 octobre 2009 à 15:58:14 |
Re : moteur physique

juju12
|
C'est pas directement la formule, ça, c'est simplement un développement limité.
Les formules sont également ici, peut-être plus clair :
http://en.wikipedia.org/wiki/Leapfrog_integration
le principe est de calculer un coup la vitesse et un coup la position.
L'avantage de ce schéma est la conservation de l'énergie totale.
|
|
vendredi 6 novembre 2009 à 12:14:46 |
Re : moteur physique

Jackyzgood
|
J'ai réussi à faire ce que je voulais
http://www.youtube.com/watch?v=1CNn3VX9RkA&feature=player_embedded
Comme vous pouvez le voir sur cette vidéo, quelques rares points arrivent à traverser lignes avec lesquelles ils rentrent en collision.
Pour gérer les collisions, je chronomètre la boucle principale, je calcule la position suivante et crée 2 vecteurs, avec les 2 points et une extrémité d'une droite. Ensuite je regarde les angles entre la droite et le vecteur position, puis avec le vecteur position suivante. S'il y a changement de signe c'est que le point va traverser la droite, c'est à ce moment là que je déclenche la collision.
Voila la fonction qui gère les collision, je ne vois pas ou j'ai pu commettre une erreur et pourquoi certain point arrive a se faufiler entre les conditions.
Code C/C++ : #include "structures.h"
int fonction_collision(struct structure_objet_physique *Objet, struct Structure_geometrique_ligne Ligne)
{
//creation du vecteur représantant la ligne
struct Structure_geometrie_vecteur Vecteur_ligne;
Vecteur_ligne.x = 0;
Vecteur_ligne.y = 0;
fonction_coordonnees_vecteur(&Vecteur_ligne, Ligne.x[0], Ligne.y[0], Ligne.x[1], Ligne.y[1]);
//création du vecteur position par rapport a la ligne
struct Structure_geometrie_vecteur Vecteur_position_relative;
Vecteur_position_relative.x = 0;
Vecteur_position_relative.y = 0;
fonction_coordonnees_vecteur(&Vecteur_position_relative, Ligne.x[0], Ligne.y[0], (*Objet).Vecteur_position.x, (*Objet).Vecteur_position.y);
//calcul de la position suivante
struct Structure_geometrie_vecteur Vecteur_position_relative_suivante;
Vecteur_position_relative_suivante.x = 0;
Vecteur_position_relative_suivante.y = 0;
fonction_coordonnees_vecteur(&Vecteur_position_relative_suivante, Ligne.x[0], Ligne.y[0], (*Objet).Vecteur_position_suivante.x, (*Objet).Vecteur_position_suivante.y);
//calcul de la difference de position
struct Structure_geometrie_vecteur Vecteur_delta_position;
Vecteur_delta_position.x = 0;
Vecteur_delta_position.y = 0;
fonction_coordonnees_vecteur(&Vecteur_delta_position, (*Objet).Vecteur_position.x, (*Objet).Vecteur_position.y, (*Objet).Vecteur_position_suivante.x, (*Objet).Vecteur_position_suivante.y);
//calcul de l'angle entre les vecteurs
double angle_initial = fonction_angle_entre_vecteur(&Vecteur_ligne, &Vecteur_position_relative),
angle_final = fonction_angle_entre_vecteur(&Vecteur_ligne, &Vecteur_position_relative_suivante),
angle_delta_position = fonction_angle_entre_vecteur(&Vecteur_ligne, &Vecteur_delta_position);
if( ((angle_initial > 0 && angle_final < 0) || (angle_initial < 0 && angle_final > 0))
&& fonction_produit_scalaire(&Vecteur_ligne, &Vecteur_position_relative) > 0
&& fonction_produit_scalaire(&Vecteur_ligne, &Vecteur_position_relative) < fonction_norme_vecteur(&Vecteur_ligne) * fonction_norme_vecteur(&Vecteur_ligne))
{
(*Objet).Vecteur_position_initiale.x = (*Objet).Vecteur_position.x;
(*Objet).Vecteur_position_initiale.y = (*Objet).Vecteur_position.y;
(*Objet).Vecteur_vitesse_initiale.x = 0.7*(*Objet).Vecteur_vitesse.x;
(*Objet).Vecteur_vitesse_initiale.y = 0.7*(*Objet).Vecteur_vitesse.y;
fonction_rotation_vecteur(&((*Objet).Vecteur_vitesse_initiale), (-2*angle_delta_position));
(*Objet).temps_initial = SDL_GetTicks();
return 1;
}
else {return 0;}
}
|
|
Cette discussion est classée dans : ecran, objet, position, sdl, vitesse
Répondre à ce message
Sujets en rapport avec ce message
Message d'erreur avec SL [ par Maximi ]
Bonjour je débute avec C++ et SDL, je travaille avec VC++ 6.J'ai fait un tout petit programme et mon problème, est le suivant :je compile le code et c
Problème pour calculer le H pour l'A star ( * ) [ par jedinos ]
Bonjour à tous ! [url=http://www.siteduzero.com/tutoriel-3-34333-le-pathfinding-avec-a.html]Dans ce tuto du pathfinding A star[/url] , l'auteur ne no
Coordonnes souris en SDL [ par lamiae89 ]
Je suis entrain de travailler sur une interface graphique en sdl , pour faire un jeu .Je veux ecrire chaque chiffre là où j'avais cliqué avec la souri
Problème pour afficher des images PNG en SDL [ par jedinos ]
Bonjour à tous ! Voilà, en suivant attentivement le cour de programmation en C du site du zéro, j'ai pu il y a quelques jours ( enfin ) commencer la
fenetre [ par keegs ]
Bonsoir Je débute dans la programmation, mais voila j ai un petit soucis, je n arrive pas a résoudre le problème a chaque fois que je mais compiler i
probleme jeu du labyrinthe (SDL) [ par abggba ]
Slt tout le monde, bon voila j'ai un probleme avec mon programme qui seg fault! et en plus il n'affiche que les murs alors qu'ne fait je voudrais qu'i
problème de boucle pour un affichage SDL [ par sparox1 ]
Bonjour à tous, j'ai établis un début de programme de poker pour un projet à rendre dans la fin de cette année scolaire, ce programme tire 5 cartes au
Tetris game [ par hindou11 ]
Bonjour, je viens de me lancer dans la SDL, mais il se trouve que je plante un peu......je suis entrain de programmer le jeu du tetris mais je m'emb
[jeu 2d] Snake ,petit bug jeu [ par zakuza ]
Bonjour à tous , je suis entrain de m'amuser à programmer un petit snake histoire de pratiquer,bon il ne fonctionne pas trop mal mais j'ai quelques bu
Bibliothèque SDL [ par haarp6 ]
Bonsoir à tous, je bosse en ce moment sur un petit démineur en SDL, donc je viens de commencer dessus, et mon code me génère une exception non gérée.
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|