Вы находитесь на странице: 1из 5

MINISTRIO DA EDUCAO CENTRO FEDERAL DE EDUCAO TECNOLGICA DE MINAS GERAIS DEPARTAMENTO DE COMPUTAO DISCIPLINA: Computao Grfica DATA: _______/_______/______________

PROFESSOR: Adelino Pinheiro Silva

PRIMEIRO EXERCCIO DE LABORATRIO


PRIMITIVAS E TRANSFORMAES GEOMTRICAS

ENTREGA:

Nesta aula os alunos trabalharo as primitivas bsicas da biblioteca OpenGL e glut, desde suas primitivas. Esta aula prtica foi baseada no tutorial da professora Isabel H. Manssour e pode ser acessado em http://www.inf.pucrs.br/~manssour/OpenGL/ Os resultados (cdigos desenvolvidos pelo aluno) devem ser enviados ao e-mail do professor (adelino@decom.cefetmg.br), em um arquivo em formato rar ou zip, denominado Nome_Aluno_Lab01_2011.rar (ou Nome_Aluno_lab01_2011.zip) contendo mo assunto a etiqueta de comando [LCG-2011] (sem aspas, por exemplo: [LCG-2011] cdigos da aula de OpenGl parte 01) 1 - Desenhando Primitivas Primitivas (ou primitivas geomtricas) so as formas bsicas de desenho na computao grfica, como classificamos os elementos bsicos que em composio geram elementos mais complexos e detalhados. Inicialmente trabalharemos o exemplo a seguir do tutorial:
// // // // // // Quadrado.c - Isabel H. Manssour Um programa OpenGL simples que desenha um quadrado em uma janela GLUT. Este cdigo est baseado no GLRect.c, exemplo disponvel no livro "OpenGL SuperBible", 2nd Edition, de Richard S. e Wright Jr.

#include <windows.h> #include <gl/glut.h> // Funo callback chamada para fazer o desenho void Desenha(void) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Limpa a janela de visualizao com a cor de fundo especificada glClear(GL_COLOR_BUFFER_BIT); // Especifica que a cor corrente vermelha // R G B glColor3f(1.0f, 0.0f, 0.0f); // Desenha um quadrado preenchido com a cor corrente glBegin(GL_QUADS); glVertex2i(100,150); glVertex2i(100,100); // Especifica que a cor corrente azul glColor3f(0.0f, 0.0f, 1.0f); glVertex2i(150,100); glVertex2i(150,150); glEnd();

MINISTRIO DA EDUCAO CENTRO FEDERAL DE EDUCAO TECNOLGICA DE MINAS GERAIS DEPARTAMENTO DE COMPUTAO DISCIPLINA: Computao Grfica DATA: _______/_______/______________ PROFESSOR: Adelino Pinheiro Silva

// Executa os comandos OpenGL glFlush(); } // Inicializa parmetros de rendering void Inicializa (void) { // Define a cor de fundo da janela de visualizao como preta glClearColor(0.0f, 0.0f, 0.0f, 1.0f); } // Funo callback chamada quando o tamanho da janela alterado void AlteraTamanhoJanela(GLsizei w, GLsizei h) { // Evita a divisao por zero if(h == 0) h = 1; // Especifica as dimenses da Viewport glViewport(0, 0, w, h); // Inicializa o sistema de coordenadas glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Estabelece a janela de seleo (left, right, bottom, top) if (w <= h) gluOrtho2D (0.0f, 250.0f, 0.0f, 250.0f*h/w); else gluOrtho2D (0.0f, 250.0f*w/h, 0.0f, 250.0f); } // Programa Principal int main(void) { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400,350); glutInitWindowPosition(10,10); glutCreateWindow("Quadrado"); glutDisplayFunc(Desenha); glutReshapeFunc(AlteraTamanhoJanela); Inicializa(); glutMainLoop(); }

Esclarecimento sobre as funes: glutInitWindowSize(400,350); especifica o tamanho em pixels da janela GLUT. glutInitWindowPosition(10,10); especifica a localizao inicial da janela GLUT, que neste caso o canto superior esquerdo da tela do computador [Woo 1999]. glutReshapeFunc(AlteraTamanhoJanela); estabelece a funo "AlteraTamanhoJanela" previamente definida como a funo callback de alterao do tamanho da janela. Isto , sempre que a janela maximizada, minimizada, etc., a funo "AlteraTamanhoJanela" executada para reinicializar o sistema de coordenadas.

MINISTRIO DA EDUCAO CENTRO FEDERAL DE EDUCAO TECNOLGICA DE MINAS GERAIS DEPARTAMENTO DE COMPUTAO DISCIPLINA: Computao Grfica DATA: _______/_______/______________ PROFESSOR: Adelino Pinheiro Silva

