Beruflich Dokumente
Kultur Dokumente
http://www.opengl.org/resources
OpenGL
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.
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.
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.
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.
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(); };
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()
{ 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
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.
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
Projeo e Viewport
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
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.
glutPostRedisplay(); }
OpenGL
Desenho como mquina de estados Viewport Matrizes de Transformao