Las escenas jerárquicas son útiles cuando se asocian transformaciones geométricas, ya que sería
demasiado complicado rotar, trasladar y escalar una y otra vez algunos objetos que están
emparentados, en vez de esto es más fácil encontrar la relación que existe entre dichos objetos y
solo tener que hacer pocas transformaciones para lograr los resultados deseados.
2. Escriba un programa que construya de manera jeraquica una escena en la que :
- Hagan 3 humanoides:
- 1 Alto y largo
- 1 normal
- 1 chaparro y regordete.
#include
#include
GLUquadricObj *quadratic;
float ang_hombro;
void reshape(int width, int height){
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
}
void init(){
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.3f, 0.3f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void cubo(){
glBegin(GL_QUADS);
glColor3f(1.0f,1.0f,1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f( 1.0f,-1.0f,-1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);glVertex3f( 1.0f,-1.0f, 1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);glVertex3f( 1.0f, 1.0f,-1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f, 1.0f);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);glVertex3f( 1.0f,-1.0f,-1.0f);
glEnd();
}
void cabeza(){
glPushMatrix();
glColor3f(1.0f,0.64f,0.52f);
glutSolidSphere(1,20,20);
glPopMatrix();
}
void cuello(){
glPushMatrix();
glRotatef(90,1,0,0);
glColor3f(1.0f,0.64f,0.52f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.40f,0.40f,0.30,10,10);
glPopMatrix();
}
void dorzo(){
glPushMatrix();
glRotatef(90,1,0,0);
glColor3f(1.0f,0.0f,0.0f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,2.0f,1.5f,4.0,10,10);
glPopMatrix();
}
void hombro(){
glPushMatrix();
glColor3f(1.0f,0.0f,0.0f);
glutSolidSphere(0.6,20,20);
glPopMatrix();
}
void antebrazo(){
glPushMatrix();
glRotatef(90,1,0,0);
glColor3f(1.0f,0.64f,0.52f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.6f,0.4f,2.0,10,10);
glPopMatrix();
}
void codo(){
glPushMatrix();
glColor3f(1.0f,0.64f,0.52f);
glutSolidSphere(0.5,20,20);
glPopMatrix();
}
void brazo(){
glPushMatrix();
glRotatef(90,1,0,0);
glColor3f(1.0f,0.64f,0.52f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.5f,0.3f,1.5,10,10);
glPopMatrix();
}
void mano(){
glPushMatrix();
glColor3f(1.0f,0.64f,0.52f);
glutSolidSphere(0.6,20,20);
glPopMatrix();
}
void cadera(){
glPushMatrix();
glRotatef(90,0,1,0);
glColor3f(0.0f,0.0f,0.6f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.5f,0.5f,3.0,10,10);
glPopMatrix();
}
void muslo(){
glPushMatrix();
glRotatef(90,1,0,0);
glColor3f(0.0f,0.0f,0.6f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.8f,0.6f,1.8,10,10);
glPopMatrix();
}
void rodilla(){
glPushMatrix();
glColor3f(0.0f,0.0f,0.6f);
glutSolidSphere(0.7,20,20);
glPopMatrix();
}
void espinilla(){
glPushMatrix();
glRotatef(90,1,0,0);
glColor3f(0.0f,0.0f,0.6f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.6f,0.45f,2.0,10,10);
glPopMatrix();
}
void zapato(){
glPushMatrix();
glColor3f(0.8,0.8,0.8);
glScalef(0.4,0.5,1.5);
cubo();
glPopMatrix();
}
void brazo_completo(float ang_hombro){
glPushMatrix();
hombro();
glRotatef(ang_hombro,0,0,1);
glPushMatrix();
antebrazo();
glPushMatrix();
glTranslatef(0.0,-2.0,0.0);
codo();
glPushMatrix();
brazo();
glPushMatrix();
glTranslatef(0.0,-2.1,0.0);
mano();
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void pierna_completa(){
glPushMatrix();
muslo();
glPushMatrix();
glTranslatef(0.0,-2.2,0.0);
rodilla();
glPushMatrix();
glTranslatef(0.0,-0.4,0.0);
espinilla();
glPushMatrix();
glTranslatef(0.0,-2.6,0.5);
zapato();
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void humanoide(){
glPushMatrix();
dorzo();
glPushMatrix();
glPushMatrix();
glTranslatef(0.0,0.25,0.0);
cuello();
glPushMatrix();
glTranslatef(0.0,0.9,0.0);
cabeza();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(2.0,-0.6,0.0);
brazo_completo(25.0);
glPopMatrix();
glPushMatrix();
glTranslatef(-2.0,-0.6,0.0);
brazo_completo(-25.0);
glPopMatrix();
glPushMatrix();
glTranslatef(-1.5,-4.75,0.0);
cadera();
glPushMatrix();
glTranslatef(2.2,-0.5,0.0);
pierna_completa();
glPopMatrix();
glPushMatrix();
glTranslatef(0.7,-0.5,0.0);
pierna_completa();
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void humanoide_1(){
glPushMatrix();
glScalef(0.2,0.2,0.2);
humanoide();
glPopMatrix();
}
void prisma_rectangular(){
glPushMatrix();
glScalef(1.0,2.0,1.0);
glBegin(GL_QUADS);
glColor3f(0.3f,0.3f,0.3f);
glVertex3f( 1.0f, 1.0f,-1.0f);glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f( 1.0f,-1.0f,-1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);glVertex3f( 1.0f,-1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);glVertex3f( 1.0f,-1.0f,-1.0f);
glEnd();
glPopMatrix();
}
void esfera(){
glPushMatrix();
glColor3f(0.4f,0.6f,0.9f);
glutSolidSphere(2.0,20,20);
glPopMatrix();
}
void robot_antebrazo(){
glPushMatrix();
glRotatef(90,0,1,0);
glColor3f(1.0f,1.0f,1.0f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.6f,0.45f,4.0,10,10);
glPopMatrix();
}
void robot_codo(){
glPushMatrix();
glColor3f(0.4f,0.6f,0.9f);
glutSolidSphere(0.6,20,20);
glPopMatrix();
}
void robot_brazo(){
glPushMatrix();
glRotatef(90,0,1,0);
glColor3f(1.0f,1.0f,1.0f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.4f,0.3f,4.0,10,10);
glPopMatrix();
}
void robot_dedo1(){
glPushMatrix();
glRotatef(90,0,1,0);
glColor3f(0.4f,0.6f,0.9f);
quadratic=gluNewQuadric();
gluCylinder(quadratic,0.15f,0.15f,0.8,10,10);
glPopMatrix();
}
void brazo_robot_completo(){
glPushMatrix();
glTranslatef(-5.0f, 0.0f, 0.0f);
glRotatef(-20, 0.0f, 0.0f, 1.0f);
robot_antebrazo();
glPushMatrix();
glTranslatef(3.8f, 0.0f, 0.0f);
glRotatef(0, 0.0f, 0.0f, 1.0f);
robot_codo();
glPushMatrix();
glTranslatef(0.5f, 0.0f, 0.0f);
glRotatef(20, 0.0f, 0.0f, 1.0f);
robot_brazo();
glPushMatrix();
glTranslatef(4.0f, 0.2f, 0.0f);
glRotatef(40, 0.0f, 0.0f, 1.0f);
robot_dedo1();
glPushMatrix();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(4.0f, -0.2f, 0.0f);
glRotatef(-40, 0.0f, 0.0f, 1.0f);
robot_dedo1();
glPushMatrix();
glTranslatef(0.8f, 0.0f, 0.0f);
glRotatef(40, 0.0f, 0.0f, 1.0f);
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void esfera_brazos(){
glPushMatrix();
esfera();
glPushMatrix();
glTranslatef(4.0,0.0,0.0);
glScalef(0.5,0.5,0.5);
brazo_robot_completo();
glPopMatrix();
glPushMatrix();
glTranslatef(-4.0,0.0,0.0);
glRotatef(-180, 0.0f, 1.0f, 0.0f);
glScalef(0.5,0.5,0.5);
brazo_robot_completo();
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,0.0,4.0);
glRotatef(-90, 0.0f, 1.0f, 0.0f);
glScalef(0.5,0.5,0.5);
brazo_robot_completo();
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,0.0,-4.0);
glRotatef(90, 0.0f, 1.0f, 0.0f);
glScalef(0.5,0.5,0.5);
brazo_robot_completo();
glPopMatrix();
glPopMatrix();
}
void triangulo(){
glPushMatrix();
glScalef(10.0,10.0,10.0);
glBegin(GL_TRIANGLES);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( -1.0f, 0.0f, 0.0f);
glVertex3f(1.0f,0.0f, 0.0f);
glVertex3f( 0.0f,0.0f, -1.71f);
glEnd();
glPopMatrix();
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt (11.0, 10.0, 1.0, 3.0, 0.0, -10.0, 0.0, 1.0, 0.0);
glTranslatef(0,-3.0,-10.0);
glPushMatrix();
triangulo();
glPopMatrix();
glPushMatrix();
glTranslatef(0,2.25,-6.0);
prisma_rectangular();
glTranslatef(0,2.25,0.0);
esfera_brazos();
glPopMatrix();
glPushMatrix();
glTranslatef(-8.0,2.2,-1.0);
humanoide_1();
glPopMatrix();
glPushMatrix();
glTranslatef(8.0,2.8,-1.0);
glScalef(1.3,1.3,1.3);
humanoide_1();
glPopMatrix();
glPushMatrix();
glTranslatef(0.0,2.2,-15.0);
humanoide_1();
glFlush();
glutSwapBuffers();
}
void idle(){
display();
}
int main(int argc, char **argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(400, 100);
glutInitWindowSize(500, 400);
glutCreateWindow("Escena jerárquica con thulhn");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
No hay comentarios:
Publicar un comentario