BRAZO ARTICULADO CON ILUMINACIÓN
BRAZO ARTICULADO CON ILUMINACIÓN
Implementando la estructura de un brazo articulado con movimiento en 4 grados de libertad e iluminación artificial.
Jose Angel Espinoza Portillo
Otoño 2007
Definiendo el problema
Dibujar un brazo articulado en 3D que pueda moverse con las pulsaciones de teclas e implementar un sistema de iluminación que permita ver un reflejo de la luz en la estructura del brazo.
Primer paso - Colocar la cámara
Como en la analogía del camarógrafo explicado en clase, el primero paso es colocar la cámara apuntando hacia donde esta lo que se desea visualizar, para esto cargamos la matriz de proyección y especificamos el punto de vista basado en la elevación de la cámara y el ángulo de visión (rotado en el eje y) y llamamos gluLookAt para ser ejecutado con esas coordenadas mirando al origen, con el siguiente código:
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective(30,1,0.01,100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity (); /* clear the matrix */
eye[0] = zoom *sin(azi*3.1416/180) * cos(ele*3.1416/180);
eye[1] = zoom *sin(ele*3.1416/180) ;
eye[2] = zoom *cos(azi*3.1416/180) * cos(ele*3.1416/180);
gluLookAt(eye[0],eye[1],eye[2],0,0,0,0,1,0);
Iluminación
Lo que se quiere lograr con la iluminación es tener un efecto de reflejo de la luz blanca en las superficies de as figuras, con respecto a la cámara y la fuente de luz (que se colocara en el punto (1,1,1)), y que el material del objeto permanezca del color que se le da a el objeto esto se hace habilitando el GL_COLOR_MATERIAL, esto se realiza con el siguiente código:
// Define el punto de origen de luz y su brillo
GLfloat light0_pos[]={1.0,1.0,1.0,1.0};
GLfloat shininess[]={5.0}; // Mientras mas pequeño da la apariencia de mas brillo.
glEnable(GL_LIGHTING);// habilita la iluminación
glEnable(GL_LIGHT0);
Color_white[0]=1.0; Color_white[1]=1.0; Color_white[2]=1.0; Color_white[3]=1.0;
Color_blue[0]=0.0; Color_white[1]=0.0; Color_white[2]=1.0; Color_white[3]=1.0;
// Configura los puntos de luz
glLightfv(GL_LIGHT0,GL_POSITION,light0_pos);
glLightfv(GL_LIGHT0,GL_AMBIENT,Color_white);
glLightfv(GL_LIGHT0,GL_DIFFUSE,Color_white);
glLightfv(GL_LIGHT0,GL_SPECULAR,Color_white);
mat[0][0]=1.0; mat[0][1]=1.0; mat[0][2]=1.0; mat[0][3]=1.0;
glEnable(GL_COLOR_MATERIAL);// Se habilita que respete el color de la forma como
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); // el color del material
glMaterialfv(GL_FRONT,GL_SPECULAR,&mat[0][0]); // Se especifica la luz especular.
glMaterialfv(GL_FRONT,GL_SHININESS,shininess);
El brazo articulado.
Como se comento al inicio del reporte se desea dibujar un brazo articulado el cual esta constituido por tres piezas movibles y una base rotatoria y la transformación que se le haga a cada uno de los elementos desde la base debe afectar a todos los demás elementos hasta la punta, para esto se baso en ir aplicando las transformaciones entre dibujado y dibujado de cada parte del brazo, así las nuevas partes dibujadas heredaran las transformaciones anteriores. Para hacer esto se utilizo el siguiente código:
float h0=2,h1=5,h2=4,h3=4;
glMatrixMode (GL_MODELVIEW);
glPushMatrix();
RotaX(-90);
RotaZ(angulo1);
DibujaCilindro(2,2,h0,20,Color_blue);
RotaY(angulo2);
DibujaCilindro(.5,.2,h1,20,Color_blue);
RotaY(angulo3);
DibujaCilindro(.4,.2,h2,20, Color_blue);
RotaY(angulo4);
DibujaCilindro(.4,.2,h3,20, Color_blue);
glPopMatrix();
Donde Rotax, RotaX y RotaZ son funciones donde están implementadas las matrices de transformación de cada una de estas rotaciones.
Modificación desde el teclado.
En el código anterior se a mostrado como iluminar y dibujar un objeto en 3D, pero no se a explicado la manera en que se modifican las variables de donde se toman los valores para guiarse en el dibujado.
Estas instrucciones se hacen directamente desde el teclado modificando las variables de los parámetros usados anteriormente.
float step = 10;
switch (event->key()) {
case Qt::Key_Plus:
signo = 1;
break;
case Qt::Key_Minus:
signo = -1;
break;
case Qt::Key_Left:
azi += step;
break;
case Qt::Key_Right:
azi -= step;
break;
case Qt::Key_PageDown:
zoom += 1;
break;
case Qt::Key_PageUp:
zoom -= 1;
break;
case Qt::Key_Up:
ele += step;
break;
case Qt::Key_Down:
ele -= step;
break;
case Qt::Key_T:
angulo1 += 10;
break;
case Qt::Key_G:
angulo1 -= 10;
break;
case Qt::Key_Y:
angulo2 += 10;
break;
case Qt::Key_H:
angulo2 -= 10;
break;
case Qt::Key_U:
angulo3 += 10;
break;
case Qt::Key_J:
angulo3 -= 10;
break;
case Qt::Key_I:
angulo4 += 10;
break;
case Qt::Key_K:
angulo4 -= 10;
break;
case Qt::Key_D:
lightXYZ[0] += .1;
break;
case Qt::Key_A:
lightXYZ[0] -= .1;
break;
case Qt::Key_W:
lightXYZ[1] += .1;
break;
case Qt::Key_S:
lightXYZ[1] -= .1;
break;
case Qt::Key_X:
lightXYZ[2] += .1;
break;
case Qt::Key_Z:
lightXYZ[2] -= .1;
break;
default:
QWidget::keyPressEvent(event);
}
updateGL();
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home