Você está na página 1de 8

CENTRO DE ENSINO UNIFICADO DE TERESINA LTDA

FACULDADE DE CINCIAS HUMANAS E JURDICAS DE TERESINA DIRETORIA ACADMICA COORDENAO DO CURSO DE BCHARELADO EM COMPUTAO

DISCIPLINA: COMPUTAO GRFICA PROFESSOR: IGOR FELICIANO S. REVOREDO

BLOCO: V

Trabalho N 1 (Parte da 2 Avaliao) Especificaes: Apresentao do trabalho at o dia 17 de outubro. Valor: 4,0 pts. Busque nos livros e internet auxlio para as funes (e seus parmetros): glutTimerFunc(), glutSpecialFunc(), glutKeyboardFunc(), por exemplo. Responda cada uma das questes no final de cada especificao. Assunto: Hierarquia
Aviso: Lembre que o cdigo fonte dado no compilvel por si s. Para compilar e executar os exemplos dados aqui, necessrio apenas adicionar partes de cdigo nos locais corretos das suas implementaes. Objetivo: Construo e animao de objetos hierrquicos. A animao hierrquica uma das tcnicas existentes para animao de objetos cujos movimentos dependem dos movimentos de outros objetos. usada tambm para animar objetos complexos (compostos por diferentes elementos que se movem uns em relao aos outros). Dois exemplos: 1. Um planetrio: neste caso os objetos dependem uns dos outros (Planetas girando em torno do Sol e satlites em torno dos planetas). 2. Articulated robot arm: neste caso temos um objeto complexo (partes conectadas). O movimento dos elementos ser definido por transformaes (translaes, rotaes e possivelmente escala). Note que animao hierrquica diz respeito a segmentos rgidos; neste curso no veremos objetos deformveis. Exerccio 1: hierarquia de um planetrio (nosso Sistema Solar). Iniciemos por um modelo simplificado do Sistema Solar. Este modelo composto pelo Sol, em torno do qual giram a Terra e Marte. Ele tem tambm a Lua, que gira em torno da Terra. A hierarquia representada da seguinte maneira: Sol +- Terra +- Lua +- Marte Ento diz-se que:

a Terra um filho do Sol a Lua um filho da Terra Marte um filho do Sol

Cada filho depende do movimento do seu pai. Uma imagem renderizada desse modelo mostrada na figura 1.

Figura 1. Vista do planetrio simplificado. Comeamos inicializando os ngulos de rotao para os corpos celestes. /* rotation angles for the celestial bodies */ float angleEarth = 0; float angleMoon = 0; float angleMars = 0; /* for the camera, remember the previous weeks assignments */ #define y_min 60 #define ro_min 120 float eyex = 0; float eyey = y_min; float eyez = ro_min; void drawSun(){ glColor3f( 1, 1, 0 ); glutSolidSphere( 12, 16, 16 ); } void drawEarth(){ glColor3f( 0, 0, 1 ); glutSolidSphere( 5, 16, 16 );

} void drawMoon(){ glColor3f( 0.5, 0.5, 0.5 ); glutSolidSphere( 1, 16, 16 ); } void drawMars(){ glColor3f( 1, 0.2, 0 ); glutSolidSphere( 4, 16, 16 );

Ento, na funo display, criamos a hierarquia. Observem com ateno o uso dos blocos glPushMatrix/glPopMatrix que permitem salvar e restaurar o contexto de transformaes. O uso desses blocos necessrio quando h ramificaes na hierarquia, i. e., quando um pai tem mais de um filho. Nesse caso, necessrio usar PushMatrix para salvar o contexto e PopMatrix para recuper-lo. o que acontece com as ligaes (Sol >> Terra) e (Sol >> Marte) e que caracteriza uma bifurcao (revise o quadro da hierarquia). Assim, depois de fazer as transformaes da Terra, que depende do Sol, ser necessrio voltar ao contexto do Sol para aplicar as transformaes referentes a Marte, porque ele tambm depende do Sol. Se o contexto no for recarregado, a hierarquia vai se perder completamente. void display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(eyex,eyey,eyez,0,0,0,0,1,0); // Draw planetary system glPushMatrix(); drawSun(); glPushMatrix(); glRotatef( angleEarth, 0, 1, 0 ); glTranslatef( 30, 0, 0 ); drawEarth(); glPushMatrix(); glRotatef( angleMoon, 0, 1, 0 ); glTranslatef( 7, 0, 0 ); drawMoon(); glPopMatrix(); glPopMatrix(); glPushMatrix(); glRotatef( angleMars, 0, 1, 0 ); glTranslatef( 50, 0, 0 ); drawMars(); glPopMatrix(); glPopMatrix(); glutSwapBuffers();

} E aqui, finalmente, o timer para animao do sistema. void TimerFunction( int value ){ angleEarth += 3; if( angleEarth >= 360 ) angleEarth = 0; angleMoon += 6; if( angleMoon >= 360 ) angleMoon = 0; angleMars += 2; if( angleMars >= 360 ) angleMars = 0; glutPostRedisplay(); glutTimerFunc( 33, TimerFunction, 1); } Para navegar em torno do sistema e observ-lo de diferentes pontos de vista, se pode reutilizar o cdigo para animao de cmera visto anteriormente. Questes: 1. Testem o exemplo anterior e ENTENDAM a hierarquia. 2. Completem a cena: Adicionem outros planetas e satlites. Coloquem uma fonte de luz no centro do Sol. Se quiserem podem tambm adicionar cometas, asterides e at espaonaves.

Exerccio 2 : Brao de rob articulado Agora veremos como animar outro tipo de hierarquia. Um brao robtico, que um conjunto de partes articuladas que poder dar algumas idias para o projeto. O brao composto de 6 segmentos: Brao Antebrao Mo o Dedo 1 o Dedo 2 o Dedo 3

Uma imagem renderizada mostrada na figura 2:

Figure 2. Vista do brao articulado De forma anloga ao planetrio, implementaremos os vrios elementos. As variveis globais: /* angles for the articulations */ float shoulderAngle = 0; float elbowAngle = 0; float handAngle = 0; float finger1Angle = 0; float finger2Angle = 0; float finger3Angle = 0; int flag = 0; // flag to select the element to be edited int stop = 1; // flag to stop the animation /* for the camera, same thing of the previous exercice */ #define y_min 60 #define ro_min 120 float eyex = 0; float eyey = y_min; float eyez = ro_min; Depois, a funo display com a hierarquia do rob.

void display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(eyex,eyey,eyez,0,0,0,0,1,0); glPushMatrix(); glScalef( 100, 100, 100 ); glTranslatef( -0.5, 0, -0.5 ); drawPlane(); glPopMatrix(); // Draw Robot Arm glPushMatrix(); glColor3f( 0.1, 1, 0.1 ); glRotatef( shoulderAngle, 0, 0, 1 ); glTranslatef( 0, 4, 0 ); glPushMatrix(); glScalef( 1, 8, 1 ); glutSolidCube(1); glPopMatrix(); glTranslatef( 0, 4, 0 ); glColor3f( 0.1, 0.1, 1 ); glRotatef( elbowAngle, 0, 0, 1 ); glTranslatef( 0, 3.5, 0 ); glPushMatrix(); glScalef( 0.8, 7, 0.8 ); glutSolidCube(1); glPopMatrix(); glTranslatef( 0, 3.5, 0 ); glColor3f( 1, 0.1, 0.1 ); glRotatef( handAngle, 1, 0, 0 ); glTranslatef( 0, 0.75, 0 ); glPushMatrix(); glScalef( 1.0, 1.5, 0.6 ); glutSolidCube(1); glPopMatrix(); glTranslatef( 0, 0.75, 0 ); glPushMatrix(); glRotatef( finger1Angle, 1, 0, 0 ); glTranslatef( -0.5, 0.75, 0 ); glScalef( 0.2, 1.5, 0.2 ); glutSolidCube(1); glPopMatrix(); glPushMatrix(); glRotatef( finger2Angle, 1, 0, 0 ); glTranslatef( 0, 0.75, 0 ); glScalef( 0.2, 1.5, 0.2 ); glutSolidCube(1);

glPopMatrix(); glPushMatrix(); glRotatef( finger3Angle, 1, 0, 0 ); glTranslatef( 0.5, 0.75, 0 ); glScalef( 0.2, 1.5, 0.2 ); glutSolidCube(1); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); } Ento, as funes para mover as juntas. (lembrem-se da interao pelo teclado) void increment( int delta ){ switch( case 1: case 2: case 3: case 4: case 5: case 6: flag ){ shoulderAngle+=delta; break; elbowAngle+=delta; break; handAngle+=delta; break; finger1Angle+=delta; break; finger2Angle+=delta; break; finger3Angle+=delta; break;

} glutPostRedisplay(); } void key( unsigned char k, int x, int y ){ switch( k case '1': case '2': case '3': case '4': case '5': case '6': case ' ': } } void specialkey( int k, int x, int y ){ switch( k ){ case GLUT_KEY_RIGHT: increment(5); break; case GLUT_KEY_LEFT: increment(-5); break; } } Mais estas duas para lembrarem da interao pelo teclado: ){ flag flag flag flag flag flag stop

= = = = = = =

1; break; 2; break; 3; break; 4; break; 5; break; 6; break; 1-stop; break;

glutKeyboardFunc(key); glutSpecialFunc(specialkey); E o timer para controle da cmera.

void TimerCamera( int value ){ float ro; if( stop ){ value++; if( value == 720 ) value = 0; ro = eyey eyex eyez ro_min - sin(value/2.0*PI/360)*ro_min*0.8; = y_min - sin(value/2.0*PI/360)*y_min*0.8; = ro * sin(value/2.0*PI/180); = ro * cos(value/2.0*PI/180);

glutPostRedisplay(); } glutTimerFunc( 33, TimerCamera, value); }

Questo: 1. Melhorar o realismo da cmera em dois quesitos: Visualmente: adicionar esferas ou cilindros s articulaes. Comportamento: adicionar limites articulares, que so os limites angulares (min e mx) para as rotaes das juntas. Permite evitar interpenetrao de objetos.

Bom Trabalho!!!

Interesses relacionados