habilitar luces openGL

Survivor

Hola !

Pues estoy haciendo un programilla en openGL y tengo una duda mi programa basicamente tiene 3 puntos

  • funcion dibujar:
    Lo que hace es colocarr los glVertex cada uno en su sitio al igual que las glNormal

  • funcion mover
    dependiendo de la flecha pulsada (arriba , abajo ...) gira el objeto dibujado con glRotatef

  • main
    Tiene para inicializar la ventana , perspectiva y las luces y un bucle que dibuja la escena:

Init()
Perspectiva()
luces()

Bucle{
pintar();
mover();
}

Mi problema es que consigo dibujar el objeto bien pero sin sentido aparente al rotar la imagen la iluminacion solo actua en una cara de la figura , es decir , que si yo roto la figura la iluminacion no se queda quieta sino que por lo visto gira junto a la escena actuando siempre sobre el mismo punto y no sobre las de mas caras del objeto .Para explicarlos mejor imaginaros un cubo en 3d en el que la luz esta actuando solo en una de las caras del cubo. No se si me explico xD lo que hago es habilitar las luces antes del bucle que dibuja la escena de esta forma

float ambient[] = {0.4, 0.4, 0.4, 0.0};
float diffuse[] = {0.4, 0.4, 0.4, 0.0};
float specular[] = {1.0, 1.0, 1.0, 0.0};
float position[] = {-5.0, 5.0, 5.0, 0.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);

tengo que meter las luces entre un pushmatrix y un popmatrix? de ser asi de que forma? , alguna idea?

Gracias por responder

r2d2rigo

Si el 4º parametro de GL_POSITION de la luz es un 0, estaras usando una luz direccional (luz a una distancia infinita que siempre actua en la misma direccion). Si pones un 1, pasara a ser un light spot.

Y si, parece que te has hecho un lio con los glPushMatrix()/glPopMatrix(). El metodo que te recomiendo es que hagas un push, pongas la luz en su posicion, luego pop, y luego hagas una sucesion de push/pops para colocar los distintos objetos. Seguramente estas aplicando el glRotate() al principio del dibujado y por eso te rota toda la escena :P

Vamos, que para una luz y un objeto seria asi mas o menos:

glPushMatrix();
colocar_luz_en_posicion();
glPopMatrix();
glPushMatrix();
glRotatef(rotacion_de_la_escena);
dibujar_forma();
glPopMatrix();

Usuarios habituales

  • r2d2rigo
  • Survivor