Computação Gráfica LEI / LCC Departamento de Informática Universidade do Minho Geração de Geometria - Terrenos Imagens e Texturas António Ramires Fernandes Computação Gráfica 09/10
Mapas de Alturas Intensidade por pixel pode representar uma altura numa grelha regular 2
Terrenos a partir de Imagens Objectivo: Dada uma imagem criar uma grelha regular em que a altura de cada ponto da grelha corresponde à intensidade do pixel correspondente. Tarefas: Y Carregar a imagem Criar a geometria a partir da matriz de pixels extraída da imagem. X Z 3
Terrenos a partir de Imagens Primeiro passo: Construir uma grelha regular com altura 0.0 com as dimensões da imagem Y X Z 4
Terrenos a partir de Imagens Segundo Passo: Atribuir as alturas de acordo com os dados da imagem (atenção às árvores) 5
DevIL Abrir um ficheiro de imagem ilinit(); ilgenimages(1,ima); // unsigned int ima[...] ilbindimage(ima[0]); illoadimage((ilstring)filename); // char *filename 6
DevIL Aceder aos dados e informações da imagem int width = ilgetinteger(il_image_width); int height = ilgetinteger(il_image_height); unsigned char *imagedata = ilgetdata(); 7
DevIL Converter para escala de cinzentos ilconvertimage(il_luminance,il_unsigned_byte); outras opções: IL_RGB, IL_RGBA 8
Textura Objectivo: Colocar uma textura na superfície do terreno Carregar uma imagem e criar uma textura definir coordenadas para a aplicação da textura 9
DevIL + OpenGL Exemplo para criar textura a partir de uma imagem: unsigned int t, tw, th; unsigned char *texdata; ilgenimages(1,&t); ilbindimage(t); illoadimage((ilstring) relva1.jpg"); tw = ilgetinteger(il_image_width); th = ilgetinteger(il_image_height); ilconvertimage(il_rgba, IL_UNSIGNED_BYTE); texdata = ilgetdata(); glgentextures(1,&texid); // unsigned int texid - variavel global; glbindtexture(gl_texture_2d,texid); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_S, GL_REPEAT); gltexparameteri(gl_texture_2d, GL_TEXTURE_WRAP_T, GL_REPEAT); gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glteximage2d(gl_texture_2d, 0, GL_RGBA, tw, th, 0, GL_RGBA, GL_UNSIGNED_BYTE, texdata); 10
Texturas Activar Texturas (inicialização): glenable(gl_texture_2d); Antes de desenhar o terreno: glbindtexture(gl_texture_2d, texid); Ao desenhar o terreno, definir para cada vértice as coordenadas de textura: gltexcoord2f(s,t); Após desenhar o terreno: glbindtexture(gl_texture_2d, 0); 11
Exercício Dada uma imagem, interpretá-la como um mapa de alturas e gerar a geometria correspondente Aplicar uma textura (outra imagem) ao terreno; Colocar as árvores na altura correcta TPC: Definir normais e activar a iluminação; TPC: Implementar um esquema de surface following. 12
Surface Following Problema: determinar a altura do ponto (x,z) de uma grelha. Y Sendo h(i,j) a função que determina a altura nos vértices da grelha, é necessário determinar a altura do ponto (x,z) a partir dos cantos da célula onde o ponto se encontra (x,z) X Z 13
Surface Following Através da função h temos acesso às alturas dos cantos da célula (pontos amarelos). a altura de (x11,z12) obtem-se por interpolação linear das alturas de (x1,z1) e (x1,z2). Processo semelhante para determinar a altura de (x22,z12). (x1,z1) (x2,z1) seja fz a parte fraccionária de z: fz = z - z1; // 0 <= fz <= 1 (x11,z12) (x,z) (x22,z12) alt(x11,z12) = h(x1,z1) * (1-fz) + h(x1,z2) * fz alt(x22,z12) = h(x2,z1) * (1-fz) + h(x2,z2) * fz A altura de (x,z) obtem-se por interpolação entre as alturas de (x11,z12) e (x22,z12) (x1,z2) (x2,z2) alt(x,z) = alt(x11,z12) * (1 - fx) + alt(x22,z12) * fx 14
Normais numa Grelha O cálculo da normal dentro de uma grelha pode ser realizado de uma forma simples recorrendo aos pontos vizinhos O N S E Considerando os 4 vizinhos (N,S,E,O), calculam-se dois vectores. O produto externo (normalizado) destes dois vectores é uma aproximação à normal pretendida. 15