Felipe Cavalcanti Ferreira Fernando Valente Kakimoto Francisco Paulo Magalhães Simões Thiago de Barros Lacerda O que é ? Open Graphics Library “Uma interface de software com o hardware gráfico” Uma camada de abstração entre o programa de aplicação e o hardware gráfico Construída na forma de API em C (Application Programmer’s Interface ) Permite criar programas interativos que produzem imagens coloridas de objetos em movimento Características Principais Independente do sistema operacional Projetada para aplicações gráficas interativas 2D e 3D Controlada pelo ARB (Architecture Review Board) 3DLabs, Compaq/Digital, Evans&Sutherland, HP, IBM, Intel, InterGraph, Microsoft, Nvidia, Silicon Graphics Porque aprender OpenGL? Padrão gráfico para aplicações industriais, entretenimento, visualização, etc. Opção independente de plataforma de hardware Compete com DirectX (Direct3D) Utilizado para implementar conceitos como Realidade Virtual e Aumentada OpenGL como Sintetizador de Imagens (Renderizador) Primitivas geométricas pontos, linhas e polígonos Primitivas de Imagens Funciona como uma Máquina de Estados Renderização depende do ESTADO atual cor, tipo de linha, escala, etc As variáveis de controle têm valores default Não gerencia eventos de controle (mouse, exibição, teclado, etc.) Primitivas Geométricas Todas primitivas geométricas são especificadas por vértices GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_POLYGON GL_TRIANGLES GL_TRIANGLE_STRIP GL_QUADS GL_QUAD_STRIP GL_TRIANGLE_FAN APIs Relacionadas com OpenGL AGL, GLX, WGL “cola” entre OpenGL e o sistema de janelas GLU (OpenGL Utility Library) parte de OpenGL NURBS, tessellators, quadrics, etc GLUT (Graphics Library Utility Toolkit) API para gereciamento de janelas portável não é parte oficial de OpenGL GLUT Biblioteca de software que se integra com OpenGL (autor: Mark J. Kilgard - SGI) Habilita acesso aos eventos do sistema operacional necessários em programas interativos mouse, teclado, display, etc. Utilizada nos livros que ensinam OpenGL e CG com OpenGL Filosofia de Projeto de GLUT Fácil de Programar Independente do sistema de janelas nativo Programas de tamanho pequeno e médio Não apresenta muitos recursos de interface (apenas menus) Programação orientada a eventos Programa Aplicativo Tecla Q Gerenciador de Dispositivos Click botão direito mouse Tecla X Movimento 30 pixels p/ direita do mouse FILA DE EVENTOS Rotinas Iniciam com prefixo glut (0,0) canto superior esquerdo da janela Incluir diretiva #include <GL/glut.h> Inicialização glutInit( int *argc, char **argc) glutInitWindowPosition glutInitWindowSize Rotinas Processamento de Eventos void glutMainLoop( void ) Gerenciamento de janelas int glutCreateWindow( char *name ) void glutPostRedisplay( void ) Registro de rotinas de callback glutDisplayFunc glutReshapeFunc glutKeyboardFunc glutMouseFunc Objetos Pré-definidos glutSolidSphere, glutWireCube, glutSolidTeapot Estrutura de um Programa Configura e cria a janela Initializa estado de OpenGL Registra as callback functions de GLUT renderização redimensionamento entrada: teclado, mouse, etc. Chama laço principal de processamento Programa Exemplo int main( int argc, char** argv ) { glutInit( &argc, argv); glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE); initOpenGL(); initGLUT(); glutMainLoop(); return 1; } Inicialização OpenGL void initOpenGL( void ) { /* Cor default fundo preta */ glClearColor( 0, 0, 0, 0 ); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); /* Cor default para objetos */ glColor3f( 1.0, 0.0, 0.0 ); } Inicialização GLUT void initGLUT( void ) { glutInitWindowPosition( 200, 100 ); glutCreateWindow( "Exemplo Simples 1" ); /* Registra as rotinas de CallBack */ glutDisplayFunc( desenhaCB ); glutKeyboardFunc( tecladoCB ); glutReshapeFunc( redesenhaCB ); glutMouseFunc( mouseCB ); } Callback para Renderização Todos desenhos para a tela ficam nesta rotina glutDisplayFunc( desenhaCB ); void desenhaCB( void ) { } /* Limpa buffer de cor */ glClear ( GL_COLOR_BUFFER_BIT ); glMatrixMode( GL_MODELVIEW ); glBegin(GL_POLYGON); glVertex2i( 200, 200 ); glVertex2i( 200, 150 ); glVertex2i( 150, 150 ); glVertex2i( 150, 200 ); glEnd(); glFlush(); Callback de Teclado Todas os eventos de Teclado ficam nessa função glutKeyboardFunc( tecladoCB ); void tecladoCB( unsigned char tecla, int x, int y ) { switch( tecla ) { case 'q': /* Encerra o programa */ case 'Q': exit( 0 ); default: printf("Opcao nao definida!\n"); } } Callback de Mouse Todas os eventos de mouse ficam nessa função glutMouseFunc( mouseCB ); void mouseCB( int botao, int estado, int x, int y ) { if ( botao == GLUT_LEFT_BUTTON ) glColor3ub( (char) (rand()%256), (char) (rand()%256), (char) (rand()%256) ); glutPostRedisplay(); } Analogia com Câmera e Transformações Transformações de Projeção ajusta a lente da câmera Transformações de Visualização definem posição e orientação do volume de visualização no universo Transformações de Modelagem movem o modelo Transformações de Viewport aumentam ou diminuem o tamanho da fotografia Transformações em OpenGL Modelagem Visualização Orientação da câmera Projeção Animação Mapeamento para a tela Tutorial de Transformações Configurações Configurando o Dev C++ Copie a pasta que contém o Dev, no apps (p:), para o Temp Abra a pasta Dev-Cpp++_5.0\include\gl e copie para dentro dela o arquivo glut.h disponível em www/~fpms/multimidia Rode o Dev Configurações Copie o Projeto de www/~fpms/multimidia/projeto.zip Descompacte o arquivo para o Temp Selecione a opção Open Project e a abra Exercicio.dev Compile e rode Exercício Para todas as questões Envie as modificações necessárias no código exemplo para adquirir o efeito desejado(apenas as funções que você alterou) e uma figura do resultado A. Desenhe um quadrado centrado no (0,0,0) na cor azul Observe este quadrado de cima(ver quadrado) e de lado(ver linha) B. Desenhe um cubo com centro no ponto (0,0,0) de lado tamanho 10 sem estar preenchido(malha). C. Altere os parâmetros da câmera para ver o cubo de um ângulo de 45 graus Exercício D. Desenhe o mesmo cubo da letra anterior preenchido E. Rotacione a câmera da letra C de 30 graus em torno do eixo Z F. Translade o cubo da letra D de 50 em tono do eixo X G. faça seu programa realizar a rotação da letra E quando a tecla “x” for pressionada