begin process at 2012 05 30 07:05:33
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

OpenGL

 > 

Quelle est la meilleur solution pour deplacer des objets independemment


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Quelle est la meilleur solution pour deplacer des objets independemment

dimanche 16 avril 2006 à 12:36:44 | Quelle est la meilleur solution pour deplacer des objets independemment

adess00

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
dimanche 16 avril 2006 à 12:55:41 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

luhtor

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.
lundi 17 avril 2006 à 16:37:19 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

dletozeun

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.


lundi 17 avril 2006 à 16:51:56 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

adess00

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
lundi 17 avril 2006 à 17:58:52 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

dletozeun

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...

lundi 17 avril 2006 à 18:05:47 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

adess00

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
mardi 18 avril 2006 à 22:39:40 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

dletozeun

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!
mercredi 19 avril 2006 à 03:28:19 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

adess00

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+
mercredi 19 avril 2006 à 20:59:40 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

dletozeun

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...
mercredi 19 avril 2006 à 21:02:55 | Re : Quelle est la meilleur solution pour deplacer des objets independemment

adess00

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


Cette discussion est classée dans : solution, objet, meilleur, gltranslatef, objets


Répondre à ce message

Sujets en rapport avec ce message

[Allegro] Animation d'objets [ par GoldenEye ] La situation est simpleOn est en true color (Allegro)J'ai un décor de fond statique (BITMAP *decor)J'ai un petit objet mobile (BITMAP *objet)Le petit creation d'objets dans une boucle [ par sampq ] Je cree un objet dans une boucle que je donne en parametre à un autre objet, un truc du style:for(int i=0; i{ objet_1 o1(i); objet_2 o2( pb avec delete c++ [ par djl ] je cree un tableau d'objets dynObjet** objets;objets = new Objet*[l];for(int i=0;icomment on le detruit?car je fait cafor(int i=0;idelete[] objets;e de l'objet et du c++ pour un debutant [ par zarbiman ] salut tout le monde, je debute en c++ objet, et j'ai un petit probleme: j'ai un projet qui utilise des objets, mais dans les fichiers headers que j'ai gestion d'une multitude d'objets, interactions dans l'espace [ par cppdupdup34 ] alors voila j'ai une petite question !Comment gerer une multitude d'objets géométriques dans un espace tridimensionnel ?A titre d'exemple, sur une map Tri de tableau d'objets... [ par dbiare ] Bonjour J’ai un petit souci en Visual C++6… Je détiens, après traitement, deux indices (i et j) d’un même tableau d’objet : m_oaBras[]. Je dois permut plan de coupe 3D sur objet [ par jcloupgarou ] Bonjour,je réalise un modeleur pour un projet info et je dois ajouter un outil permettant de faire des plans de coupe 3d des objets modélisés, donnant utilisation de delete sur des objets... ca marche comment ? [ par vincemail ] Bonjour, je voudrais savoir comment fonctionne delete sur des objets.. Par exemple j'ai un objet Tableau qui contient un membre *tableau (qui est bien Tableau d'objets [ par nisaloncaje ] Bonjour, je suis débutant en c++ et j'aimerais savoir comment faire pour créer un tableau dynamique d'objets, c'est à dire un tableau d'objet donc je objet coller à la caméra [ par dark_naruto25 ] Salut tout le monde, Je suis un bon didacticiel sur OpenGL, et j'arrive au niveau des projections. L'exercice final propose de créer une scène composé


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 3,744 sec (4)

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