Pour afficher un modèle 3d

Soyez le premier à donner votre avis sur cette source.

Vue 1 383 fois - Téléchargée 174 fois

Description

En 2003 la très célèbre université de Princeton a publié un catalogue d'objets numériques tridimensionnels définis en format off, le plus simple des formats 3d : http://shape.cs.princeton.edu/benchmark/

Avec ces modèles toujours disponibles et bien connus, on peut obtenir les sources de quelques utilitaires où offviewer.cpp sert à afficher les objets en format off. Ce programme a déjà été repris et publié à l'identique ou en variante de nombreuses fois.

La variante que je propose ajoute un mode d'emploi, et plusieurs commandes complémentaires pour afficher ou effacer les faces, les arêtes ou les deux, pour éteindre ou allumer l'une ou l'autre des deux sources lumineuses, pour afficher les statistiques du modèle, pour afficher les faces en mode plat ou continu et surtout pour sauvegarder l'image actuellement affichée une ou plusieurs fois, après avoir fait des translations, rotations ou zoom du modèle. La lettre <M> donne accès au mode d'emploi.

Le format d'image ppm avec P3 en nombre magique peut être lu avec plusieurs programmes de traitement d'images. Il peut aussi être converti en format bmp, jpg, tga ou autres soit localement soit en ligne sur Internet. Enfin, on peut assez facilement produire directement un autre format d'image.

D'un point de vue mode de programmation, il y a des formulations qui ne sont plus recommandées : les variables globales et la forme maintenant obsolète d'OpenGL avec glBegin et glEnd. On peut aussi revoir cela, c'est conservé ici par fidélité à l'original.

L'intérêt principal de ce programme est de montrer comment OpenGL en programmation via glut permet d'afficher un messagebox et de connaître ou de commander les données caractéristiques de la fenêtre visualisée. Quant à l'intérêt du format off c'est d'être très facile à renseigner à partir des autres formats d'objets 3d : il comprend uniquement une liste de sommets et une liste simple de faces polygonales.

Source :

/***  Sauvegarde de l'image actuellement affichée  ***/
   if(wrimg) {
      std::string name;
      bool goodname;
      FILE *fp;   
      do {
         goodname = true;
         ++numimg;
         name = nomfi;
         std::size_t found = name.find_last_of('.');
         name = name.substr(0, found) + "-";
         std::stringstream ss;
         ss << numimg;
         name = name + ss.str() + ".ppm";
         if(fp = fopen(name.c_str(), "r")) { 
            // si ce nom d'image est déjà utilisé ...
            goodname = false;
            fclose(fp);
         }  
      }while(!goodname);
      fp = fopen(name.c_str(), "w");
      int w = glutGet(GLUT_WINDOW_WIDTH);
      int h = glutGet(GLUT_WINDOW_HEIGHT);
      GLubyte* pixels = new GLubyte[w*h*3];
      glReadBuffer(GL_FRONT);
      glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, pixels);
      fprintf(fp, "P3n%d %d 255n", w, h);  
      for(int i = h-1; i >= 0; i--) 
         for(int j = 0; j < w; j++) {
            for(int k=0; k<3; k++) 
               fprintf(fp, "%d ", (int)pixels[i*w*3+j*3+k]);
            fprintf(fp, "n");
      }
      delete [] pixels;
      fclose(fp);
      wrimg = false;
   }

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Commenter la réponse de pgl10

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.