begin process at 2012 05 29 15:10:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

OpenGL

 > 

Pavé tournant


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

Pavé tournant

mardi 14 février 2006 à 10:50:54 | Pavé tournant

nisaloncaje

Bonjour, je désirais pour commencer en OpenGL sous devc++ faire un programme simulant un pavé tournant autour de l'axe y : voici mon code source :

#include <GL/glut.h>
#include <stdlib.h>

/* Notre structure point */
int i,j;
typedef struct
{
  float x;
  float y;
  float z;
  float r;
  float g;
  float b;
} point;

point p[8]={
    {-0.3,-0.15, 0.3,1.0,0.0,0.0},
    {-0.3, 0.15, 0.3,0.0,1.0,0.0},
    { 0.3, 0.15, 0.3,0.0,0.0,1.0},
    { 0.3,-0.15, 0.3,1.0,1.0,0.0},
    {-0.3,-0.15,-0.3,1.0,0.0,1.0},
    {-0.3, 0.15,-0.3,0.0,1.0,1.0},
    { 0.3, 0.15,-0.3,0.0,0.0,0.0},
    { 0.3,-0.15,-0.3,1.0,1.0,1.0}};
 
int f[6][4]={
  {0,1,2,3},
  {3,2,6,7},
  {4,5,6,7},
  {0,1,5,4},
  {1,5,6,2},
  {0,4,7,3}};

 

float a=0;
float inca=0.45;

/* Prototype des fonctions */
void affichage();
void clavier(unsigned char touche,int x,int y);
void reshape(int x,int y);
void idle();

int main(int argc,char **argv)
{
  /* initialisation de glut et creation
     de la fenetre */
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutInitWindowPosition(200,200);
  glutInitWindowSize(500,500);
  glutCreateWindow("transf");

  /* Initialisation d'OpenGL */
  glClearColor(1.0,1.0,1.0,0.0);
  glColor3f(1.0,1.0,1.0);
  glPointSize(2.0);

  glEnable(GL_DEPTH_TEST);

  /* enregistrement des fonctions de rappel */
  glutDisplayFunc(affichage);
  glutKeyboardFunc(clavier);
  glutReshapeFunc(reshape);
  glutIdleFunc(idle);

  /* Entree dans la boucle principale glut */
  glutMainLoop();
  return 0;
}

void affichage()
{

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
  glLoadIdentity();

  glRotatef(a,0.0,1.0,0.0);
  glRotatef(10,1.0,0.0,0.0);
  /* Dessin du cube */
  for (i=0;i<6;i++)
    {
      glBegin(GL_POLYGON);
      for (j=0;j<4;j++)
 {
   glColor3f(p[f[i][j]].r,p[f[i][j]].g,p[f[i][j]].b);
   glVertex3f(p[f[i][j]].x,p[f[i][j]].y,p[f[i][j]].z);
 }
      glEnd();
    }
 
  glFlush();
  glutSwapBuffers();
}

void clavier(unsigned char touche,int x,int y)
{
  switch (touche)
    {
    case 'a':
      inca++;
      if (inca>10)
 inca=10;
      glutPostRedisplay();
      break;
    case 'A':
      inca--;
      if (inca<-10)
 inca=-10;
      glutPostRedisplay();
      break;
       case 'q' :
      exit(0);
    }
}

void reshape(int x,int y)
{
  if (x<y)
    glViewport(0,(y-x)/2,x,x);
  else
    glViewport((x-y)/2,0,y,y);
}

void idle()
{
  a+=inca;
  if (a>360)
    a-=360;
    glutPostRedisplay();
}

Le programme marche et simule ce que je veux, le seul petit problème est le fait que quand on a une face de face :) et bien on a l'impression que l'image saute. Cet effet se fait-il aussi chez vous, et si oui, comment l'éviter ?

Merci d'avance

NC

mardi 14 février 2006 à 12:12:08 | Re : Pavé tournant

platon179

Membre Club
Salut

Je viens de tester ton programme sous dev-cpp, aucun souci apparemment, le cube tourne bien comme il faut, et je n'ai pas l'impression que l'image "saute"... En rajoutant une temporisation dans la fonction idle, c'est bien visible, il n'y aucun souci, le code est correct
Peut-être des drivers graphiques a mettre à jour ?

Bonne journée
@+
mardi 14 février 2006 à 16:07:53 | Re : Pavé tournant

nisaloncaje

merci. pourtant mes drivers sont à jour mais en fait j'ai l'impression que ca saute quand le pavé est de profil et donc au moment ou on ne voit plus qu'une seule face, entre ce moment là et celui où les autres faces réapparaissent.

Ce n'est pas grave, mais sinon sauriez vous comment faire pour teinter chaque face du pavé d'une couleur différente (car là je débute et je n'arrive qu'à faire des 'dégradés'), et si c'est possible 'd'écrire un texte' sur une des faces du pavé ?

mardi 14 février 2006 à 16:15:53 | Re : Pavé tournant

platon179

Membre Club
Re :)

   Pour qu'une face ait une couleur unique, tu dois donner la même couleur à tous les coins de cette face, sinon OpenGL réalise une interpolation entre les couleurs, comme tu peux t'en rendre compte toi-même...

   Sinon, pour afficher du texte sur une face, tu peux créer une texture qui contient le texte, et l'utiliser pour la mapper sur une des faces...Pour un très bon tuto sur les textures : http://nehe.gamedev.net. C'est a mon avis la solution la plus simple...

Bonne journée @+




mardi 14 février 2006 à 19:42:41 | Re : Pavé tournant

nisaloncaje

