Quelle est la meilleur solution pour deplacer des objets independemment

adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 - 16 avril 2006 à 12:36
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 - 19 avril 2006 à 21:02
Coucou

Je fais un structure qui enregistre la position de chaque objets dans ma scene
Et je voudrais savoir quelle est la meilleur methode
Voici celle que j utilise

Je pas du point (0,0,0)
glTranslatef(0,2,0); //Translation de l objet
glRotatef(rz,0,1,1);//Rotation de l objet
glBegin(GL_QUADS);
//Construction de la figure
glEnd();
glRotatef(-rz,0,1,1); //Je revien dans la position initiale
glTranslatef(0,-2,0); // Je revien au point (0,0,0)

Je trace mon nouvel objet
glTranslatef(2,0,0);
glBegin(GL_QUADS);
//Construction de la figure
glEnd();

Je voudrais donc savoir si cette methode utilise trop de ressources ou si il y a un moyen de retourner au point d origine a l aide d une fonction

Merci de vos conseils

9 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 avril 2006 à 12:55
glPushMatrix/glPopMatrix pour sauvegarger une matrice et la récupérer.
Une matrice sauvegardé doit absolument etre récupérée. Tu penses
bien, c'est un système de pile.



Sinon évidemment glTranslatef c'est pas terrible, mais glBegin non
plus. Donc tant que tu ne cherches pas la performance, tu t'en fou.
Comme tu débutes, utilise donc ce que tu trouves le plus simple.
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
17 avril 2006 à 16:37
lool Ca y est luhtor essaie de convertir tout le monde au VBO!



Pour revenir au sujet, adess00 je vois que t'a l'air bien embeté avec ces transformations

D'abord il est inutile de refaire toutes les transformations en sens
inverse pour dessiner tous tes objets independemment dans la scene...

Puisque avec les fct glRotatef glTranslatef tu ne fais que modifier ( c
opengl qui le fait) la matrice MODELVIEW celle qui contient toutes les
info de transformations a appliquer au mesh en multipliant celle ci
avec la matrice des coordonnées de chaque vertex ( je sais pas quel ton
niveau en math donc peut etre que c'est du chinois ce que je dis...)
Donc bref dans cette matrice ya toutes les info pour placer ton objet
la ou tu le souhoite avec glTranslatef et le tourner comme tu veux avec
glRotatef



Or si tu veux reinitialiser tout ca comme tu a l'air de vouloir le
faire il faut tout simplement reinitialiser la matrice pour revenir a
l'origine du repere de la scene ( et desormais toute les transfo
precedentes seront effacé et les coordonnées des vertex seront
invariante par multiplication de leur matrice avec la matrice MODELVIEW
)

la commande c'est glLoadIdentity();

Et donc LA tu peux dessiner ton deuxieme en retranslatant depuis l'origine et tourner dans tous les ens que tu veux.



Donc au final ca donne ca:

glLoadIdentity();

glTranslatef(0,2,0); //Translation de l objet

glRotatef(rz,0,1,1);//Rotation de l objet

glBegin(GL_QUADS);

//Construction de la figure

glEnd();



glLoadIdentity();

Je trace mon nouvel objet

glTranslatef(2,0,0);

glBegin(GL_QUADS);

//Construction de la figure

glEnd();



ici il n'est pas necessaire d'utiliser glPushMatrix et glPopMatrix
puisque la matrice est juste egale a l'identité a chaque frame...



D'ailleurs j'ai jamais vraiment vu l'utilité de ces fcts ( enfin je
sais que ca permet de sauvegarder la mtrice du dessus de la pile et la
rappeler) mais ce que je veux dire c'est j'ai encore pas vu d'app
opengl ou on utilisais une matrice depart autre que l'identité et dans
ce cas la ya juste besoin de glLoadIdentity()

Mais en tout cas je ne dis pas que c'est pas utile...puisque dnas la
matrice PROJECTION ca sert quand on veux passer de la projection en
prespective a la proj orthogonale ou en coordonnées 2D...

Bref j'arrete de m'etaler parce que ca ca reponds plus a la question



Voila j'espere que t'a compris. Si t'a pas compris c pas grave n'hesite pas a demander ce qui te pose prb.
0
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
17 avril 2006 à 16:51
Je c est ce qu est une matrice mais je m en suis jamais servi en maths mais je crois comprendre a peu pres comment marche le reset

Mais, sa ne marche pas j ai virer les push/pop matrix et j ai mi un glLoadIdentity(); pour revenir a l origine du repere apres avoir effectué des translations mais il ne m affiche pas le resultat voulu
Je vois un gros truc vert transparent (ce qui doi etre la face avant de mon cube) mais normalement il est au centre et tres visible alors que la rien j ai essayer de reculer en z rien donc pour l instant je garde la metode de luthor :)


PS : trop fort ton message sur l autre sujet
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
17 avril 2006 à 17:58
lol ben il faut que tu place ta camera ou il faut....et puis faut pas
que tu effectues ces transformations sur la camera...il y a plein de
parametres qui peuvent faire que tu ne vois rien au depart...en gros il
faudrait que tu poste ta fct de rendu pour que l'on voie ce qui ne vas
pas....

J'ai surement raté un episode...c'est quoi la methode de luhtor??? Je la vois pas la...

Si c'est juste le machin avec les glPushMatrix et glPopMatrix ben je te
dis ca sert a rien dans ton cas puisque tu pars de la matrice identité
a chaque rendu...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
17 avril 2006 à 18:05
ok je poste ma fonction

const int NB_CUBE=30;

//--------------VARIABLES
float rz=0;
float x=0;
extern bool keys[256];

float camerax=0,cameray=4,cameraz=-80;

Objet cube[NB_CUBE];
Objet sol;

//Initalisation des objets
void InitObjet()
{
int i,j=0;

for (i=0;i!=NB_CUBE;i++)
{
cube[i].centreg.x=0;
cube[i].centreg.y=0;
cube[i].centreg.z=0;
cube[i].position.x=(3*i)%36;
if ((3*i)%2==0) {j++;}
cube[i].position.y=10;
cube[i].position.z=3*j;
cube[i].vitesse.x=0;
cube[i].vitesse.y=0;
cube[i].vitesse.z=0;
cube[i].masse=(i+1);
cube[i].rayon=1;
cube[i].transforce=1;
}

//sol
cube[0].rayon=20;
cube[0].position.x=10;
cube[0].position.y=-30;
cube[0].position.z=20;
cube[0].vitesse.x=0;
cube[0].vitesse.y=0;
cube[0].vitesse.z=0;
cube[0].transforce=0;
cube[0].masse=0;

cube[1].masse=2;

}

int DrawGLScene() // Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity();

if (keys[VK_NUMPAD8]==1) {cameraz+=1;}
if (keys[VK_NUMPAD5]==1) {cameraz-=1;}
if (keys[VK_NUMPAD4]==1) {camerax+=1;}
if (keys[VK_NUMPAD6]==1) {camerax-=1;}

if (keys[VK_UP]==1) {cube[1].vitesse.y+=0.01;}
if (keys[VK_DOWN]==1) {cube[1].vitesse.y-=0.01;}
if (keys[VK_LEFT]==1) {cube[1].vitesse.x+=0.01;}
if (keys[VK_RIGHT]==1) {cube[1].vitesse.x-=0.01;}
if (keys[VK_SPACE]==1) {InitObjet();}

//---------------------------------------------evenements physiques
int i;
//motion
for (i=0;i!=NB_CUBE;i++)
{
cube[i].position.x+=cube[i].vitesse.x;
cube[i].position.y+=cube[i].vitesse.y;
cube[i].position.z+=cube[i].vitesse.z;
}
//gravity
float f;

for (i=0;i!=NB_CUBE;i++)
{
f=cube[i].masse*-0.001;
cube[i].vitesse.y+=f;
}
//collision
int i1=0,i2=0; //indices pour les objets
float px1,py1,pz1,px2,py2,pz2,r1,r2,tmp; //pour simplifier les var de la structure
float dcx,dcy,dcz; //distance de collision en x,y,z
int nb_objet=NB_CUBE; //nombre d objets
int nb_collision=(nb_objet-1)/2*nb_objet; //nombre de collisions possibles