glColor3f(1.0f, 0.0f, 0.0f); determina a cor que ser usada para o desenho (linhas e preenchimento). A seleo da cor feita da mesma maneira que na funo glClearColor, sendo que no necessrio especificar o componente alfa, cujo valor default 1.0 (completamente opaco). glBegin(GL_QUADS); glEnd(); usada para desenhar um quadrado preenchido a partir dos vrtices especificados entre glBegin e glEnd. O captulo 9 descreve a utilizao destas funes. OpenGL mapeia as coordenadas dos vrtices para a posio atual da janela de visualizao na funo callback AlteraTamanhoJanela. Antes de descrever os parmetros e comandos da funo AlteraTamanhoJanela, necessrio revisar alguns conceitos e especificaes. Em quase todos ambientes de janelas, o usurio pode alterar o tamanho e dimenses da janela em qualquer momento. Quando isto ocorre, o contedo da janela redesenhado levando em conta as novas dimenses. Normalmente, o esperado que a escala do desenho seja alterada de maneira que ele fique dentro da janela, independente do tamanho da janela de visualizao ou do desenho [Foley 1990]. Assim, uma janela pequena ter o desenho completo, mas pequeno, e uma janela grande ter o desenho completo e maior. Apesar do exemplo mostrar um quadrado 2D, o desenho feito em um espao de coordenadas 3D. A funo glBegin(GL_QUADS); glEnd(); desenha o quadrado no plano xy em z=0. Portanto, necessrio determinar o tamanho da viewport (janela onde ser feito o desenho) e do volume de visualizao (parte do universo da aplicao que ser mapeada para viewport), pois estes parmetros influenciam o espao de coordenadas e a escala do desenhos 2D e 3D na janela. Sempre que o tamanho da janela alterado, a viewport e o volume de visualizao devem ser redefinidos de acordo com as novas dimenses da janela. Assim, a aparncia do desenho no alterada (por exemplo, um quadrado no vira um retngulo). Como a alterao do tamanho da janela detectada e gerenciada de maneira diferente em cada ambiente, a biblioteca GLUT fornece a funo glutReshapeFunc, descrita anteriormente, que registra a funo callback que a GLUT ir chamar sempre que houver esta alterao. A funo passada para a glutReshapeFunc deve ter o seguinte prottipo: void AlteraTamanhoJanela(GLsizei w, GLsizei h);. O nome "AlteraTamanhoJanela" foi escolhido porque descreve o que a funo faz. Os parmetros recebidos sempre que o tamanho da janela alterado so a sua nova largura e a sua nova altura, respectivamente. Esta informao usada para modificar o mapeamento do sistema de coordenadas desejado para o sistema de coordenadas da tela com a ajuda de duas funes uma OpenGL, glViewport, e uma da biblioteca GLU, gluOrtho2D. Estas e outras funes chamadas na "AlteraTamanhoJanela", que definem como a viewport especificada, so descritas a seguir. glViewport(0, 0, w, h); recebe como parmetro a nova largura e altura da janela. O prottipo desta funo : void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);. Seus parmetros especificam o canto inferior esquerdo da viewport (x,y) dentro da janela, e a sua largura e altura em pixels (width e height). Geralmente x e y so zero, mas possvel usar a viewport para visualizar mais de uma cena em diferentes reas da janela. Em outras palavras, a viewport define a rea dentro janela, em coordenadas de tela, que OpenGL pode usar para fazer o desenho. O volume de visualizao , ento, mapeado para a nova viewport.

MINISTRIO DA EDUCAO CENTRO FEDERAL DE EDUCAO TECNOLGICA DE MINAS GERAIS DEPARTAMENTO DE COMPUTAO DISCIPLINA: Computao Grfica DATA: _______/_______/______________ PROFESSOR: Adelino Pinheiro Silva

