// VARIOS MUROS ILUMINADOS #include <GL/glut.h> #include <unistd.h> GLfloat mat_color [] = {0.0,1.0,1.0,1.0}; // El color ambiental y difuso del material GLfloat Luz_Dif_Espe [] = {1.0,1.0,1.0,1.0}; // El color difuso y especular de la luz GLfloat Luz_Ambient [] = {0.0,0.0,0.0,1.0}; // El color ambiental de la luz (si algo estA fuera de la luz, no se ilumina) //GLfloat GLfloat normalPiso [] = {0.0, 0.0, 1.0}; GLfloat normalMuroIzq [] = {1.0, 0.0, 0.0}; GLfloat normalMuroFondo [] = {0.0, -1.0, 0.0}; GLfloat normalMuroDer [] = {-1.0, 0.0, 0.0}; GLfloat Luz0Pos [] = {0, 0, 10, 1}; // Posicion (x=0,y=0,z=0) Tipo(w=1) ... w=1(posicional) o 2(direccional) GLfloat Luz0Dir[] = {0, 0, -1}; // DirecciOn (hacia donde apunta) GLfloat Luz0Ang = 10; // Angulo de apertura de la luz en grados ( mitad ) GLfloat Luz0Aten = 0; // AtenuaciOn de la luz conforme se hacerca GLfloat Luz0Brillo = 0.4; // Brillo del material float Luz_Foco [] = {0.0,0.0,0.8,1.0}; // Luz mOvil float PosX = -7.0; float PosY = -5; // Posicion del foco float DIM = 10; void PintaEjes() { glBegin(GL_LINES); glColor3f(1,0,0); glVertex3f(-DIM, 0, 0); glVertex3f(DIM, 0, 0); // X glColor3f(0,1,0); glVertex3f(0, -DIM, 0); glVertex3f(0, DIM, 0); // Y glColor3f(0,0,1); glVertex3f(0, 0, -DIM); glVertex3f(0, 0, DIM); // Z glEnd(); glPushMatrix();glColor3f(1,0,0); glTranslatef(DIM, 0.0f, 0.0f); glutWireSphere(0.20, 20, 20);glPopMatrix(); glPushMatrix();glColor3f(0,1,0); glTranslatef(0.0f, DIM, 0.0f); glutWireSphere(0.20, 20, 20);glPopMatrix(); glPushMatrix();glColor3f(0,0,1); glTranslatef(0.0f, 0.0f, DIM); glutWireSphere(0.20, 20, 20);glPopMatrix(); } void Gradua ( ) { int k=0, x1,y1,x2,y2; glBegin(GL_LINES); glColor3f(1,0,0); for(k=1; k<DIM*2; k++) { glVertex3f(-10+k, 0.2, 0); glVertex3f(-10+k, -0.2, 0); } glColor3f(0,1,0); for(k=1; k<DIM*2; k++) { glVertex3f(0.2, -10+k, 0); glVertex3f(-0.2, -10+k, 0); } glColor3f(0,1,0); for(k=1; k<DIM*2; k++) { glVertex3f(0.2, 0, -10+k); glVertex3f(-0.2, 0, -10+k); } glEnd(); } void Rejilla() { int k=0; glColor3f(1,1,1); glLineWidth(5); for(k=0; k<DIM*2+1; k++) { glBegin(GL_LINES); glVertex3f(-DIM+k, -DIM, 0); glVertex3f(-DIM+k, DIM, 0); glEnd(); } for(k=0; k<DIM*2+1; k++) { glBegin(GL_LINES); glVertex3f(-DIM, -DIM+k, 0); glVertex3f(DIM, -DIM+k, 0); glEnd(); } glLineWidth(1); } void Muros() { glBegin(GL_QUADS); glColor3f(1, 1, 0.3); // piso glNormal3fv(normalPiso); glVertex3f(-DIM, -DIM, 0); glNormal3fv(normalPiso); glVertex3f(DIM, -DIM, 0); glNormal3fv(normalPiso); glVertex3f(DIM, DIM, 0); glNormal3fv(normalPiso); glVertex3f(-DIM, DIM, 0); glColor3f(0, 0.3, 0); // muro verde -IZQUIERDO- glNormal3fv(normalMuroIzq); glVertex3f(-DIM+1, -DIM+6, 0); glNormal3fv(normalMuroIzq); glVertex3f(-DIM+1, -DIM+6, 4); glNormal3fv(normalMuroIzq); glVertex3f(-DIM+1, DIM, 4); glNormal3fv(normalMuroIzq); glVertex3f(-DIM+1, DIM, 0); glColor3f(0.6, 0.3, 0); // muro cafE -FONDO- glNormal3fv(normalMuroFondo); glVertex3f(-DIM+2, DIM-2, 0); glNormal3fv(normalMuroFondo); glVertex3f(-DIM+2, DIM-2, 4); glNormal3fv(normalMuroFondo); glVertex3f(DIM-2, DIM-2, 4); glNormal3fv(normalMuroFondo); glVertex3f(DIM-2, DIM-2, 0); glNormal3fv(normalMuroDer); glVertex3f(0, DIM-4, 0); glNormal3fv(normalMuroDer); glVertex3f(0, DIM-4, 4); glNormal3fv(normalMuroDer); glVertex3f(0, -DIM+4, 4); glNormal3fv(normalMuroDer); glVertex3f(0, -DIM+4, 0); glColor3f(0, 0.6, 1); // muro azul glNormal3fv(normalMuroDer); glVertex3f(DIM-1, -DIM+1, 0); glNormal3fv(normalMuroDer); glVertex3f(DIM-1, -DIM+1, 4); glNormal3fv(normalMuroDer); glVertex3f(DIM-1, DIM-2, 4); glNormal3fv(normalMuroDer); glVertex3f(DIM-1, DIM-2, 0); glNormal3fv(normalMuroDer); glVertex3f(-DIM+4, DIM-4, 0); glNormal3fv(normalMuroDer); glVertex3f(-DIM+4, DIM-4, 4); glNormal3fv(normalMuroDer); glVertex3f(-DIM+4, -DIM+4, 4); glNormal3fv(normalMuroDer); glVertex3f(-DIM+4, -DIM+4, 0); glColor3f(1, 0.3, 0.3); // muro rojo glNormal3fv(normalMuroDer); glVertex3f(5, DIM-4, 0); glNormal3fv(normalMuroDer); glVertex3f(5, DIM-4, 4); glNormal3fv(normalMuroDer); glVertex3f(5, -DIM+4, 4); glNormal3fv(normalMuroDer); glVertex3f(5, -DIM+4, 0); glEnd(); } void Cubo() { glColor3f(1, 1, 1); glutWireCube(0.5); //glutWireCube(10); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); PintaEjes( ); Gradua( ); glPushMatrix(); //glRotatef(40, 1, 1, 0); Rejilla(); Muros(); Cubo(); glPushMatrix(); glColorMaterial(GL_FRONT, GL_EMISSION); glColor4fv(Luz_Foco); glTranslatef(PosX, PosY, 3); glutSolidCone(0.25, 1.0, 7,7); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); //glFlush(); //sleep(20); } void Inicio(void) { // propiedades glLightfv(GL_LIGHT0, GL_AMBIENT, Luz_Ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, Luz_Dif_Espe); glLightfv(GL_LIGHT0, GL_SPECULAR, Luz_Dif_Espe); glLightfv(GL_LIGHT0, GL_POSITION, Luz0Pos); //glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, Luz0Dir); glLightfv(GL_LIGHT0, GL_POSITION, Luz0Dir); //glLightfv(GL_LIGHT0, GL_POSITION,light_dir); glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, Luz0Ang); glLightf (GL_LIGHT0, GL_LINEAR_ATTENUATION, Luz0Aten); //GL_FRONT_AND_BACK glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color); // Seleccionamos el color del material glMaterialf (GL_FRONT, GL_SHININESS, Luz0Brillo); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE); // Sin luz las caras traseras (al inicio) glEnable(GL_LIGHTING); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHT0); // activaciOn glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-DIM-5, DIM+5, -DIM-5, DIM+5, -DIM-5, DIM+5); glMatrixMode(GL_MODELVIEW); gluLookAt(-1,-1,1, 2,2,-1, 0,0,1); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glClearDepth(1.0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize (800, 600); glutInitWindowPosition (100, 100); glutCreateWindow ("Control de las luces ... "); Inicio(); glutDisplayFunc(display); glutMainLoop(); return 0; }