Universidade Federal do Vale do São Francisco Curso de Engenharia da Computação Computação Gráfica OpenGl 03 Prof. Jorge Cavalcanti jorge.cavalcanti@univasf.edu.br www.univasf.edu.br/~jorge.cavalcanti www.twitter.com/jorgecav
Desenhando Shapes Desenhando um foguete Bico void Bico() { glbegin(gl_triangles); glcolor3f(0,1,0); glvertex3f(3.0,6.0,0); glvertex3f(4.0, 8.0,0); glvertex3f(5.0,6.0,0); glend(); Página 2
Desenhando Shapes Desenhando um foguete Corpo void Corpo() { glbegin(gl_quads); glcolor3f(0,0,1); glvertex3f(3.0,1.0,0); glvertex3f(5.0, 1.0,0); glvertex3f(5.0,6.0,0); glvertex3f(3.0,6.0,0); glend(); Página 3
Desenhando Shapes Desenhando um foguete Asa Esquerda void AsaEsquerda() { glbegin(gl_triangles); glcolor3f(1,0,0); glvertex3f(1.5,1.0,0); glvertex3f(3.0, 1.0,0); glvertex3f(3.0,3.0,0); glend(); Página 4
Desenhando Shapes Desenhando um foguete Asa Direita void AsaDireita() { glbegin(gl_triangles); glcolor3f(1,0,0); glvertex3f(5.0,1.0,0); glvertex3f(6.5, 1.0,0); glvertex3f(5.0,3.0,0); glend(); Página 5
Desenhando Shapes Desenhando um foguete Chamada dos procedimentos na callback de desenho. void DesenhaFoguete(void) { glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); glclear(gl_color_buffer_bit); Bico(); Corpo(); AsaEsquerda(); AsaDireita(); glflush(); Página 6
Em muitas aplicações de computação gráfica, há a necessidade de alterar e manipular o conteúdo de uma cena Animações, por exemplo, são produzidas pelo movimento da câmera ou dos objetos presentes na cena Mudanças em orientação, tamanho e formato estão ligadas às transformações geométricas São cumulativas, ou seja, podem ser aplicadas umas sobre as outras Uma transformação geométrica de OpenGL é armazenada internamente em uma matriz A cada transformação esta matriz é alterada e usada para desenhar os objeto a partir daquele momento, até que seja novamente alterada Página 7
Translação Em OpenGL: gltranslate {f,d ( Tx, Ty, Tz ), onde: Tx: é o quanto se quer transladar o objeto em relação ao eixo X Ty: é o quanto se quer transladar o objeto em relação ao eixo Y Tz: é o quanto se quer transladar o objeto em relação ao eixo Z gltranslatef(xf, yf, zf); glbegin(gl_polygon); glvertex2f( xf, yf); glvertex2f( xf, yf); glvertex2f( xf, yf); glend(); Página 8
Translação void DesenhaFoguete(void) { glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); glclear(gl_color_buffer_bit); gltranslatef(3.0f, 2.0f, 0.0f); Bico(); Corpo(); AsaEsquerda(); AsaDireita(); glflush(); Página 9
Rotação É o ato de efetuar um giro em um objeto de acordo com um ângulo e um eixo definidos anteriormente. Para efetuar uma rotação há o comando glrotatef(angulo, x, y, z) que gira o objeto ao redor do vetor (x,y,z). O giro é de Angulo graus, no sentido anti-horário. glrotatef(45.0f,0.0f,0.0f,1.0f);// roda 45 graus no eixo z glbegin(gl_polygon); glvertex2f( xf, yf); glvertex2f( xf, yf); glvertex2f( xf, yf); glend(); Página 10
Rotação void DesenhaFoguete(void) { glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); glclear(gl_color_buffer_bit); glrotatef(20, 0.0f, 0.0f, 1.0f); Bico(); Corpo(); AsaEsquerda(); AsaDireita(); glflush(); Página 11
Escala Redimensiona o objeto segundo parâmetros fornecidos. Para efetuar uma escala usa-se o comando glscalef( x, y, z) que redimensiona o objeto. Se Sx = Sy = Sz, objeto manterá proporções relativas em x, y e z; Se (Sx=Sy=Sz) > 1 objeto será ampliado; Se (Sx=Sy, Sz) < 1 objeto será reduzido; Se os 3 valores forem distintos objeto será deformado. glscalef(0.5f,0.5f,0.5f);// reduz o tamanho do objeto à metade glbegin(gl_polygon); glvertex2f( xf, yf); glvertex2f( xf, yf); glvertex2f( xf, yf); glend(); Página 12
Escala void DesenhaFoguete(void) { glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); glclear(gl_color_buffer_bit); glscalef(0.5f, 0.5f, 1.0f); Bico(); Corpo(); AsaEsquerda(); AsaDireita(); glflush(); Página 13
void DesenhaFoguete(void) { glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); glclear(gl_color_buffer_bit); gltranslatef(3.0f, 2.0f, 0.0f); glscalef(0.5f, 0.5f, 1.0f); glrotatef(20, 0.0f, 0.0f, 1.0f); Bico(); Corpo(); AsaEsquerda(); AsaDireita(); glflush(); Página 14
void DesenhaFoguete(void) { glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); glclear(gl_color_buffer_bit); glscalef(0.5f, 0.5f, 1.0f); gltranslatef(3.0f, 2.0f, 0.0f); glrotatef(20, 0.0f, 0.0f, 1.0f); Bico(); Corpo(); AsaEsquerda(); AsaDireita(); glflush(); Página 15
void DesenhaFoguete(void) { glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); glclear(gl_color_buffer_bit); gltranslatef(3.0f, 2.0f, 0.0f); Bico(); glscalef(0.5f, 0.5f, 1.0f); Corpo(); glrotatef(20, 0.0f, 0.0f, 1.0f); AsaEsquerda(); AsaDireita(); glflush(); Página 16
As transformações em OpenGL são cumulativas; Isto ocorre porque uma transformação geométrica de OpenGL é armazenada internamente em uma matriz; Para evitar este efeito "cumulativo", é necessário utilizar as seguintes funções: glpushmatrix() Utilizada para empilhar a matriz de transformação corrente; glpopmatrix() Utilizada para desempilhar a matriz de transformação corrente do topo da pilha, substituindo a corrente. glloadidentity() Utilizada para zerar as transformações, a partir do carregamento da matriz identidade. Página 17
void DesenhaFoguete(void) { glclearcolor(1.0f, 1.0f, 1.0f, 1.0f); glclear(gl_color_buffer_bit); glpushmatrix(); //guarda matriz orig gltranslatef(3.0f, 2.0f, 0.0f); Bico(); glpopmatrix(); //chama matriz orig Bico(); glpushmatrix(); glrotatef(20, 0.0f, 0.0f, 1.0f); Corpo(); glpopmatrix(); glscalef(0.5f, 0.5f, 1.0f); Bico(); Corpo(); AsaEsquerda(); AsaDireita(); glflush(); Página 18
Pilha de Matrizes Hierarquia de objetos As vezes queremos construir objetos hierárquicos nos quais objetos complicados são construídos a partir de objetos mais simples. Por exemplo, Uma mesa ou; Um automóvel com 4 rodas onde cada uma delas é ligada ao carro com cinco parafusos; O corpo humano.
Pilha de Matrizes Hierarquia de objetos Tronco Coxa Canela Pé
Transformações Hieráquicas Ao movimentarmos o ombro, causa um movimento no braço. Ao movimentarmos o braço, a mão também irá se movimentar. Cria-se então uma hierarquia para construção de objetos complexos de uma maneira modular e a possibilidade de modificação completa ou por parte das estruturas dos seus componentes. Para essa manipulação, há a necessidade de acumular as transformações geométricas aplicadas de maneira a combiná-las para alcançar o resultado esperado. No OpenGl, essa acumulação e recuperação deve ser feita com as funções glpushmatrix e glpopmatrix.
Pilha de Matrizes Hierarquia de objetos glpushmatrix glpopmatrix Código Exemplo