begin process at 2010 03 13 16:46:56
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

OpenGL

 > DÉBUT D'UN MOTEUR PHYSIQUE

DÉBUT D'UN MOTEUR PHYSIQUE


 Information sur la source

Note :
9 / 10 - par 2 personnes
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :OpenGL Niveau :Débutant Date de création :24/10/2004 Date de mise à jour :25/10/2004 19:21:57 Vu / téléchargé :8 354 / 774

Auteur : luhtor

Ecrire un message privé
Site perso
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

25 octobre 2004 11:59:41 :
Bon j'ai corriger les quelques erreurs qu'on m'a signalé.
25 octobre 2004 19:21:58 :
Juste quelques petites corrections et l'ajout de la gravité.

 Sources du même auteur

Source avec Zip Source avec une capture PICKING OPENGL(GLUT) / INTERPOLATION BÉZIER,B-SPLINE,CATMULR...

 Sources de la même categorie

Source avec Zip Source avec une capture SCREENSAVER OPENGL DEV C++ par bobby03
Source avec Zip Source avec une capture LEÇON 13 NEHE EN FRANÇAIS OPENGL DEV C++ par bobby03
Source avec Zip JEU DE DAMES 3D par vbclaude
Source avec Zip CHARGEMENT DES TEXTURES EN OPENGL par Jackyzgood
Source avec Zip Source avec une capture OPENGL - UN PEU DE NEIGE... par underprog

Commentaires et avis

Commentaire de shenron666 le 25/10/2004 10:02:32

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 ;-))

Commentaire de shenron666 le 25/10/2004 10:14:12

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

Commentaire de luhtor le 25/10/2004 10:40:48

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.

Commentaire de Kirua le 25/10/2004 17:14:36

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 ?

Commentaire de luhtor le 25/10/2004 19:19:15

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.

 Ajouter un commentaire




Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales