IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Calcul lumière sur une seule face


Sujet :

OpenGL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Calcul lumière sur une seule face
    Bonjour,
    Je me trouve devant un problème assez paradoxal.
    En effet, je rencontre quelques problèmes d'éclairage lors de mon projet opengl.
    Pour simplifier l'affaire, je dispose d'une scène composé d'un simple mesh tournant sur lui-même et d'une source lumineuse fixe.
    J'ai deux versions de cette scène :
    • V1 : le mesh est un polygon simple
    • V2 : le mesh est un glutSolidCube

    La V2 fonctionne parfaitement.
    Dans la V1, le calcul de la lumière ne s'effectue que sur une seule face (l'autre face semble garder constamment la même luminosité) durant la rotation.

    J'ai écrit une version minimale de ce code que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include <GL/glut.h>
     
    void Reshape(int width, int height)
    { 	 
    	glViewport(0, 0, width, height);
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    	gluPerspective(45, (float)width/(float)height, 0.1, 100);
    	glMatrixMode(GL_MODELVIEW);
    }
     
    double r = 0;
    int LightPos[4] = {3,-3,3,1};
    int MatSpec [4] = {1,1,1,1};
     
    void Draw()
    { 	
    	glMaterialiv(GL_FRONT_AND_BACK, GL_SPECULAR, MatSpec);
    	glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 100);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glMatrixMode(GL_MODELVIEW);
    	glLoadIdentity();
    	glLightiv(GL_LIGHT0, GL_POSITION, LightPos);
    	gluLookAt(0,6,6,0,0,0,0,1,0);
    	glRotated(r, 0, 1, 0);
    	glBegin(GL_POLYGON);
    		glVertex3f(-2, 2, 0);
    		glVertex3f(-2, -2, 0);
    		glVertex3f(2, -2, 0);
    		glVertex3f(2, 2, 0);
    	glEnd();
    	//~ glutSolidCube(2.0);
    	r += 0.1;
     
    	glutSwapBuffers();
    	glutPostRedisplay();
    }
     
    int main(int argc, char *argv[], char *envp[])
    { 	 
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    	glutInitWindowSize(640,480);
    	glutCreateWindow("lumiere");
    	glutFullScreen();
     
    	glutReshapeFunc(Reshape);
    	glutDisplayFunc(Draw);
     
    	glEnable(GL_DEPTH_TEST); 	// Active le test de profondeur
    	glEnable(GL_LIGHTING); 	// Active l'éclairage
    	glEnable(GL_LIGHT0); 	// Allume la lumière n°1
     
    	glutMainLoop();
     
    	return 0;
    }
    Aurais-je loupé quelque chose ?
    Une première piste me fait penser que je dois indiquer le vecteur normal avec glNormal3d pour chaque face de mon mesh. Mais puis-je avoir deux vecteurs normaux sur une même face ?
    Vous en pensez quoi ?
    Merci à vous.

  2. #2
    Membre confirmé
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Points : 486
    Points
    486
    Par défaut
    Salut,

    effectivement ca a tout l'air d'un probleme de normales. Dans ton exemple de code tu n'en assignes pas donc essaie de caser un glNormal3f(0,0,-1) avant de dessiner ton polygône.

    Mais puis-je avoir deux vecteurs normaux sur une même face ?
    En fait tu assignes les normales pas vertex, pas par face, donc les 4 vertices de ton polygone peuvent trÈs bien avoir des normales différentes. Mais c'est clair que si ils appartiennent a la meme face il faudra donner la meme normale.

    Pour un cube, tu as 8 vertices en tout, mais vu que chaque vertex appartient à 3 faces differentes, il faut dessiner 6 fois un QUAD (donc 6* 4 vertex), avec a chaque fois une autre normale. Au final chaque sommet de ton cube aura été dessiné 3fois, mais avec differentes normales.

    Dans le cas d'un mesh, si tu veux un aspect "lissé" il faut, pour chaque sommet, calculer sa normale comme étant la moyenne de toutes les faces auquelles ce sommet appartient.

    Et dans le cas de glutSolidCube, glut s'ccupe tout seul d'assigner les normales, c'est pour ca que ca marche.

    Voilà, j'espère que ca t'éclairera (sans mauvais jeu de mot un peu!

Discussions similaires

  1. [XL 2007]Evenement calculate sur une seule cellule
    Par hoaxpunk dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/07/2010, 12h29
  2. Réponses: 7
    Dernier message: 25/04/2007, 15h38
  3. [VBA-E] calculs automatique sur une seule feuille
    Par repié dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/03/2006, 11h53
  4. ROLLBACK sur une seul enregistrement
    Par toctoc80 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/04/2004, 20h22
  5. Recherche multi-mots sur une seule colonne
    Par Badiste dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2004, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo