domingo, 11 de marzo de 2007

Previo Práctica 2 - Humanoide parametrizado

A continuación se presenta el código para la figura humanoide parametrizada.

/** Humanoparame.c

Este programa despliega una figura humanoide parametrizada y jerarquizada. Cuando es ejecutado, es posible mover el torso entero en y con la tecla ‘t’; el brazo derecho con la tecla ‘d’ y el antebrazo derecho con la tecla ‘s’; además, se puede decidir sobre qué ejes se moverán estos dos últimos, cambiando los ejes de referencia al presionar las teclas ‘1’ y ‘2’ para brazo y antebrazo respectivamente.*/

#include

#include

void init(void)

{

glClearColor (0.0, 0.0, 0.0, 0.0);

glShadeModel (GL_FLAT);

}

void cuborelleno(void)

{

glBegin(GL_QUADS);

glVertex3f(0.5,0.5,0.5);//v1

glVertex3f(-0.5,0.5,0.5);//v2

glVertex3f(-0.5,-0.5,0.5);//v3

glVertex3f(0.5,-0.5,0.5);//v4

glEnd();

glBegin(GL_QUADS);

glVertex3f(-0.5,0.5,-0.5);//v5

glVertex3f( 0.5,0.5,-0.5);//v6

glVertex3f(0.5,-0.5,-0.5);//v7

glVertex3f(-0.5,-0.5,-0.5);//v8

glEnd();

glBegin(GL_QUADS);

glVertex3f(-0.5,0.5,0.5);//v2

glVertex3f(-0.5,0.5,-0.5);//v5

glVertex3f(-0.5,-0.5,-0.5);//v8

glVertex3f(-0.5,-0.5,0.5);//v3

glEnd();

glBegin(GL_QUADS);

glVertex3f(0.5,0.5,0.5);//v1

glVertex3f(0.5,-0.5,0.5);//v4

glVertex3f( 0.5,-0.5,-0.5);//v7

glVertex3f(0.5,0.5,-0.5);//v6

glEnd();

glBegin(GL_QUADS);

glVertex3f(-0.5,0.5,-0.5);//v5

glVertex3f(-0.5,0.5,0.5);//v2

glVertex3f(0.5,0.5,0.5);//v1

glVertex3f( 0.5,0.5,-0.5);//v6

glEnd();

glBegin(GL_QUADS);

glVertex3f(0.5,-0.5,-0.5);//v7

glVertex3f(-0.5,-0.5,-0.5);//v8

glVertex3f(-0.5,-0.5,0.5);//v3

glVertex3f(0.5,-0.5,0.5);//v4

glEnd();

}

void cubohueco(void)

{

glBegin(GL_LINE_LOOP);

glVertex3f(0.5,0.5,0.5);//v1

glVertex3f(-0.5,0.5,0.5);//v2

glVertex3f(-0.5,-0.5,0.5);//v3

glVertex3f(0.5,-0.5,0.5);//v4

glEnd();

glBegin(GL_LINE_LOOP);

glVertex3f(-0.5,0.5,-0.5);//v5

glVertex3f( 0.5,0.5,-0.5);//v6

glVertex3f(0.5,-0.5,-0.5);//v7

glVertex3f(-0.5,-0.5,-0.5);//v8

glEnd();

glBegin(GL_LINE_LOOP);

glVertex3f(-0.5,0.5,0.5);//v2

glVertex3f(-0.5,0.5,-0.5);//v5

glVertex3f(-0.5,-0.5,-0.5);//v8

glVertex3f(-0.5,-0.5,0.5);//v3

glEnd();

glBegin(GL_LINE_LOOP);

glVertex3f(0.5,0.5,0.5);//v1

glVertex3f(0.5,-0.5,0.5);//v4

glVertex3f( 0.5,-0.5,-0.5);//v7

glVertex3f(0.5,0.5,-0.5);//v6

glEnd();

glBegin(GL_LINE_LOOP);

glVertex3f(-0.5,0.5,-0.5);//v5

glVertex3f(-0.5,0.5,0.5);//v2

glVertex3f(0.5,0.5,0.5);//v1

glVertex3f( 0.5,0.5,-0.5);//v6

glEnd();

glBegin(GL_LINE_LOOP);

glVertex3f(0.5,-0.5,-0.5);//v7

glVertex3f(-0.5,-0.5,-0.5);//v8

glVertex3f(-0.5,-0.5,0.5);//v3

glVertex3f(0.5,-0.5,0.5);//v4

glEnd();

}

static int brazderrot = 0; /*Variable que indica sobre cual eje rotará el brazo derecho.*/

static int angbrazder = 0; /*Variable que indica el ángulo de rotación del brazo derecho*/

static int codderrot = 0; /*Variable que indica sobre cual eje rotará el brazo derecho.*/

static int angcododer = 0; /*Variable que indica el ángulo de rotación del brazo derecho*/

static int brazizqrot = 0; /*Variable que indica sobre cual eje rotará el brazo izquierdo.*/

static int angbrazizq = 0; /*Variable que indica el ángulo de rotación del brazo izquierdo*/

static int pierderrot = 0; /*Variable que indica sobre cual eje rotará la pierna derecha.*/

static int angpierder = 0; /*Variable que indica el ángulo de rotación de la pierna derecha.*/

static int pierizqrot = 0; /*Variable que indica sobre cual eje rotará la pierna izquierda.*/

static int angpierizq = 0; /*Variable que indica el ángulo de rotación de la pierna izquierda.*/

static int torsorot = 0; /*Variable que indica el ángulo de rotación del torso.*/

static int cuellorot = 0; /*Variable que indica el ángulo de rotación de la cabeza.*/

void cabeza (float x){ /* Función que despliega la cabeza. */

glPushMatrix();

glTranslatef(0.0,2.0,0.0);

glRotatef(x,0.0,0.1,0.0);

cubohueco();

glPopMatrix();

}

void tronco (float x, float y, float z){ /*Función que despliega el torso.*/

glTranslatef(x,y,z);

glRotatef((GLfloat)torsorot,0.0,1.0,0.0);

glPushMatrix();

glScalef (2.0, 3.0, 1.0);

cubohueco();

glPopMatrix();

}

void brazoder (int y, int z){ /*Función que despliega el brazo derecho.*/

glPushMatrix();

glTranslatef(2.0,1.25,0.0);

glTranslatef(-1.0,0.0,0.0);

switch(y){ /*Switch que indica sobre qué eje va a girar el brazo.*/

case 0:

glRotatef((GLfloat)angbrazder, 1.0, 0.0, 0.0);

break;

case 1:

glRotatef((GLfloat)angbrazder, 0.0, 1.0, 0.0);

break;

case 2:

glRotatef((GLfloat)angbrazder, 0.0, 0.0, 1.0);

break;

default:

break;

}

glPushMatrix();

glTranslatef(1.0,0.0,0.0);

glScalef(2.0,0.5,1.0);

cubohueco();

glPopMatrix();

/*antebrazo derecho*/

glTranslatef(3.0,0.0,0.0);

glTranslatef(-1.0,0.0,0.0);

switch(z){ /*Switch que indica sobre qué eje va a girar el antebrazo derecho.*/

case 0:

glRotatef((GLfloat)angcododer, 1.0, 0.0, 0.0);

break;

case 1:

glRotatef((GLfloat)angcododer, 0.0, 1.0, 0.0);

break;

case 2:

glRotatef((GLfloat)angcododer, 0.0, 0.0, 1.0);

break;

default:

break;

}

glPushMatrix();

glTranslatef(1.0,0.0,0.0);

glScalef(2.0,1.0,1.0);

cubohueco();

glPopMatrix();

/*mano derecha*/

glTranslatef(2.25,0.0,0.0);

glPushMatrix();

glScalef(0.5,0.5,1.0);

cubohueco();

glPopMatrix();

glPopMatrix();/*brazo derecho completo*/

}

void brazoizq (float x, int y){

glPushMatrix();

glTranslatef(-2.0,1.25,0.0);

switch(y){ /*Switch que indica sobre qué eje va a girar el brazo izquierdo.*/

case 0:

glRotatef((GLfloat)angbrazizq, 1.0, 0.0, 0.0);

break;

case 1:

glRotatef((GLfloat)angbrazizq, 0.0, 1.0, 0.0);

break;

case 2:

glRotatef((GLfloat)angbrazizq, 0.0, 0.0, 1.0);

break;

default:

break;

}

glPushMatrix();

glScalef(2.0,0.5,1.0);

cubohueco();

glPopMatrix();

/*antebrazo izquierdo*/

glTranslatef(-2.0,0.0,0.0);

glPushMatrix();

glScalef(2.0,1.0,1.0);

cubohueco();

glPopMatrix();

/*mano izquierdo*/

glTranslatef(-1.25,0.0,0.0);

glPushMatrix();

glScalef(0.5,0.5,1.0);

cubohueco();

glPopMatrix();

glPopMatrix();/*brazo izquierdo completo*/

}

void pierder (float x, int y){

glPushMatrix();

glTranslatef(0.6,-2.25,0.0);

switch(y){ /*Switch que indica sobre qué eje va a la pierna derecha.*/

case 0:

glRotatef((GLfloat)angpierder, 1.0, 0.0, 0.0);

break;

case 1:

glRotatef((GLfloat)angpierder, 0.0, 1.0, 0.0);

break;

case 2:

glRotatef((GLfloat)angpierder, 0.0, 0.0, 1.0);

break;

default:

break;

}

glPushMatrix();

glScalef(0.75,1.5,1.0);

cubohueco();

glPopMatrix();

/*pantorrilla derecha*/

glTranslatef(0.0,-1.5,0.0);

glPushMatrix();

glScalef(0.6,1.5,1.0);

cubohueco();

glPopMatrix();

/*pie derecho*/

glTranslatef(0.25,-0.85,0.0);

glPushMatrix();

glScalef(1.5,0.25,1.0);

cubohueco();

glPopMatrix();

glPopMatrix();/*pierna derecha completa*/

}

void pierizq (float x, int y){

glPushMatrix();

glTranslatef(-0.6,-2.25,0.0);

switch(y){ /*Switch que indica sobre qué eje va a girar la pierna izquierda.*/

case 0:

glRotatef((GLfloat)angpierizq, 1.0, 0.0, 0.0);

break;

case 1:

glRotatef((GLfloat)angpierizq, 0.0, 1.0, 0.0);

break;

case 2:

glRotatef((GLfloat)angpierizq, 0.0, 0.0, 1.0);

break;

default:

break;

}

glPushMatrix();

glScalef(0.75,1.5,1.0);

cubohueco();

glPopMatrix();

/*pantorrilla izquierda*/

glTranslatef(0.0,-1.5,0.0);

glPushMatrix();

glScalef(0.6,1.5,1.0);

cubohueco();

glPopMatrix();

/*pie izquierdo*/

glTranslatef(-0.25,-0.85,0.0);

glPushMatrix();

glScalef(1.5,0.25,1.0);

cubohueco();

glPopMatrix();

glPopMatrix();/*pierna izquierda completa*/

}

void display (void)

{

glClear (GL_COLOR_BUFFER_BIT);

glColor3f (1.0, 1.0, 1.0);

glLoadIdentity (); /* clear the matrix */

gluLookAt (0.0, 0.0, 9.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

glPushMatrix();

/*torso*/

tronco(0.0,1.5,0.0);

/*cara*/

cabeza(cuellorot);

/*brazo derecho*/

brazoder(brazderrot, codderrot);

/*brazo izquierdo*/

brazoizq(angbrazizq,brazizqrot);

/*muslo derecho*/

pierder(angpierder,pierderrot);

/*muslo izquierdo*/

pierizq(angpierizq,pierizqrot);

glPopMatrix();/*humanoide completo*/

glFlush ();

}

void reshape (int w, int h)

{

glViewport (0, 0, (GLsizei) w, (GLsizei) h);

glMatrixMode (GL_PROJECTION);

glLoadIdentity ();

glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);

glMatrixMode (GL_MODELVIEW);

}

/* ARGSUSED1 */

void keyboard(unsigned char key, int x, int y)

{

switch (key) {

case 't':

torsorot = (torsorot + 5)%360;

glutPostRedisplay();

break;

case '1':

brazderrot = brazderrot + 1;

angbrazder = 0;

angcododer = angcododer-5;

if(brazderrot==3){

brazderrot = 0;

}

case '2':

codderrot = codderrot + 1;

angcododer = 0;

angbrazder = angbrazder-5;

if(codderrot==3){

codderrot = 0;

}

case 'd':

angbrazder = (angbrazder + 5)%180;

glutPostRedisplay();

break;

case 's':

angcododer = (angcododer + 5)%180;

glutPostRedisplay();

break;

case 27:

exit(0);

break;

}

}

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize (800, 800);

glutInitWindowPosition (100, 100);

glutCreateWindow (argv[0]);

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutKeyboardFunc(keyboard);

glutMainLoop();

return 0;

}

No hay comentarios.: