Upload
internet
View
113
Download
4
Embed Size (px)
Citation preview
Introdução ao OpenGL
OpenGLOpen Graphic LibraryBiblioteca de rotinas gráficas e modelagens
bidimensional (2d) e tridimensional (3d) extremamente portável e rápida
Incorpora diversos algoritmos otimizados para desenho de primitivas gráficas, mapeamento de texturas e efeitos especiais
Gerenciado por um consórcio formado pelas principais empresas da área3Dlabs, Apple Computer, NVIDIA, SGI e SUNFreqüentes revisões proporciona a incorporação
das mais recentes técnicas e da evolução do hardware
OpenGLUsado na construção de ferramentas CAD,
programas de modelagem, jogos, etc.Funcionalidades
Desenho de primitivas gráficasIluminaçãoColoraçãoMapeamento de texturasTransparênciasAnimações
OpenGLRestrições
As funcionalidades fornecidas pelo OpenGL são de baixo nível
Não fornecem funcionalidades de gerenciamento de janelas
SoluçãoExtensão da OpenGL através de novas bibliotecas
GLU (OpenGL Utility Library) Matrizes de projeção Orientação da visualização Desenho de superfícies quádricas
GLUT (OpenGL Utility Toolkit) Criação de janelas e menus Gerenciamento de janelas e eventos
OpenGL – Padronização de nomes<PrefixoBiblioteca> <ComandoRaiz> <ContadorArgumentosOpc>
<TipoArgumentosOp>
void glColor3f(Glfloat red, Glfloat green, Glfloat blue)
Argumento
gl Prefixo que representa a biblioteca OpenGl
color Comando raiz que representa a funcionalidade da função
3 Número de argumentos que a função possui
f Indica que os argumentos são valores de ponto flutuante
•Os duas ultimas partes do padrão são opcionais•Funções das bibliotecas Glu e GLUT não as utilizam
OpenGL – Primeiros Passos#include <stdlib.h>#include <GL/openglut.h>
int main(void){ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400,400); glutCreateWindow("Primeiro programa OpenGL");
//Inicializa(); //glutDisplayFunc(Desenha); //glutKeyboardFunc(Teclado); glutMainLoop(); return 0;}
void Desenha(void){ glClearColor(1,1,1,0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1,0,0); glBegin(GL_TRIANGLES); glVertex3f(-0.5, -0.5, 0); glVertex3f(0.0, 0.5, 0); glVertex3f(0.5, -0.5, 0); glEnd(); glFlush();}void Teclado(unsigned char key, int x, int y){ if (key == 27) exit(0); }
void Inicializa(void){ glMatrixMode(GL_PROJECTION); gluOrtho2D(-1.0,1.0,-1.0,1.0); glMatrixMode(GL_MODELVIEW); }
Tratamento de eventosvoid
glutReshapeFunc(AlteraTamanhoTela)void <nomeFunção>(int largura, int
altura);void glutSpecialFunc(TeclasEspeciais)
void <nomeFunção>(int tecla, int x, int y);
void glutMouseFunc(GerenciaMouse)void <nomeFunção>(int botao, int
estado, int x, int y)
void glutMotionFunc (MoveMouseBotãoPressionado)void <nomeFunção>(int x, int y);
void glutPassiveMotionFunc(MoveMouse)void <nomeFunção>(int x, int y);
void glutIdleFunc(Idle)void <nomeFunção>(void)
Constantes GLUT para eventos do mouse
Valor Descrição
GLUT_LEFT_BUTTON Informa que foi pressionado o botão esquerdo
GLUT_MIDDLE_BUTTON Informa que foi pressionado o botão do meio
GLUT_RIGHT_BUTTON Informa que foi pressionado o botão direito
Valor Descrição
GLUT_DOWN Informa que o botão foi pressionado
GLUT_UP Informa que o botão foi precionado
Constantes GLUT para eventos de teclas especiais
Valor Tecla pressionada
GLUT_KEY_F1 Tecla F1GLUT_KEY_Fn Tecla Fn
GLUT_KEY_F12 Tecla F12GLUT_KEY_LEFT Tecla direção esquerda
GLUT_KEY_RIGHT Tecla direção direita
GLUT_KEY_UP Tecla direção cima
GLUT_KEY_DOWN Tecla direção baixo
GLUT_KEY_PAGE_UP Tecla PageUp
GLUT_KEY_PAGE_DOWN Tecla PageDown
GLUT_KEY_END Tecla End
GLUT_KEY_INSERT Tecla Insert
Desenhos BidimencionaisValor Tecla pressionada
GL_POINTS Desenha pontos
GL_LINES Desenha segmentos de linha
GL_LINE_STRIP Desenha segmentos de linha conectados
GL_LINE_LOOP Desenha segmentos de linha conectados, unindo o primeiro ao ultimo
GL_POLYGON Desenha um polígono convexo
GL_TRIANGLES Desenha triângulos
GL_TRIANGLE_STRIP Desenha triângulos conectados
GL_TRIANGLE_FAN Desenha triângulos a partir de um ponto central
GL_QUADS Desenha quadriláteros
GL_QUAD_STRIP Desenha quadriláteros conectados
Desenhos Bidmencionais#include <math.h>
float ang;
glBegin(GL_POINTS); for(ang=0;ang<2*M_PI;ang+=M_PI/7.0) glVertex2f(20*cos(ang), 20*sin(ang));glEnd();
Criação de menusint glutCreateMenu(void (*func) (int value))
func – função responsável pelo tratamento do menuretorna um inteiro que identifica o menu criado
void glutAddMenuEntry(char *name, int value)void glutAddSubMenu(char *name, int menu)
name – nome do sub-menumenu – valor inteiro correspondente ao menu ao qual o
sub-menu deve ser adcionado
void glutAttachMenu(int button)Associa um botão ao menu
void glutDetachMenu(int button)Desassocia o menu
Alterando Propriedades dos Desenhosvoid glPointSize(GLfloat size)void glLineWidth(Glfloat width)
Altera a espessura da linhaglEnable(GL_LINE_STIPPLE)
Habilita a variável de estado que armazena o estilo de linha
void glLineStipple(GLint factor, Glushort pattern)Factor – valor entre 1 e 256 que altera o número
de pixels do tracejadoPattern – valor de 16 bits utilizado p/ especificar o
tipo de tracejado
Exibição de TextosUtiliza a GLUT para exibição de textos na tela
gráficaDois tipos de fontes de caracteres
Segmentos de reta (STROKE) Mais flexíveis (escalável e rotacionável)
Imagens (BITMAP) Mais rápidas
As funções de texto presentes na GLUT são básicas, para textos com melhor qualidades devem ser utilizadas bibliotecas específicas, como a FTGL (http://homepages.paradise.net/henryj/code)
void glutBitmapCharacter(void *font, int character)
void glRasterPos2f, void glRasterPos2i, void glRasterPos2dModifica a posição matricial corrente utilizada para
desenhar o texto
Valor Descrição
GLUT_BITMAP_8_BY_13 Fonte padrão 8x13
GLUT_BITMAP_9_BY_15 Fonte padrão 9x15
GLUT_BITMAP_TIMES_ROMAN_10
Fonte times roman tamanho 10
GLUT_BITMAP_TIMES_ROMAN_24
Fonte times roman tamanho 24
GLUT_BITMAP_HELVITICA10 Fonte helvítica, tamanho 10
GLUT_BITMAP_HELVITICA12 Fonte helvítica, tamanho 12
GLUT_BITMAP_HELVITICA18 Fonte helvítica, tamanho 18
void glutStrokeCharacter(void *font, int character)Exibe caracteres formados por segmentos de
retaGLUT_STROKE_ROMAN e
GLUT_STROKE_MONO_ROMANFunções que afetam as linhas também afetam
as letras escritas com este método
void DesenhaTexto(void *font, char *string){while(*string)
glutBitmapCharacter(*font, *string++);
}
*obs: Utilizar a função glRasterPos2f(int x,int y) para posicionar o texto