Post on 06-Jan-2016
description
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_POLYGONGL_POLYGON
GL_TRIANGLE_STRIPGL_TRIANGLE_STRIP
GL_TRIANGLE_FANGL_TRIANGLE_FAN
GL_POINTSGL_POINTSGL_LINESGL_LINES
GL_LINE_LOOPGL_LINE_LOOPGL_LINE_STRIPGL_LINE_STRIP
GL_TRIANGLESGL_TRIANGLES
GL_QUADSGL_QUADS GL_QUAD_STRIPGL_QUAD_STRIP
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
Gerenciadorde
Dispositivos
Programa
Aplicativo
Tecla Q 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)glutInitWindowPositionglutInitWindowSize
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 redimensionamentoentrada: 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 rotinaglutDisplayFunc( 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