for (i=0;i<nb_collision;i++)
{
i2++;
i2%=nb_objet;
if (i2==0) {i1+=1;i2=i1+1;}

px1=cube[i1].position.x;
py1=cube[i1].position.y;
pz1=cube[i1].position.z;
px2=cube[i2].position.x;
py2=cube[i2].position.y;
pz2=cube[i2].position.z;
r1=cube[i1].rayon;
r2=cube[i2].rayon;

if (!(cube[i1].vitesse.y==0 && cube[i2].vitesse.y==0)) //si les 2 objets ne sont pas immobiles
{
//on retrouve la distance separant les 2 points sur chaque axe
if (py2-py1<0) {dcy=py1-py2;} else {dcy=py2-py1;}
if (px2-px1<0) {dcx=px1-px2;} else {dcx=px2-px1;}
if (pz2-pz1<0) {dcz=pz1-pz2;} else {dcz=pz2-pz1;}

if (dcx < r1+r2 && dcy < r1+r2 && dcz < r1+r2)
{
//on transfere les forces en X avec un coeff d amplitude
tmp=cube[i1].vitesse.x;
cube[i1].vitesse.x=cube[i2].vitesse.x*cube[i1].transforce;
cube[i2].vitesse.x=tmp*cube[i2].transforce;
//on transfere les forces en Y avec un coeff d amplitude
tmp=cube[i1].vitesse.y;
cube[i1].vitesse.y=cube[i2].vitesse.y*cube[i1].transforce;
cube[i2].vitesse.y=tmp*cube[i2].transforce;
//on transfere les forces en Z avec un coeff d amplitude
tmp=cube[i1].vitesse.z;
cube[i1].vitesse.z=cube[i2].vitesse.z*cube[i1].transforce;
cube[i2].vitesse.z=tmp*cube[i2].transforce;
}
}
}

//---------------------------------------------------------------------



//------------camera
gluLookAt(camerax,cameray,cameraz,0,0,0,0,1,0);

//---cube
glDisable(GL_BLEND);
//int i;
for (i=1;i!=NB_CUBE;i++)
{
glPushMatrix();

glTranslatef(cube[i].position.x,cube[i].position.y,cube[i].position.z);
//glRotatef(rz,0,1,0);
glBegin(GL_QUADS);
glColor3f(0.1,0.6,0.6);
glVertex3f(-1,-1,-1);glVertex3f(1,-1,-1);glVertex3f(1,1,-1);glVertex3f(-1,1,-1);
glColor3f(0.1,0.6,0.6);
glVertex3f(-1,-1,1);glVertex3f(1,-1,1);glVertex3f(1,1,1);glVertex3f(-1,1,1);
glColor3f(0.4,0.4,0.6);
glVertex3f(-1,-1,-1);glVertex3f(-1,-1,1);glVertex3f(-1,1,1);glVertex3f(-1,1,-1);
glColor3f(0.4,0.4,0.6);
glVertex3f(1,-1,-1);glVertex3f(1,-1,1);glVertex3f(1,1,1);glVertex3f(1,1,-1);
glColor3f(0.7,0.4,0.6);
glVertex3f(-1,-1,-1);glVertex3f(-1,-1,1);glVertex3f(1,-1,1);glVertex3f(1,-1,-1);
glColor3f(0.7,0.4,0.6);
glVertex3f(-1,1,-1);glVertex3f(-1,1,1);glVertex3f(1,1,1);glVertex3f(1,1,-1);
glEnd();
glPopMatrix();
}

//--sol
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glEnable(GL_BLEND);
glColor4f(1,1,1,0.6);
glPushMatrix();

glTranslatef(cube[0].position.x,cube[0].position.y,cube[0].position.z);
//glRotatef(rz,0,1,0);
glBegin(GL_QUADS);
glColor3f(0.1,0.6,0.6);
glVertex3f(-20,-20,-20);glVertex3f(20,-20,-20);glVertex3f(20,20,-20);glVertex3f(-20,20,-20);
glColor3f(0.20,0.6,0.6);
glVertex3f(-20,-20,20);glVertex3f(20,-20,20);glVertex3f(20,20,20);glVertex3f(-20,20,20);
glColor3f(0.4,0.4,0.6);
glVertex3f(-20,-20,-20);glVertex3f(-20,-20,20);glVertex3f(-20,20,20);glVertex3f(-20,20,-20);
glColor3f(0.4,0.4,0.6);
glVertex3f(20,-20,-20);glVertex3f(20,-20,20);glVertex3f(20,20,20);glVertex3f(20,20,-20);
glColor3f(0.7,0.4,0.6);
glVertex3f(-20,-20,-20);glVertex3f(-20,-20,20);glVertex3f(20,-20,20);glVertex3f(20,-20,-20);
glColor3f(0.7,0.4,0.6);
glVertex3f(-20,20,-20);glVertex3f(-20,20,20);glVertex3f(20,20,20);glVertex3f(20,20,-20);
glEnd();
glPopMatrix();

rz+=0.5;

return TRUE; // Keep Going
}

voila
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
18 avril 2006 à 22:39
Et ca marche comme ca non? J'ai regardé rapidement et je pense qu'il n'y a pas d'erreurs...
Et oui maintenant que je vois exactment ce que tu veux faire ta methode est la bonne avec les glPushMatrix et glPopMatrix puisque si tu mettais un glLoadIdentity a la place dans ta boucle for tu reinitialiserais la position de la camera aussi...et alors tu serais obligé de refaire un gluLookAt a chaque fois ce qui est moins performant!

Sinon je me permet de faire d'autrres remarques a la vue de ton code, notamment sur la presentation
Rien de grave! Mais en fait le truc qui me derange c'est que tu melange rendu test du clavier , moteur physique etc dans la meme fct...et c'est pas tres propre...
Pour l'instant vu que c'est pas tres compliqué on s'y retrouve mais apres...hum. donc fais des fcts specifiques a chaque taches...
Et je sais pas comment tu initilalise ta fenetre mais par exemple sous win il est inutile de tester les touches a chaque rendu ou inversement de faire un rendu des que tu appuis sur une touche...
Parce tel que c'est fais dans ta fct le rendu et le clavier sont liés...et donc tu devrais faire une fct qui des que l'on appuis sur une touche ( n'importe laquelle) alors on teste quelle touche a été enfoncée...voila bonnne continuation!
0
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
19 avril 2006 à 03:28
Oui sa marche comme sa :)
Pour les tests dans winmain je met le keys[touche] a 1 quand elle est enfoncée et inversement ensuite je gere la vitesse dans le rendu je trouve sa plus simple mais si sa empiete sur les performances je changerai
Sinon pour mon moteur physique j ai fait mon physic.c lool mais le probleme est que je n arrive pas a acceder aux variables de ma structure depuis ce fichier pourtant j ai mi extern Objet; donc j ai tout foutu dans le meme fichier en attendant mais c vrai que sa pas propre lol

Merci de tes reponses
a+
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
19 avril 2006 à 20:59
LOOOL...t'as encore des problemes avec ca?
Bon j'ai pas compris de quelle structure tu parlais...mais je vais t'expliquer vite fais comment ca marche avec plusieurs fichiers sources:

c'est simple a chaque fichier source ( ex source1.c) tu associes un header file ( ex Hsource1.h). et donc cet header va te servir a declarer la presence de certaines variables que utilise ce fichierb a d'AUTRES fichiers.
La methode est la suivante:
Pour toutes les variables dont tu as besoin dans plusieurs fichiers tu les declacrent une fois dans ton header avec un 'extern' devant son type ( et surtout tu initialise surtout pas cette variable dans le header) ensuite tu redeclare cette var ( ou meme structure) dans le fichier source source associé en incluant l'heder dans ce fichier par un #include "machin truc".Et LA tu peux initialiser tes variables externes dans le fichier source.
Et puis ensuite dans tous les fichiers sources ou t'a besoin de ces variables t'a juste a inclure le Hsource1.h!!!
Voila tu vois c'est pas bien compliqué!

Et non le fait de tester les touches dans la boucle de rendu c'est pas bon pour les perfs...d'autant plus que ca veux dire que tu est obligé de rafraichier l'ecran a chaque fois que tu appuis sur une touche et il peux arriver que cette touche n'ai pas d'influence sur l'ecran et donc le rendu est alors inutile...
0
adess00 Messages postés 261 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 27 septembre 2008 1
19 avril 2006 à 21:02
OK merci
Vu que c est pour coder mon moteur physique je vais laisser sa comme sa pour l instant jle mettrai correctement quand mon appli sera operationnelle
0
Rejoignez-nous