2016-05-26 1 views
-1

J'essaye de faire pivoter le dodécaèdre avec une lumière simple.OpenGL light avec rotation d'objet

Le code de la fonction d'affichage est la suivante:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5f); 
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.75f); 
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.4); 
GLfloat black[] = { 0, 0, 0, 1 }; 
GLfloat blue[] = { 0, 1, 1, 1 }; 
glLightfv(GL_LIGHT1, GL_AMBIENT, black); 
glLightfv(GL_LIGHT1, GL_DIFFUSE, blue); 
glLightfv(GL_LIGHT1, GL_SPECULAR, blue); 
glEnable(GL_LIGHT1); 
glEnable(GL_LIGHTING); 

glTranslatef(0, 0, -50); 
glRotatef(angle, 0, 1.0, 0); 
glutSolidDodecahedron(); 

Le changement angle par les touches fléchées. Mais pour certains angles, l'image semble bizarre comme ceci:

enter image description here

et après plus de rotations, il ressemble à ceci: enter image description here

Il semble que les visages qui était à l'arrière sont transparents. Pourquoi donc? Comment puis-je rendre cet objet à imprimer correctement?

Répondre

0

modifier: La solution consiste à activer la suppression de face arrière via glEnable(GL_CULL_FACE). Vous souhaiterez peut-être vérifier que les polygones de votre objet sont définis avec l'ordre d'enroulement correct et assurez-vous que la suppression de la face arrière est définie (glCullFace(GL_BACK_FACE)) si vous n'avez pas l'intention de voir à l'intérieur de l'objet.


réponse originale:

La lumière ne touche pas le côté opposé de l'objet et votre éclairage ambiant est noire:

GLfloat black[] = { 0, 0, 0, 1 }; 
glLightfv(GL_LIGHT1, GL_AMBIENT, black); 

Essayez de régler votre lumière ambiante à un couleur gris foncé pour approximer la contribution de la lumière ambiante de global illumination:

GLfloat ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); 
+0

Il semble toujours le même ... Pourquoi le verso de l'objet est noir à l'avant? Je n'ai pas besoin de voir les visages noirs du tout. Je regarde directement l'objet, et la lumière derrière moi ... – nrofis

+0

Quelle est votre couleur claire? En outre, la sélection de la face arrière est-elle activée? Si cela est vrai, peut-être que les polygones de l'objet ont un ordre d'enroulement qui définit la face avant comme la face interne au lieu de la face externe. Essayez peut-être 'glDisable (GL_CULL_FACE);' aussi. –

+0

Hmm, on dirait que j'ai oublié d'activer la suppression de la face arrière ... Après avoir ajouté 'glEnable (GL_CULL_FACE)' cela fonctionne bien. Je vous remercie! – nrofis