Début d'un moteur physique

Soyez le premier à donner votre avis sur cette source.

Vue 11 997 fois - Téléchargée 964 fois

Description

Et bien voila mon premier programme en OpenGL et mon premier post sur cppfrance :)
J'utilise glut pour gérer les fenêtres mais le programme a aussi besoin de glaux.dll

J'essaie de créer un moteur physique d'après les lois de la mécanique classique et avec mes petites connaissances de SUP.
Pour ceux qui comprendront, le moteur se base sur l'approximation d'Euler
(en gros: f(x+h) = f(x) + f'(x) * h = f(x) + (f''(x)*h) * h avec cela, on fait de belles choses ^_^)

C'est également mon premier programme utilisant à l'orienté objet, donc si je pouvais avoir vos remarques :) mis à part le faire que toutes les classes sont en accès public)
De plus si quelqu'un pouvait me dépanner et m'expliquer comment éviter ma bidouille ligne 293 de main.cpp. (Utilisation de glPushMatrix et glPopMatrix)

Avant de compiler, je vous conseille de lire le fichier d'instructions (c'est pas long).
En résumé, pensez à modifier la ligne 15 de main.cpp qui contient la fréquence de mon processeur (750Mhz) remplacer la valeur par la votre. (ATTENTION: la fréquence doit etre en Mhz).

Touches de commandes:
- flèches du clavier numérique
- rotation a la souris, en maintenant le bouton gauche appuyé.
- +/- règle l'écoulement du temps
- s => active ou désactive une sphère spéciale (juste pour visualisez les interactions physiques)
- PAGE_UP et PAGE_DOWN modifie la position selon l'axe z de cette dernière
- ESPACE replace les boules dans leur état initiale (ATTENTION la fonction est bugger, comprend pas encore bien pourquoi donc éviter de l'utiliser, regardez les commentaires dans la source elle même pour avoir des précisions)

Conclusion :


Mon prochain objectif est de gérer les ensembles de solides, par exemple deux sphères reliées entre elle par une tige indéformable. De plus, il faut que je fasse intervenir la masse des sphères. Les classes sont prêtes mais pas encore le programme ^^

Apparemment, il faut que je poste ici les bugs connus:
A part la barre d'ESPACE, je n'ai pas remarqué d'autres bugs particulier. Notez que si vous modifiez au hasard les valeurs initiales des forces et des particules dans la source vous pouvez obtenir des choses très rapidement délirantes, pas dans le sens abérantes, mais vous risquez d'être surpris. Notamment il peut arriver que des sphères dans des conditions particulières acquièrent énormement de vitesse, et traversent la paroi des murs. Théoriquement c'est impossible, le mur réprésente normalement un pic infini d'énergie potentielle, mais approximation d'Euler oblige...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
J'ai noté l'histoire des librairies.

Pour la gravité, elle ne m'intéresse pas particulièrement. Mais suffit juste de déclarer la force.
Donc j'ai remis à jour le programme avec la gravité, ca a juste pour effet de diminuer la position en z de l'équilibre puisque toutes les particules ont été défini avec la meme masse, donc c'est normal.

En considérant que le sol (le parquet) est la surface terrestre, on peut rajouter ligne 111:
infinite_newton_force_field gravity(0,-9.81,0,0,-cub_c_i,0,1,0);
C'est à dire une force F = 0/x^2 - 9.81 créer par le plan défini par le point (0, -cub_c_i, 0) et de normal (0,1,0).

Il faut ensuite dire au programme d'appliquer cette force aux particules. Sachant que tout n'est pas encore automatisé avec des fonctions, il faut rajouter les 4 lignes de code suivante à la ligne 329 de main.cpp juste avant
"if (active_force_central)" :

d = Scal(part[i].p->x - gravity.p->x, part[i].p->y - gravity.p->y, part[i].p->z - gravity.p->z, gravity.n_vector.x, gravity.n_vector.y, gravity.n_vector.z);
part[i].acc_x += gravity.n_vector.x * gravity.eval(d);
part[i].acc_y += gravity.n_vector.y * gravity.eval(d);
part[i].acc_z += gravity.n_vector.z * gravity.eval(d);

d n'est ici que la distance de la particule au sol.

Seulement ca ne marche pas. En effet le constructeur de la classe est erroné. J'utilise toujours la fonction membre "set", donc je m'en suis jamais apercu.
Il faut donc également rajouter les 2 lignes suivantes:
cte1 = c1;
cte2 = c2;
à la ligne 110 de class_object.h

Sinon vous pouvez toujours accéder aux éxécutables sur le ftp suivant (si j'ai ouvert le serveur):
luhtorftp.serveftp.com
name: cppfrance
pass: cppfrance

Ca permet dans le cas où il y a des problèmes de compilations de voir le résultat.
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

remplace la liste des librairies que tu as liées au projet par ça:

-lglaux
-lglu32
-lglut32
-lglut
-lopengl32

ça permettra à d'autres de compiler ton projet. sans ça je pouvais pas compiler. j'ai du commenter glutSpecialUp aussi, ma version de glut connaissait pas (prtant j'ai la dernière normy).

il y a de la gravité qq part ?
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
En effet c'est étrange le tableau de texture n'est pas de taille suffisante, pourtant, mon prgm ne m'a jamais planté au chargement :)
J'ai également corrigé l'utilisation de glGenTexture. J'avais pris ca d'un tutoriel qui n'utilisait qu'une texture, je me suis planté en extrapolant la fonctionnement a plusieurs :)

Sur l'utilisation de glPushMatrix, j'aurais du y penser sachant que j'avais remarqué que pour 2 particules je n'avais pas de problème, merci pour le coup de main.
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014

Je reviens par rapport à l'utilisation de glPushMatrix et glPopMatrix et à la façon dont tu les utilise

glPushMatrix sauvegarde la martrice courante dans une pile
on effectue quelques modifications du point de vue, rotations, translations, ect
glPopMatrix rappelle la matrice sauvegardée et !!! la retire de la pile !!!
par rapport à ton code, je pense que le glPushMatrix devrait tout simplement ?__? être dans la boucle, en graos, dans le processus de génération d'une scène, il doit y avoir un appel à glPopMatrix qui doit suivre glPushMatrix et donc autant d'appels à l'un qu'à l'autre

si plus d'appels à glPushMatrix, risque de plantage par dépassement de pile (jamais testé mais à mon avis ca génère seulement une erreur opengl)
si plus d'appels à glPopMatrix, ca génère une erreur et il n'y a pas de reload de matrice

copier/coller de msdn :
It is an error to push a full matrix stack, or to pop a matrix stack that contains only a single matrix. In either case, the error flag is set and no other change is made to the OpenGL state.

The following are the error codes generated and their conditions.

Error Code Condition
GL_STACK_OVERFLOW glPushMatrix was called while the current matrix stack was full.
GL_STACK_UNDERFLOW glPopMatrix was called while the current matrix stack contained only a single matrix.
GL_INVALID_OPERATION glPushMatrix was called between a call to glBegin and the corresponding call to glEnd.


penses à tester les erreurs si le programme ne fait pas ce que tu t'attendais qu'il fasse ;-))
bon courage
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014

Salut, problème avec le code : j'ai rencontré des problème de plantage au chargement des textures à cause d'une erreur : tu charges 3 textures dans un tableau ne pouvant en contenir que 2 :
ligne 444 : AUX_RGBImageRec *TextureImage[2];

et ensuite, petite erreur ne provoquant pas d'erreur, l'utilisation de la fonction glGenTextures :
en fait, tu fais 3 fois appel à la fonction avec à mon avis une confusion sur le premier paramètre
en fait, le premier paramètre indique combien de génération de texture tu veux, par conséquent si tu veux allouer de la place pour 3 texture, un seul appel à glGenTextures est suffisant,, et dans ton cas tu as juste à faire :
glGenTextures(3,texture);là on demande 3 places de textures dont les numéros vont êtres stockés dans le tableau "texture" (qui doit être de la bonne taille, ce qui est le cas dans le prog)

sinon c'est sympa comme prog, j'aime bien ;-))

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.