Laboratorio de Computación Gráfica

martes, marzo 04, 2008

Programa del brazo robot - Práctica #3 del 4 de marzo de 2008

//Programa brazo.c

//4 de marzo de 2008

//Igor Valiente - igor at servidor dot unam dot mx

#include <GL/glut.h>

GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0};  /* Red diffuse light. */
GLfloat light_position[] = {1.0, 1.0, -1.0, 0.0};  /* Infinite light location. */
GLfloat n[6][3] = {  /* Normals for the 6 faces of a cube. */
  {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
  {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };
GLint faces[6][4] = {  /* Vertex indices for the 6 faces of a cube. */
  {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
  {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
GLfloat v[8][3];  /* Will be filled in with X,Y,Z vertexes. */

static int shoulder=0;
static int joint=0;
static int wrist=0;

void drawBox(void)
{
  int i;

  for (i = 0; i < 6; i++) {
    glBegin(GL_QUADS);
    glNormal3fv(&n[i][0]);
    glVertex3fv(&v[faces[i][0]][0]);
    glVertex3fv(&v[faces[i][1]][0]);
    glVertex3fv(&v[faces[i][2]][0]);
    glVertex3fv(&v[faces[i][3]][0]);
    glEnd();
  }
}

void brazo(int shoulder, int joint, int wrist)
{
    //empieza el dibujo del brazo robot
    glPushMatrix();
        //empieza el brazo
        glRotatef((GLfloat)shoulder, 0.0, 0.0, 1.0);
        glTranslatef(1.0, 0.0, 0.0);
        glPushMatrix();
            glScalef(2.0,0.5,0.5);
            drawBox();
        glPopMatrix();
        //termina brazo
        //empieza antebrazo
        glTranslatef(1.0, 0.0, 0.0);
        glRotatef((GLfloat)joint, 0.0, 0.0, 1.0);
        glTranslatef(1.0, 0.0, 0.0);
        glPushMatrix();
            glScalef(2.0,0.5,0.5);
            drawBox();
        glPopMatrix();
        //termina antebrazo-- M6
        //empieza el grip
        glPushMatrix();
            //empieza el primer dedo
            glPushMatrix();
                glTranslatef(1.0,0.0,0.0);
                glRotatef((GLfloat)wrist,0.0,0.0,1.0);
                glTranslatef(0.35,0.125,0.0);
                glPushMatrix();
                    glScalef(0.7,0.25,0.25);
                    drawBox();
                glPopMatrix();
            glPopMatrix();
            //termina el primer dedo
            //empieza el segundo dedo
            glPushMatrix();
                glTranslatef(1.0,0.0,0.0);
                glRotatef((GLfloat)-wrist,0.0,0.0,1.0);
                glTranslatef(0.35,-0.125,0.0);
                glPushMatrix();
                    glScalef(0.7,0.25,0.25);
                    drawBox();
                glPopMatrix();
            glPopMatrix();
            //termina el segundo dedo
        glPopMatrix();
        //termina el grip
    glPopMatrix();
    //termina el dibujo del brazo robot
}
display(void)
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  brazo(shoulder,joint,wrist);
  glutSwapBuffers();
}

void
init(void)
{
  /* Setup cube vertex data. */
  v[0][0] = v[1][0] = v[2][0] = v[3][0] = -0.5;
  v[4][0] = v[5][0] = v[6][0] = v[7][0] = 0.5;
  v[0][1] = v[1][1] = v[4][1] = v[5][1] = -0.5;
  v[2][1] = v[3][1] = v[6][1] = v[7][1] = 0.5;
  v[0][2] = v[3][2] = v[4][2] = v[7][2] = 0.5;
  v[1][2] = v[2][2] = v[5][2] = v[6][2] = -0.5;

  /* Enable a single OpenGL light. */
  glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  glEnable(GL_LIGHT0);
  glEnable(GL_LIGHTING);

  /* Use depth buffering for hidden surface elimination. */
  glEnable(GL_DEPTH_TEST);

  /* Setup the view of the cube. */
  glMatrixMode(GL_PROJECTION);
  gluPerspective( /* field of view in degree */ 90.0,
    /* aspect ratio */ 1.0,
    /* Z near */ 1.0, /* Z far */ 20.0);
  glMatrixMode(GL_MODELVIEW);
  gluLookAt(0.0, 0.0, 5.0,  /* eye is at (0,0,5) */
    0.0, 0.0, 0.0,      /* center is at (0,0,0) */
    0.0, 1.0, 0.);      /* up is in positive Y direction */

  /* Adjust cube position to be asthetic angle. */
  //glTranslatef(0.0, 0.0, -1.0);
  glRotatef(20, 1.0, 0.0, 0.0);
  //glRotatef(-20, 0.0, 0.0, 1.0);
}

int keyboard(char key, int x, int y)
{
    switch(key){
        case 27:    exit(0); //tecla de escape
                    break;
        case 'h':    shoulder=(shoulder+5)%360;
                    glutPostRedisplay();
                    break;
        case 'H':    shoulder=(shoulder-5)%360;
                    glutPostRedisplay();
                    break;
        case 'c':    joint=(joint+5)%360;
                    glutPostRedisplay();
                    break;
        case 'C':    joint=(joint-5)%360;
                    glutPostRedisplay();
                    break;
        case 'm':    wrist=(wrist+5)%360;
                    glutPostRedisplay();
                    break;
        case 'M':    wrist=(wrist-5)%360;
                    glutPostRedisplay();
                    break;
        default:    break;
    }
    glutPostRedisplay();
}
int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(500,500);
  glutCreateWindow("Brazo robot rojo");
  glutDisplayFunc(display);
  glutKeyboardFunc(keyboard);
  init();
  glutMainLoop();
  return 0;             /* ANSI C requires main to return int. */
}

lunes, febrero 25, 2008

Suspensión de la sesión de laboratorio para el día 26 de febrero de 2008.

Hola muchachos,

Debido a un inconveniente (trámites), no sé dará la sesión de laboratorio correspondiente al día de mañana 26 de febrero de 2008 de 14 a 16 hrs.

La sesión reanudará normalmente para el día 4 de marzo. El miércoles busquen el previo para la práctica 3.

Aquellos que no hayan enviado el archivo de la práctica 2 para el día de mañana a las 16 hrs, ya no lo podrán enviar.

Saludos,

 

Ing. Igor Valiente.

jueves, febrero 14, 2008

Previo #2 - para el martes 19 de febrero de 2008

Universidad Nacional Autónoma de México
Facultad de Ingeniería
Departamento de Computación

Laboratorio de Computación Gráfica
http://lab-computacion-grafica.blogspot.com/

Cuestionario previo #2
Práctica del 19 de febrero de 2008
- Principios básicos -


Profr. Ing. Santiago Igor Valiente Gómez


1. ¿Qué es una transformación geométrica? ¿Cuáles son las transformaciones básicas y sus matrices?

2. Escriba los comandos que en OpenGL permiten aplicar transformaciones geométricas, las variantes de dichos comandos y describa sus parámetros.

3. Describa los comandos que en OpenGL se utilizan para definir vértices y sus parámetros. Escriba un ejemplo de cada uno.

4. ¿Para qué sirven los comandos glBegin() y glEnd()? Describa su uso, sus parámetros y ejemplifique a través de una pieza de código.

5. Construya código para dibujar un cubo y una pirámide de base triángular (tetraedro). Las medidas corren por su cuenta.

6. ¿Para qué sirven los comandos glClearColor() y glClear()? Descríbalos su funcionamiento, sus parámetros y ejemplifique a través de una pieza de código.

7. Describa los comandos glutInit(), glutInit(), glutInitDisplayMode(), glutInitWindowSize(), glutInitWindowPosition(), glutCreateWindow(), glutDisplayFunc(), glutReshapeFunc(), glutKeyboardFunc() y glutMainLoop(). Describa su funcionamiento, uso y parámetros.

martes, junio 12, 2007

Calificaciones finales del Laboratorio - 2007-2

Hola muchachos,

Pues llegamos al final, al menos para el laboratorio. Pueden consultar sus calificaciones en el siguiente URL:

http://www.geocities.com/wizbits1/CF_LCG_2007-2.html

Por favor hagan llegar sus dudas y/o comentarios.

Saludos,

Ing. Igor Valiente.

sábado, marzo 03, 2007

Cuestionario previo #2 - 2007-2

Universidad Nacional Autónoma de México
Facultad de Ingeniería
Departamento de Computación

Laboratorio de Computación Gráfica

http://lab-computacion-grafica.blogspot.com/

Cuestionario previo #2
Práctica del 6 de marzo de 2007
- Modelado Geométrico -

Profr. Ing. Santiago Igor Valiente Gómez

1. ¿Qué es una transformación geométrica? ¿Cuáles son las transformaciones básicas y sus matrices?

2. Escriba los comandos que en OpenGL permiten aplicar transformaciones geométricas, las variantes de dichos comandos y describa sus parámetros.

3. Describa en OpenGL qué son las matrices GL_MODELVIEW y GL_PROJECTION. ¿Para qué sirven? ¿Cómo se puede intercambiar entre una y otra? ¿Cuál es la matriz activa por defecto? ¿Para que sirve el comando glLoadIdentity()?

4. ¿Para qué son los comandos glPushMatrix() y glPopMatrix()? Describa su uso a través de un ejemplo en código.

5. ¿Para qué sirven los comandos glBegin() y glEnd()? Describa su uso, sus parámetros y ejemplifique a través de una pieza de código.

6. ¿Qué es modelado geométrico? Describa los tipos de modelado geométrico que existen.

7. Construya código para dibujar un cubo (revisar en la clase de teoría), y a partir de éste modele jerárquicamente el humanoide de la ilustración y escriba el programa que lo dibuja. Las medidas corren por su cuenta.


8. ¿Para qué sirven los comandos glClearColor() y glClear()? Descríbalos su funcionamiento, sus parámetros y ejemplifique a través de una pieza de código.

9. Describa los comandos glutInit(), glutInit(), glutInitDisplayMode (), glutInitWindowSize (), glutInitWindowPosition (), glutCreateWindow (), glutDisplayFunc(), glutReshapeFunc(), glutKeyboardFunc() y glutMainLoop(). Describa su funcionamiento, uso y parámetros.

10. ¿Qué es un Function Callback en GLUT?

Etiquetas:

lunes, febrero 19, 2007

Primera práctica 2007-2

La primera práctica del laboratorio de computación gráfica se realizará este martes 20 de febrero de 2007, de 14:00 a 16:00 hrs en el Laboratorio Microsoft Research ubicado en el segundo piso del edificio Ing. Luis G. Valdés Vallejo.

Se les solicita que asistan puntualmente, ya que las asistencias al laboratorio son un factor fundamental de la evaluación.

Gracias,

Ing. Igor Valiente

Etiquetas:

Bienvenidos al semestre 2007-2

Bienvenidos al semestre 2007-2 de la facultad de Ingeniería de la UNAM.

Espero que sea un semestre fructífero y lleno de sorpresas agradables para todos.

Así sea,

Igor Valiente.

domingo, diciembre 31, 2006

Calificaciones finales semestre 2007-1

Hola,

Las calificaciones finales las pueden consultar en:

http://www.geocities.com/wizbits1/CF2007-1.html

Y tienen hasta antes del día 8 de enero de 2007 para presentar dudas, quejas o aclaraciones.

Recuerden que en la parte inferior de la página les mostrará unas tabletas para que seleccionen la asignatura correspondiente.

¡Saludos y féliz año!

Ing. Igor Valiente