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. */
}