gluOrtho2D (0.0f, 250.0f*w/h, 0.0f, 250.0f); usada para determinar que a projeo ortogrfica (2D) ser utilizada para exibir na tela a imagem 2D que est na janela de seleo definida atravs dos parmetros passados para esta funo. O prottipo desta funo : void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top);. No sistema de coordenadas cartesianas, os valores left e right especificam os limites mnimo e mximo no eixo X; analogamente, bottom e top especificam os limites mnimo e mximo no eixo Y. glMatrixMode(GL_PROJECTION); e glLoadIdentity(); servem, respectivamente, para avisar a OpenGL que todas as futuras alteraes, tais como operaes de escala, rotao e translao, iro afetar a "cmera" (ou observador), e para inicializar o sistema de coordenadas antes da execuo de qualquer operao de manipulao de matrizes. Sem este comando, cada chamada sucessiva de gluOrtho2D poderia resultar em uma corrupo do volume de visualizao. Em outras palavras, a matriz de projeo onde o volume de visualizao, que neste caso um plano, definido; a funo gluOrtho2D no estabelece realmente o volume de visualizao utilizado para fazer o recorte, apenas modifica o volume existente; ela multiplica a matriz que descreve o volume de visualizao corrente pela matriz que descreve o novo volume de visualizao, cujas coordenadas so recebidas por parmetro. glMatrixMode(GL_MODELVIEW); avisa a OpenGL que todas as futuras alteraes, tais como operaes de escala, rotao e translao, iro afetar os modelos da cena, ou em outras palavras, o que desenhado. A funo glLoadIdentity(); chamada em seguida, faz com que a matriz corrente seja inicializada com a matriz identidade (nenhuma transformao acumulada) [Wright 2000]. 2 - Linhas, Pontos e Polgonos Com apenas algumas primitivas simples, tais como pontos, linhas e polgonos, possvel criar estruturas complexas. Em outras palavras, objetos e cenas criadas com OpenGL consistem em simples primitivas grficas que podem ser combinadas de vrias maneiras [Wright 2000]. Portanto, OpenGL fornece ferramentas para desenhar pontos, linhas e polgonos, que so formados por um ou mais vrtices. Neste caso, necessrio passar uma lista de vrtices, o que pode ser feito entre duas chamadas de funes OpenGL:
glBegin() glEnd()

O argumento passado para glBegin() determina qual objeto ser desenhado. No exemplo fornecido por [Hill 2000], para desenhar trs pontos pretos foi usada a seguinte seqncia de comandos:
glBegin(GL_POINTS); glColor3f(0.0f, glVertex2i(100, glVertex2i(100, glVertex2i(150, glEnd(); 0.0f, 0.0f); 50); 130); 130);

Para desenhar outras primitivas, basta trocar GL_POINTS, que exibe um ponto para cada chamada ao comando glVertex, por:

MINISTRIO DA EDUCAO CENTRO FEDERAL DE EDUCAO TECNOLGICA DE MINAS GERAIS DEPARTAMENTO DE COMPUTAO DISCIPLINA: Computao Grfica DATA: _______/_______/______________ PROFESSOR: Adelino Pinheiro Silva

GL_LINES: exibe uma linha a cada dois comandos glVertex; GL_LINE_STRIP: exibe uma seqncia de linhas conectando os pontos definidos por glVertex; GL_LINE_LOOP: exibe uma seqncia de linhas conectando os pontos definidos por glVertex e ao final liga o primeiro como ltimo ponto; GL_POLYGON: exibe um polgono convexo preenchido, definido por uma seqncia de chamadas a glVertex; GL_TRIANGLES: exibe um tringulo preenchido a cada trs pontos definidos por glVertex; GL_TRIANGLE_STRIP: exibe uma seqncia de tringulos baseados no trio de vrtices v0, v1, v2, depois, v2, v1, v3, depois, v2, v3, v4 e assim por diante; GL_TRIANGLE_FAN: exibe uma seqncia de tringulos conectados baseados no trio de vrtices v0, v1, v2, depois, v0, v2, v3, depois, v0, v3, v4 e assim por diante; GL_QUADS: exibe um quadrado preenchido conectando cada quatro pontos definidos por glVertex; GL_QUAD_STRIP: exibe uma seqncia de quadrilteros conectados a cada quatro vrtices; primeiro v0, v1, v3, v2, depois, v2, v3, v5, v4, depois, v4, v5, v7, v6, e assim por diante [Hill 2000, Pinho 2000]. A funo glVertex2i pertence biblioteca GL e possui dois argumentos inteiros. De maneira anloga, tambm possvel passar valores de ponto flutuante no lugar de inteiros, e trs coordenadas (x,y,z) no lugar de duas usando, por exemplo, as seguintes chamadas s funes OpenGL:
glVertex2d(100.0, 50.0); glVertex3f(50.0, 50.0, 50.0);

Alm disso, para cada vrtice possvel definir uma cor diferente. Neste caso, no desenho final feita uma "interpolao" das cores. 3 - Tarefas do Dia Para fixao do conhecimento realize as seguintes tarefas: Tarefa 0 Aps ler a tarefa copie os cdigos e teste o funcionamento realizando alteraes nas funes. Em caso de dvida solicite ajuda do professor. Programa 1 Escreva um programa que utilize a OpznGL para desenhar as cada uma das nove primitivas acima descritas. Organize seu programa para dividir a tela em nove quadrantes, um com cada primitiva. Programa 2 Escreva um programa com a OpenGL que desenhe na tela as seguintes bandeiras nacionais: Holandesa, Italiana, Japonesa, Brasileira e Israelense.

Вам также может понравиться