Universidade Federal do Vale do São Francisco Curso de Engenharia da Computação Computação Gráfica OpenGL 05 3D Prof. Jorge Cavalcanti jorge.cavalcanti@univasf.edu.br www.univasf.edu.br/~jorge.cavalcanti www.twitter.com/jorgecav
Visualização em 3D Para visualizar uma determinada cena em 3D é análogo a tirar uma fotografia com uma máquina fotográfica, o que inclui os seguintes passos: Arrumar o tripé e posicionar a câmera para fotografar a cena. (LookAt). Arrumar a cena para ser fotografada, incluindo ou excluindo objetos/pessoas. Equivalente à etapa de modelagem (inclui as transformações geométricas, gltranslatef, glscalef, glrotatef, e o desenho dos objetos); Página 2
Visualização em 3D Posição da Câmera e para onde ela está direcionada: glulookat(eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z); up_x, up_y, up_z Indicam o vetor que aponta para o lado de cima do objeto Página 3
Visualização em 3D Para visualizar uma determinada cena em 3D... (cont.). Escolher a lente da câmera ou ajustar o zoom Equivalente a especificar as transformações de projeção. gluperspective(ângulo, aspecto, perto, longe); glortho(esquerda, direita, baixo, cima, perto, longe); Página 4
Visualização em 3D Para visualizar uma determinada cena em 3D... (cont.). Determinar o tamanho final da foto (maior ou menor); Equivalente a especificar a viewport, informando como parâmetros o canto inferior esquerdo, a largura e a altura da janela. glviewport(0, 0, largura, altura) Página 5
Visualização em 3D A OpenGl mantém matrizes de transformação ModelView, Projection e ViewPoint, para transformar qualquer ponto dado em um ponto na janela de visualização (ortho ou perspective). O comando glmatrixmode deverá ser utilizado antes dos comandos que especificam a forma da projeção. (GL_PROJECTION) avisa a OpenGL que todas as futuras alterações, tais como operações de escala, rotação e translação, irão afetar a "câmera" (ou observador). (GL_MODELVIEW) - avisa a OpenGL que todas as futuras alterações, tais como operações de escala, rotação e translação, irão afetar os modelos da cena (=o que é desenhado). A função glloadidentity(); chamada em seguida, faz com que a matriz corrente seja inicializada com a matriz identidade (nenhuma transformação é acumulada). Página 6
Visualização em 3D Exemplo: // Especifica sistema de coordenadas de projeção glmatrixmode(gl_projection); // Inicializa sistema de coordenadas de projeção glloadidentity(); // Especifica a projeção perspectiva // (angulo, aspecto, zmin, zmax) gluperspective(angle,faspect,0.5,1000); // Especifica sistema de coordenadas do modelo glmatrixmode(gl_modelview); // Inicializa sistema de coordenadas do modelo glloadidentity(); gltranslatef(-obsx,-obsy,-obsz); glrotatef(rotx,1,0,0); glrotatef(roty,0,1,0); http://migre.me/mwqmp Página 7
Primitivas 3D no OpenGL A biblioteca GLUT também possui diversas funções para desenhar objetos 3D. Ex: glutwireteapot(gldoouble size), glutwirecube(gldouble size); glutwiresphere(gldouble radius, GLint slices, GLint stacks). Todas estas funções também podem ser usadas para desenhar objetos sólidos, ao invés de exibir apenas o seu wire-frame. Para isto, basta substituir a substring Wire do nome da função por Solid. Por exemplo, se substituirmos a chamada à função glutwireteapot(50.0f) por glutsolidteapot(50.0f) Exemplo1 - http://migre.me/mwr3j Exemplo2 - http://migre.me/mwrew Página 8
Primitivas 3D no OpenGL Esferas void glutsolidsphere(gldouble radius, GLdouble slices, GLdouble stack ) void glutwiresphere(gldouble radius, GLdouble slices, GLdouble stack) void glutsolidcube (GLdouble size ) void glutwirecube (GLdouble size) Cubos Cones void glutsolidcone(gldouble base, GLdouble height, Glint slices, Glint stacks) void glutwirecone(gldouble base, GLdouble height, Glint slices, Glint stacks) Torus void glutsolidtorus(gldouble innerradius, GLdouble outerradius, Glint nsides, Glint rings) void glutwiretorus(gldouble innerradius, GLdouble outerradius, Glint nsides, Glint rings) Página 9
Primitivas 3D no OpenGL Os parâmetros slices e stacks que aparecem no protótipo de algumas funções, significam, respectivamente, o número de subdivisões em torno do eixo z (como se fossem linhas longitudinais) e o número de subdivisões ao longo do eixo z (como se fossem linhas latitudinais). Já rings e nsides correspondem, respectivamente, ao número de seções que serão usadas para formar o torus, e ao número de subdivisões para cada seção. Ver Exemplo padrão do Dev C++ (Criar um projeto novo do tipo multimídia, glut). Página 10
Primitivas 3D no OpenGL Dodecaedro FIGURA Tetraedro FIGURA void glutsoliddodecahedron () void glutsolidtetrahedron() void glutwiredodecahedron () void glutwiretetrahedron() Icosaedro FIGURA Teapot FIGURA void glutsolidicosahedron() void glutsolidteapot (GLdouble size); void glutwireicosahedron() void glutwireteapot (GLdouble size); Página 11
Z-Buffer Z-buffer Buffers são áreas reservadas de memória utilizadas para determinados propósitos. Em aplicações de animação, por exemplo, o double-buffer permite que as sucessivas renderizações sejam feitas de modo suave, sem o efeito indesejável de piscar entre cada atualização da janela de visualização. O z-buffer é bastante comum em aplicações gráficas e é utilizado para calcular a distância do observador e remover superfícies ou partes ocultas de objetos sobrepostos. glutinitdisplaymode(glut_double GLUT_RGB GLUT_DEPTH) Página 12
Iluminação em OpenGl Definindo os modelos de tonalização (Flat e Gouraud) glshademodel(glenum mode); GL_FLAT A cor não varia GL_SMOOTH Gouraud, calcula a cor a partir de cada vértice. A luz é dividida em quatro componentes que juntas formam o modelo de iluminação Ambiente luz que vem de todas as direções Difusa luz direcional que é ao atingir uma superfície é refletida em todas as direções Especular - luz direcional que é ao atingir uma superfície tende a refletir em uma única outra direção Emissiva simula a luz que se origina em um objeto. Não é interferida nem interfere no modelo de iluminação Página 13
Iluminação em OpenGl A iluminação é resultado das propriedades especificadas para as fontes de luz e das propriedades dos materiais que constituem os objetos Fontes de Luz gllightmodefv(glenum pname, TYPE *param) void gllightfv(glenum light, GLenum pname, TYPE *param); Objetos void glmaterialfv(glenum face, GLenum pname, TYPE *param); Página 14
Iluminação em OpenGl Propriedades do modelo da iluminação void gllightmodelfv(glenum pname, TYPE *param); pname define a característica do modelo de iluminação (valores abaixo) param vetor Glfloat com os valores do tipo especificado em pname Constante GL_LIGHT_MODEL_AMBIENT GL_LIGHT_MODEL_LOCAL_VIEWER GL_LIGHT_MODEL_TWO_SIDE GL_LIGHT_MODEL_COLOR_CONTROL Significado Intensidade ambiente RGBA de toda cena. Como é feito o processamento dos ângulos de reflexão especular Escolha entre a iluminação de um lado ou dos dois lados da face. Indica quando a reflexão especular é processada separadamente da ambiente e da difusa. Página 15
Iluminação em OpenGl Propriedades da fonte de luz void gllightfv(glenum light, GLenum pname, TYPE *param); ligth fonte de luz desejada. GL_LIGHT0 a GL_LIGHT7 pname característica da luz a ser especificada param vetor Glfloat com os valores do tipo especificado em pname Constante Valor default Significado GL_AMBIENT (0.0,0.0,0.0,1.0) Cor ambiente da luz GL_DIFFUSE (1.0,1.0,1.0,1.0) Cor difusa da luz GL_SPECULAR (1.0,1.0,1.0,1.0) Cor especular da luz GL_POSITION (0.0,0.0,1.0,0.0) Posição da luz GL_SPOT_DIRECTION (0.0,0.0,-1.0) Direção da luz spot GL_SPOTCUTOFF 180.0 Ângulo de corta da luz spot Página 16
Iluminação em OpenGl Propriedades de iluminação do material void glmaterialfv(glenum face, GLenum pname, TYPE *param); face quais faces do objeto estão sendo especificadas. GL_FRONT, GL_BACK ou GL_FRONT_AND_BACK pname propriedade do material a ser especificada param vetor Glfloat com os valores da propriedade especificada. Constante (Pname) Valor default Significado GL_AMBIENT (0.2,0.2,0.2,1.0) Cor ambiente do material GL_DIFFUSE (0.8,0.8,0.8,1.0) Cor difusa do material GL_SPECULAR_AND_DIFFUSE (RGBA) Cor ambiente e especular do material GL_SPECULAR (0.0,0.0,0.0,1.0) Cor especular do material GL_SHININESS 0.0 Expoente especular (brilho na superfície) GL_EMISSION (0.0,0.0,0.0,1.0) Cor emissiva do material (luz própria) Página 17
Iluminação em OpenGl Exemplo3DComIluminacao.cpp void Inicializa (void) { // Habilita a definição da cor do material a partir da cor corrente glenable(gl_color_material); //Habilita o uso de iluminação glenable(gl_lighting); // Habilita a luz de número 0 glenable(gl_light0); // Habilita o depth-buffering (z-buffer) glenable(gl_depth_test); } // Habilita o modelo de colorização de Gouraud glshademodel(gl_smooth);... Página 18
Iluminação em OpenGl void DefineIluminacao (void) { GLfloat luzambiente[4]={0.2,0.2,0.2,1.0}; GLfloat luzdifusa[4]={0.7,0.7,0.7,1.0}; // "cor" GLfloat luzespecular[4]={1.0, 1.0, 1.0, 1.0};// "brilho" GLfloat posicaoluz[4]={0.0, 50.0, 50.0, 1.0}; // Capacidade de brilho do material GLfloat especularidade[4]={1.0,1.0,1.0,1.0}; GLint especmaterial = 60; Página 19
Iluminação em OpenGl // Define a refletância do material glmaterialfv(gl_front,gl_specular, especularidade); // Define a concentração do brilho glmateriali(gl_front,gl_shininess,especmaterial); // Ativa o uso da luz ambiente gllightmodelfv(gl_light_model_ambient, luzambiente); } // Define os parâmetros da luz de número 0 gllightfv(gl_light0, GL_AMBIENT, luzambiente); gllightfv(gl_light0, GL_DIFFUSE, luzdifusa ); gllightfv(gl_light0, GL_SPECULAR, luzespecular ); gllightfv(gl_light0, GL_POSITION, posicaoluz ); Página 20
Iluminação em OpenGl void Desenha(void) // Limpa a janela de visualização com a cor // de fundo definida previamente glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); // Chama a função que especifica os parâmetros de iluminação DefineIluminacao(); // Altera a cor do desenho para azul glcolor3f(0.0f, 0.0f, 1.0f); // Função da GLUT para fazer o desenho de um "torus" // com a cor corrente glutsolidtorus(20.0, 35.0, 20, 40); // Executa os comandos OpenGL glutswapbuffers(); } Código exemplo - http://migre.me/1nnch Página 21