Partage
  • Partager sur Facebook
  • Partager sur Twitter

[OpenGL] - Se situer

Besoin d'aide !

Sujet résolu
    13 juin 2007 à 16:01:22

    Salut à tous ! J'en peux plus, ça fait deux heures que je cherche le pourquoi du comment, je n'arrive pas à comprendre la position dans un repère en 3D. Par exemple, je place une gluLookAt(1, 1, 1, 0, 0, 0, 0 ,1 , 0);. Ca veut bien dire que ma caméra est se situe à 1 en abscisse, en ordonée et qu'elle est surellevée par rapport au plan de 1 en hauteur ? Ensuite, je dessine juste un rectangle de manière à obtenir le côté droit (lorsqu'on le regarde), d'un carré.

    glVertex3d(0, 0, 0);
    glVertex3d(0, -1, 0);
    glVertex3d(1, 0, -1);
    glVertex3d(1, 1, -1);

    Or j'obtiens un truc qui n'a rien avoir avec ce que j'attendais ! Je ne comprend vraiment pas c'est vraiment chaud !
    • Partager sur Facebook
    • Partager sur Twitter
      13 juin 2007 à 16:26:39

      glVertex3d(0, 0, 0);
      glVertex3d(0, -1, 0);
      glVertex3d(1, -1, 0);
      glVertex3d(1, 0, 0);

      pour un carré dans le plan z=0, mais comme ta camera est en 1,1,1 tu verra pas un carré.. plutot un trapeze si je me trompe pas..
      Apres, moi aussi j'ai encore du mal avec tout ca, donc.. rien n'est sur, j'ai pas testé, ;)
      • Partager sur Facebook
      • Partager sur Twitter
        13 juin 2007 à 16:36:49

        Merci !

        Je viens de faire un petit paquet de test, en fait, lorsque l'on définit la caméra, si l'on veut être en face d'un dessin sans trop se prendre la tête, on peut la déclarer ainsi :

        gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0);


        Moi perso ça marche, c'est comme de la 2D 'enfin je pense) mais l'on ne pas pas voir l'axe Z (ici en profondeur). Pour ce faire, il faudrait par exemple déplacer la caméra en (2, 5, 1) pour voir par le gauté gauche de l'objet, c'est bien ça ?
        • Partager sur Facebook
        • Partager sur Twitter
          13 juin 2007 à 16:41:18

          bah ca depend un peu d'ou est ton objet..

          fait attention à l'emplacement de l'origine des axes, 0,0,1 ca veut dire que tu est "rentré" dans l'écran, et que tu regarde en arrière, autrement dis, la gauche et la droite change.. (si je dis pas de bétise)

          j'espere avoir ete clair.. bonne continuation
          • Partager sur Facebook
          • Partager sur Twitter
            13 juin 2007 à 17:08:33

            ben justement, je pense que c'est hors de l'écran, j'ai fais le test est pourtant j'ai bien mon objet dessiné dans le bon sens (j'ai fini c'est vraiment super !)

            Cube 3D en OpenGL par Skypers
            • Partager sur Facebook
            • Partager sur Twitter
              18 juin 2007 à 20:40:37

              Oui il est sympas mais comment utiliser les textures ? J'ai suivis le tuto mais j'ai une blem.

              Voici le "nouveau" code source, ainsi que son erreur :


              #include <windows.h>
              #include <SDL/SDL.h>
              #include <gl/gl.h>
              #include <gl/glu.h>
              #include <gl/mapping/sdlglutils.h>

              void __Paint();

              double angleX = 0;
              double angleY = 0;

              int main(int argc, char *argv[])
              {
                  SDL_Surface *screen = NULL;
                  SDL_Event action;
                  bool again = true;


                  SDL_Init(SDL_INIT_VIDEO);
                  SDL_WM_SetCaption("Manipulation de la camera OPENGL", NULL);
                  screen = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL);

                  // Matrix
                  glMatrixMode(GL_PROJECTION);
                  glLoadIdentity();
                  gluPerspective(70, (double)800 / 600, 1, 1000);

                  glEnable(GL_DEPTH_TEST);


                  // Pause
                  while (again != false)
                  {
                      SDL_WaitEvent(&action);

                      switch (action.type)
                      {
                          case SDL_QUIT :
                              again = false;
                              break;
                      }

                          __Paint();
                      }

                      SDL_FreeSurface(screen);
                      SDL_Quit();

                      return 0;

              }

              void __Paint()
              {
                  GLuint texture;

                  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

                  glMatrixMode(GL_MODELVIEW);
                  glLoadIdentity();
                  glEnable(GL_TEXTURE_2D);

                  texture = loadTexture("stainedglass05.jpg");


                  gluLookAt(0.5, 0.2, 3, 0, 0, 0, 0, 1, 0);

                  glBegin(GL_LINES); // Repere XYZ
                      glColor3ub(0, 255, 0);
                      glVertex3d(0, 0, 0);
                      glVertex3d(0, 1, 0);

                      glColor3ub(0, 0, 255);
                      glVertex3d(0, 0, 0);
                      glVertex3d(0, 0, -1);

                      glColor3ub(255, 0, 0);
                      glVertex3d(0, 0, 0);
                      glVertex3d(1, 0, 0);
                  glEnd();

                  //glRotated(angleX, 1, 0, 0);
                  //glRotated(angleY, 0, 1, 0);

                  glBegin(GL_QUADS);
                      glColor3ub(255, 0, 0);       glVertex3d(-1, -1, 1); // Red and green face
                                                   glVertex3d(-1, 1, 1);
                      glColor3ub(0, 255, 0);       glVertex3d(1, 1, 1);
                                                   glVertex3d(1, -1, 1);
                                                   glVertex3d(1, -1, 1); // Green and yellow face
                                                   glVertex3d(1, 1, 1);
                      glColor3ub(252, 242, 0);     glVertex3d(1, 1, -1);
                                               glVertex3d(1, -1, -1);
                                                   glVertex3d(1, -1, -1); // Yellow and azur face
                                                   glVertex3d(1, 1, -1);
                      glColor3ub(66, 253, 234);    glVertex3d(-1, 1, -1);
                                                   glVertex3d(-1, -1, -1);
                                                   glVertex3d(-1, -1, -1); // Azur and red face
                                                   glVertex3d(-1, 1, -1);
                      glColor3ub(255, 0, 0);       glVertex3d(-1, 1, 1);
                                                   glVertex3d(-1, -1, 1);
                                                   glVertex3d(-1, 1, 1); // Up face
                      glColor3ub(66, 253 ,234);    glVertex3d(-1, 1, -1);
                      glColor3ub(252, 242, 0);     glVertex3d(1, 1, -1);
                      glColor3ub(0, 255, 0);       glVertex3d(1, 1, 1);

                      glColor3ub(255, 0, 0);       glVertex3d(-1, -1, 1); // Down face
                      glColor3ub(66, 253 ,234);    glVertex3d(-1, -1, -1);
                      glColor3ub(252, 242, 0);     glVertex3d(1, -1, -1);
                      glColor3ub(0, 255, 0);       glVertex3d(1, -1, 1);
                  glEnd();

                  glFlush();
                  SDL_GL_SwapBuffers();
              }


              Message d'erreur :

              error LNK2019: unresolved external symbol "unsigned int __cdecl loadTexture(char const *,bool)" (?loadTexture@@YAIPBD_N@Z) referenced in function "void __cdecl __Paint(void)" (?__Paint@@YAXXZ)</


              • Partager sur Facebook
              • Partager sur Twitter
                19 juin 2007 à 10:04:04

                A ta place, je déclarerait la variable 'texture1' en temps
                que variable globale, puis je la chargerait dans main().
                Aussi, la fonction qui fait correspondre un vertex avec un
                point de la texture est:
                glTexCoord2d (double x_texture, double y_texture)

                Pour t'aider,
                glTexCoord2d (0, 0) -> coin inférieur gauche
                glTexCoord2d (1, 0) -> coin inférieur droit
                glTexCoord2d (0, 1) -> coin supérieur gauche
                glTexCoord2d (1, 1) -> coin supérieur droit

                PS: Désolé, je ne comprend pas le message d'erreur( bien
                que je n'ai pas de problèmes avec l'anglais ).
                • Partager sur Facebook
                • Partager sur Twitter
                  19 juin 2007 à 12:23:06

                  En fait, le problème vient juste du fait que je ne peux pas utiliser loadTexture. Si je déclare quelque part dans mon code

                  GLuint texture;


                  le code compile nikel. Par contre, si j'appel quelque part

                  texture = loadTexture("texture01.jpg", /*true*/);


                  il m'afficher ce message d'erreur o_O
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 juin 2007 à 17:27:44

                    texture = loadTexture("texture01.jpg", /*true*/);

                    Ca n'existe ni en C, ni en C++ (quoiqu'à confirmer), la virgule est de trop ici.

                    Tu compiles bien en C++ ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 juin 2007 à 18:03:59

                      oui je suis en C++, et mon dans mon code le true n'est pas commenté, désolé de cette imprécision...

                      J'ai essayé, en me renseignant, d'apprendre à programmer moi-même cette phase.

                      Donc si j'ai bien compris, il faut faire ça :


                      GLuint glTexLoad(const char name[])
                      {
                          GLuint ID; // La texture à retourner
                          SDL_Surface *sdl_Texture = NULL; // L'image à charger
                          SDL_Surface *gl_Texture = NULL; // L'image convergée en OpenGL
                          SDL_Surface * gl_Fliped_Texture = NULL; // L'image OpenGL retournée

                          sdl_Texture = IMG_Load(name); // Load picture

                          if (sdl_Texture == NULL)
                          {
                              return 0;
                          }

                          else
                          {
                              gl_Texture = SDL_ConvertSurface(sdl_Texture, sdl_Texture->format, SDL_SWSURFACE); // Conversion de SDL à OpenGL
                              gl_Fliped_Texture = flipSurface(gl_Texture); // Retournement
                              glGenTextures(1, &ID); // Identification
                              glBindTexture(GL_TEXTURE_2D, ID); // Activation

                              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); // Spécification de la répétition et combinaison [pixels texture/tampon chronomatique]
                              glTexImage2D(GL_TEXTURE_2D, 0, 4, gl_Fliped_Texture->w, gl_Fliped_Texture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, gl_Fliped_Texture->pixels); // Définition de texture

                              return ID; // Retour de la texture
                          }

                      }


                      Ce code est certainement faux, car je n'ai vraiment pas tout compris, quelqu'un pourrait-il m'éclairer ?
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [OpenGL] - Se situer

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown