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