Sie sind auf Seite 1von 6

OpenGL, GLU e GLUT

http://www.opengl.org/resources

OpenGL

Hitoshi - DCC/IME - 1o Semestre de 2005

OpenGL uma API grfica que permite a criao de imagens grficas 2D e 3D, atravs da definio de objetos (2D/3D) por um conjunto de formas primitivas geomtricas e rotinas para manipulao. A API do OpenGL foi projetada para ser usada com C ou C++. Mesa uma implementao livre do OpenGL Jogl um porte do OpenGL para Java, e ser utilizada nesse curso.

GLUT (OpenGL Utility Toolkit)

Kernel de um programa
int main (int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); glutInitWindowSize(200,200); glutCreateWindow(argv[0]); // Inicializar Callbacks myInit(); glutMainLoop(); return(0); }

O OpenGL foi projetado para ser independente do SO e do sist. de janelas. Para ser completamente independente, o OpenGL no oferece rotinas de display ou interface (pois precisam de E/S). O GLUT uma biblioteca de rotinas, independente do SO, que fornece as ferramentas necessrias para a requisio de janelas e registro de eventos.

Rotinas de inicializao do GLUT


glutInit (int argc, char** argv) glutInitDisplayMode()
single ou double buffering GLUT_SINGLE ou GLUT_DOUBLE (front/back) Como as cores so exibidas GLUT_RGB ou GLUT_RGBA Buffer de profundidade GLUT_DEPTH

Callbacks mais comuns


events (Re)Display (Re)size Window Idle event Mouse button Mouse motion Keyboard Key callback glutDisplayFunc glutReshapeFunc glutIdleFunc glutMouseFunc
glutPassiveMotionFunc

prototipo display() resize(int w, int h) idle()


mouse(int b, int s, int x, int y)

glutInitWindowSize(int width, int height); /* sugesto ao WM*/ glutInitWindowPosition(int x, int y); /* sugesto ao WM*/ glutCreateWindow(char *title); glutMainLoop();

motion(int x, int y)
keyboard(uchar c, int x, int y)

glutKeyboardFunc

Exemplo de callbacks
void display ()
{ /* sua rotina de (re)display */}

display() e reshape()
A rotina de display sempre necessria.
pode ser chamada pelo sistema ou pelo prprio programa. Sistema: quando a janela criada ou alguma outra "sai de cima". Programa: animao usar a rotina glutPostRedisplay(), pois outros eventos podem estar requerendo redisplay.

void mouse(int b, int s, int x, int y)


{ /* sua rotina de tratamento do mouse */}

int main (int argc, char **argv) {


... /* inicializar Callbacks */ glutDisplayFunc(display); glutMouseFunc(mouse); ...

Reshape() chamada sempre que a janela muda de tamanho (tbm quando criada).

mouse() e keyboard()
mouse(int b, int s, int x, int y) b: GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON s: GLUT_DOWN, GLUT_UP (x,y): coordenada onde o mouse foi clicado, relativo ao canto superior esquerdo da janela. keyboard(uchar c, int x, int y): rotina chamada sempre que o teclado acionado. c recebe o caracter, e (x,y) a posio do mouse (conveno X-window).

Desenho bsico

Antes de desenhar uma cena, o OpenGL precisa saber sobre os objetos a serem desenhados, a forma de projeo, e sobre os reflexos e sombreamento. Apenas como exemplo, considere apenas objetos 2D, sem reflexos ou sombreamento, e com pouca interao.

Exemplo de uma rotina de display()

void display(void){ glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glBegin(GL_POLYGON); glVertex2f(0.90, 0.50); glVertex2f(0.50, 0.90); glVertex2f(0.10, 0.50); glVertex2f(0.50, 0.10); glEnd(); glColor3f(0.0, 0.0, 1.0); glRectf(0.25, 0.25, 0.75, 0.75); glutSwapBuffers(); };

Exemplo de uma rotina de display()

Descrio das funes


janela virtual: quadrado sobre o intervalo real [0,1] glClear: limpa a janela com a cor definida por glClearColor(float R, float G, float B, float A); O argumento de glClear define o buffer a ser limpo (GL_DEPTH_BUFFER_BIT, etc). glColor3f: recebe 3 floats, RGB
glColor3ui, glColor3d, glColor3fv, etc. floats e doubles variam entre [0,1] para tipos inteiros (char, int, short, long) o valor pode variar at o mximo permitido.

Desenhando com OpenGL


OpenGL funciona como uma mquina de estados. Uma vez definido um atributo (cor, tamanho de um ponto, largura de linha, etc), ele desenha usando esses atributos. O OpenGL pode desenhar diversos tipos de objetos. O mais simples o glRectf(), que desenha um retngulo. Objetos complexos so definidos com o auxlio das funes glBegin(mode) e glEnd(). A lista de vrtices entre esses comandos define o objeto. O tipo do objeto definido pelo argumento de glBegin. GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_POLYGON

glVertex2f glRectf Outros atributos possveis:


glPointSize() glLineWidth() glLineStipple() glPolygonStipple()

Exemplos de objetos no OpenGL

2D/3D? caso no especificado, um ponto criado com z=0. glRect sempre desenha no plano z=0

Desenhando em OpenGL
Apenas para o momento, vamos ignorar os efeitos de luz e sombreamento Acabamos de ver como podemos criar objetos OpenGL, mas como definimos os parmetros da cmera? Vamos utilizar uma regio de desenho virtual para criar os objetos
Mas como o OpenGL mapeia a figura na regio virtual para a janela real (como ele mostra a imagem)?

Viewport
Primeiro, precisamos definir onde o desenho ser exibido. O viewport corresponde a uma regio na janela realmente criada, onde o nosso desenho exibido. Sempre que a janela muda de tamanho/forma, no necessrio mudar o desenho, apenas o viewport. Em geral, a regio corresponde a toda a janela, mas nem sempre esse o caso

Viewport
glutInitWindowSize()

Projetando o desenho para a imagem


Agora sabemos desenhar em um espao virtual, e definir o tamanho da regio onde queremos exibir o desenho (gerar uma imagem) Mas como a gente mapeia o desenho para a imagem? Essa transformao conhecida como projeo O OpenGL mantem 3 conjuntos de matrizes de transformao: Modelview matrix: transformao de objetos Projection matrix: transformaes perspectiva e paralela Texture matrix: define como as texturas so mapeadas no objeto

fornece apenas uma "sugesto" de tamanho


void reshape(int winWidth, int winHeight)

{ glViewport (0, 0, winWidth, winHeight); } o tamanho real da janela em pixels passado pela rotina reshape. prottipo: glViewport(int x, int y, int w, int h); (x,y) define canto inferior esquerdo (w,h) define a largura e altura do viewport em pixels

Operao de Matrizes em OpenGL

Comandos bsicos
glMatrixMode(mode);
mode= GL_MODELVIEW (default), GL_PROJECTION, GL_TEXTURE define o tipo de matriz a ser utilizada

Para cada um dos 3 tipos, o OpenGL mantem uma pilha de matrizes, sendo que a matriz no topo da pilha aplicada primeiro. O OpenGL permite que uma matriz seja empilhada e desempilhada. O modo inicial modelview, e em geral se assume que essa a matriz sendo utilizada. Portanto, sempre que mudar de modo, certifique-se de retornar ao modelview.

glLoadIdentity(); glLoadMatrixf(M); glMultMatrixf(M); glPushMatrix() and glPopMatrix();

Projees
Para projetar um objeto 3D sobre o plano de imagem, necessrio: 1. representar o objeto 3D em um sistema de coordenadas apropriado (para o OpenGL, centrado na cmera). Modelview matrix: transforma pontos entre sistemas de coordenadas 2. projetar os pontos Projection matrix: define o tipo de projeo e a regio a ser projetada

Caso simples: Cena 2D


Uma cena 2D no requer projeo, mas precisamos definir a regio retangular no espao do desenho virtual que contem a parte do a ser exibida no viewport
gluOrtho2d(dbl left,dbl right,dbl bottom,dbl top)
exemplo de programa:
glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, 1.0, 0.0, 1.0); glMatrixMode(GL_MODELVIEW);

Projeo e Viewport

Onde a gente define a projeo?


Depende! se a projeo nunca muda, ela pode ser feita na inicializao se a projeo muda, quando/como ela muda?
zoom controlado pelo teclado ou mouse animao (timer ou idle event)

Transformao de pontos
Problema: desenhar um retngulo 0.2x0.2 centrado em (x,y) e rodado de 10 graus. Sol.1: calcular todos os vrtices e fornec-los ao OpenGL Sol.2: decompor as transformaes
translao rotao glRotatef(ang, x, y, z)

Exemplo
glPushMatrix(); glRotatef(10.0, 0.0, 0.0, 1.0); glRectf(x-0.1, y-0.1, x+0.1, y+0.1); glPopMatrix();

A ordem importante!
mas por que a rotao feita antes?

Lembrete: sempre que um desenho feito (glRectf por exemplo), ele transformado pela matriz modelview.

Algo errado...
Translao: ao redor da origem glTranslatef(x, y, z)
glPushMatrix(); glTranslatef(x, y, 0); glRotatef(10.0, 0.0, 0.0, 1.0); glRectf(-0.1, -0.1, +0.1, +0.1); glPopMatrix();

Ainda ao contrrio?
Seja
v um vrtice a ser transformado Mo a matriz modelview corrente Ma,Mb e Mc a seqncia de matrizes de transformao a serem aplicadas antes de Mo

A imagem u do vrtice transformado seria:


u = Mo ( Mc ( Mb ( Ma v))) = (MoMcMbMa)v

Menus no GLUT

Comandos bsicos
submenu = glutCreateMenu(quit_menu); glutAddMenuEntry("Continue", 1); glutAddMenuEntry("Realy Quit!", 2); glutCreateMenu(main_menu); glutAddMenuEntry("OK", 1); glutAddSubMenu("Quit", submenu); glutAttachMenu(GLUT_RIGHT_ BUTTON); void main_menu(int val) {
if (val == 1) return; glutPostRedisplay();

Veja mais no paper OpenGL and X Column 1, e no manual do GLUT. Os programas grficos devem permitir ao usurio alterar os seus modos de operao Os menus so instrumentos simples que permitem esse tipo de interao do programa com o usurio. No GLUT, os menus podem ser criados, modificados, e associados a um boto do mouse (funes bsicas). Quando associado a um boto, o menu aparece quando o boto pressionado.

void quit_menu(int val) {


if (val == 1) return; if (val == 2) exit;

glutPostRedisplay(); }

O que voc deve saber


Glut (apenas se voc for programar em C)
Esqueleto main do glut Callbacks Animao Menus

OpenGL
Desenho como mquina de estados Viewport Matrizes de Transformao

Das könnte Ihnen auch gefallen