DÉBUT D'UN MOTEUR PHYSIQUE

Messages postés
231
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014
- - Dernière réponse : luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
- 25 oct. 2004 à 19:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/27055-debut-d-un-moteur-physique

Afficher la suite 
luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
4 -
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.
cs_Kirua
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 ?
luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
4 -
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.
shenron666
Messages postés
231
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
shenron666
Messages postés
231
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 ;-))