d'accord pour le texte, mais deux petites questions encore : comment faire un texte en 3d ?
et si je mets la meme couleur aux 4 points d'une face, par exemple rouge, alors une autre face ayant une arete commune avec cette face aura 2 points de la couleur de la 1ère face, meme si je veux la faire d'une autre couleur (bleue par exemple) ! d'où la question : comment résoudre le problème ? :-)
mardi 14 février 2006 à 19:51:22 | Re : Pavé tournant

platon179

Membre Club
Salut... :)

Pour le texte en 3D sous Windows, encore retour sur le site de Nehe, tout y est expliqué dans la liste de tutos à gauche....

En ce qui concerne la couleur des faces, le probleme ne se pose meme pas en réalité. Tu dois en effet toujours fournir tous les points d'une face... Si on prend l'exemple d'affichage de quadrilateres, tu definis quatre points d'une couleur :

glBegin(GL_QUADS);
   glColor3f(1.0f, 0.0f, 0.0f);   // Couleur rouge
   glVertex3f(0.0f, 0.0f, 0.0);   // Les quatre points qui composent ton quadrilatere
   glVertex3f(1.0f, 0.0f, 0.0f);
   glVertex3f(1.0f, 0.0f, 1.0f);
   glVertex3f(0.0f, 0.0f, 1.0f);

Ca c'est ta premiere face de couleur rouge ok ? Donc pour la face suivante, tu definis quatre autres points d'une couleur quelconque, même si plusieurs points sont confondus, c'est pas grave, c'est comme ca que ca fonctionne, par exemple :

   glColor3f(0.0f, 1.0f, 0.0f);    // Couleur verte
   glVertex3f(1.0f, 0.0f, 0.0);    // Les quatre points qui composent ton quadrilatere...
   glVertex3f(2.0f, 0.0f, 0.0f);
   glVertex3f(2.0f, 0.0f, 1.0f);
   glVertex3f(1.0f, 0.0f, 1.0f);
glEnd();

   Dans le petit exemple d'au-dessus, tu auras un carré rouge, avec un carré vert à sa droite, avec deux points confondus entre les deux quadrilateres... Note que tu es pas obligé de mettre un couple glEnd() / glBegin(quelque_chose) pour changer de couleur...

Bonne soirée @+

mardi 14 février 2006 à 22:12:26 | Re : Pavé tournant

nisaloncaje

ok c'est tout simple en fait, mais j'avais trouvé aussi (pour conserver ma structure de faire ainsi :   glShadeModel(GL_FLAT), et de triturer un peu le début du code ou je mettais maintenant :
int f[6][4]={
  {0,1,2,3},
  {3,2,6,7},
  {4,5,6,7},
  {5,4,0,1},
  {1,5,6,2},
  {7,3,0,4}};

est-ce exactement le meme effet, ou l'un des 2 scripts est plus performant que l'autre ?
mardi 14 février 2006 à 22:17:24 | Re : Pavé tournant

platon179

Membre Club
Réponse acceptée !
Salut :)

Normalement, si tu utilises GL_FLAT au lieu de GL_SMOOTH, ca sera légèrement plus rapide, mais le gain sera tellement minime que ca vaut pas le coup... Surtout que tu envoies exactement le même nombre de points a OpenGL avec les deux méthodes...
Si tu as encore des questions, ici ou sur MSN (c'est peut-être plus simple en direct :p) : platonman1758@hotmail.com

Voilà, @+



Cette discussion est classée dans : int, void, glut, float, inca


Répondre à ce message

Sujets en rapport avec ce message

équation et tableaux [ par cabarrus ] je ne trouve pas l'erreur dans mon programme?#include#includeint deltanul(int);float deltainf(float);float deltasup(float);void main(void){float a,b,c pb de Z-buffer ac openGL -> Help! [ par Arnaud16022 ] bonjour tt le monde!quelqun pourrait me dire pourqoui le Z-buffer marche pas?pasque le dernier (4ème) triangle dessiné apparait tjs au dessus, meme s' opengl.glut : gestion clavier [ par _Jonathan ] salut a tousvoila, j'arrive pas a utiliser la fonction glutSpecialUpFunc (chui sous devc++).glutSpecialFunc marche.Si kelkun pourrai m'expliker : ---- le mode graphique sur dos [ par alen ] alb#include#include#include#include#includeint xgclot,xdclot,yh Errreur [ par RM50Man ] Mon code ne marche pas: Le compilateur devcpp me met build error 1 #include /* contient déjà et */ #include #include #include void reset Problème avec les polygones [ par nisaloncaje ] Bonjour, j'ai le code source suivant : #include #include double a=0,inca=0.1; /* Prototype des fonctions */void affichage();void clavier(unsigned Problème de tabeau dans un code orienté objet [ par Guiiil ] Bonsoir, je débute actuellement en C++ orienté objet et je suis bloqué avec ce programme qui doit réaliser un tableau d'élèves, prendre leur moyenne e map [ par taieb84 ] salut j'ai une classe caisse class caisse{            float val;        int nbr;            public:            bool exist(float);    void ajouter(floa classe abstraite et interface (au sens Java pas graphique :d ) en C++ [ par lulafitt ] Bonjour, Comme précisé dans le sujet quand je parle d'interface je ne parle pas d'interface graphique mais bien d'interface comme dans Java. Ceci dit error LNK2001: unresolved external symbol _WinMainCRTStartup [ par CrKa ] slt,j'ai cette erreur dans mon programme en VC++ erreur 1>------ Rebuild All started: Project: test4, Configuration: Debug Win32 ------ 1>LINK : erro


Nos sponsors


Sondage...

Comparez les prix

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 : 1,030 sec (3)

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