260 likes | 371 Views
Felipe Cavalcanti Ferreira Fernando Valente Kakimoto Francisco Paulo Magalhães Simões Thiago de Barros Lacerda. O que é ?. Open G raphics L ibrary “ Uma interface de software com o hardware gráfico ”
E N D
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.)
GL_LINES GL_POLYGON GL_LINE_STRIP GL_LINE_LOOP GL_POINTS GL_TRIANGLES GL_QUADS GL_TRIANGLE_FAN GL_TRIANGLE_STRIP GL_QUAD_STRIP Primitivas Geométricas • Todas primitivas geométricas são especificadas por vértices
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
Tecla Q Click botão direito mouse Tecla X Movimento 30 pixels p/ direita do mouse Programa Aplicativo Gerenciadorde Dispositivos 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çãoglutMouseFunc( 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
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