Computa§£o Grfica

  • View
    18

  • Download
    0

Embed Size (px)

DESCRIPTION

Computação Gráfica. Geração de Geometria - Terrenos. Mapas de Alturas. Intensidade por pixel pode representar uma altura numa grelha regular. Terrenos a partir de Imagens. Objectivo: - PowerPoint PPT Presentation

Text of Computa§£o Grfica

  • DI-UM Computao Grfica 06/07*Mapas de AlturasIntensidade por pixel pode representar uma altura numa grelha regular

    DI-UM Computao Grfica 06/07

  • DI-UM Computao Grfica 06/07*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:

    Carregar a imagemCriar a geometria do terreno a partir da matriz de pixels extrada da imagem.Colocar todas as entidades do modelo na altura correcta

    DI-UM Computao Grfica 06/07

  • Carregar a Imagem - tgalibEm www.lighthouse3d.com disponibilizado cdigo para carregar TARGA (.TGA):

    tgaInfo * tgaLoad(char *filename);

    typedef struct {int status;unsigned char type, pixelDepth;short int width, height;unsigned char *imageData;}tgaInfo;DI-UM Computao Grfica 06/07*

    DI-UM Computao Grfica 06/07

  • DI-UM Computao Grfica 06/07*Alternativa: DevILhttp://openil.sourceforge.net/ A full featured cross-platform image library

    Abrir um ficheiro de imagem

    ilInit();

    ilGenImages(1,ima); // unsigned int ima[...]

    ilBindImage(ima[0]);ilLoadImage(filename); // char *filename

    DI-UM Computao Grfica 06/07

  • DI-UM Computao Grfica 06/07*Alternativa: DevIL

    Aceder aos dados e informaes da imagem

    int width = ilGetInteger(IL_IMAGE_WIDTH);

    int height = ilGetInteger(IL_IMAGE_HEIGHT);

    unsigned char *imageData = ilGetData();

    DI-UM Computao Grfica 06/07

  • DI-UM Computao Grfica 06/07*Alternativa: DevIL

    Converter para escala de cinzentos

    ilConvertImage(IL_LUMINANCE,IL_UNSIGNED_BYTE);

    outras opes: IL_RGB, IL_RGBA

    DI-UM Computao Grfica 06/07

  • DI-UM Computao Grfica 06/07*Alternativa: DevIL

    Exemplo para carregar uma imagem:

    unsigned int t;ilGenImages(1,&t);ilBindImage(t);ilLoadImage("bla.jpg");tw = ilGetInteger(IL_IMAGE_WIDTH);th = ilGetInteger(IL_IMAGE_HEIGHT);imgData = ilGetData();

    DI-UM Computao Grfica 06/07

  • Gerao de geometriaGerar o terreno como uma strip de tringulos, sendo y dados pelo valor do h-map no ponto (xt,zt) Origem (0,0) no centro do mundo e canto do H-MapAteno aos diferentes sistemas de eixosDI-UM Computao Grfica 06/07*

    DI-UM Computao Grfica 06/07

  • Gerao de geometriafor (z=0 ; z < MapL-1 ; z++) { glBegin(GL_TRIANGLE_STRIP); for (x=0 ; x < MapW ; x++) { glVertex3f (x0+x, Map[x][z+1], z0-(z+1)); glVertex3f (x0+x, Map[x][z], z0-z); } glEnd(); }DI-UM Computao Grfica 06/07*

    DI-UM Computao Grfica 06/07

  • Geometria: Display ListsConjunto de comandos pr-compilados que podem ser reutilizados:// Create the id for the display listterrainDL = glGenLists(1);// create the display listglNewList(terrainDL,GL_COMPILE); for (z=0 ; z < MapL-1 ; z++) { glBegin(GL_TRIANGLE_STRIP); for (x=0 ; x < MapW ; x++) { glVertex3f (x0+x, Map[x][z+1], z0-(z+1)); glVertex3f (x0+x, Map[x][z], z0-z); } glEnd(); } glEndList();

    DI-UM Computao Grfica 06/07*

    DI-UM Computao Grfica 06/07

  • Geometria: Display ListsNa funo que desenha a cena (ex., renderScene()) basta chamar a display list:glCallList (TerrainDL);

    Permite um aumento de desempenho significativo devido pr-compilao dos comandos de especificao da geometriaUma display list pode ser alterada executando de novo glNewList() .. glEndList()Uma display list pode ser removida com glDeleteLists()DI-UM Computao Grfica 06/07*

    DI-UM Computao Grfica 06/07

  • Geometria: terrain.cppO ficheiro terrain.cpp disponibiliza o esqueleto de cdigo para:Carregar o h-map a partir e um ficheiro (usando tgaLoad()) int terrainLoadImage (char *filename, int normals);Criar a display list devolvendo o seu ID int terrainCreateDL (float xOff, float yOff, float zOff);Dadas as coordenadas do mundo (x,z) devolver a respectiva altura de acordo com o height map float terrainGetHeight (float x, float z);DI-UM Computao Grfica 06/07*

    DI-UM Computao Grfica 06/07

  • DI-UM Computao Grfica 06/07*Exerccio

    Adapte a aplicao desenvolvida nas sesses anteriores para que:Carregue um height map e desenhe o terreno de acordo com estesPosicione os vrios elementos (indios, cowboys, arvores, tesouro) altura apropriadaA cmara mvel faa surface following, isto , se desloque ao longo da superfcie adaptando-se respectiva altura

    DI-UM Computao Grfica 06/07

  • Interpolao bilinearAs coordenadas no mundo so nmeros reais, as coordenadas no mapa de textura so inteiros (melhor, o h-map s est definido para coordenadas inteiras)

    Soluo: interpolao bilinearDI-UM Computao Grfica 06/07*(x,z)x1x2z1z2xFraczFrachbhax1 = int(x); xFrac = frac(x); x2 = x1+1;z1 = int(z); zFrac = frac(z); z2 = z1+1;ha = h(x1,z1)*(1-xFrac) + h(x2,z1)*xFrac;hb = h(x1,z2)*(1-xFrac) + h(x2,z2)*xFrac;h = h*(1-zFrac) + hb*zFrac;

    DI-UM Computao Grfica 06/07

  • MapeamentoNeste momento, a rea do terreno determinado pela resoluo do h-map. Modifique o cdigo de forma a que o utilizador possa indicar a resoluo pretendida para o terreno, invocando a funo terrainDim (int wWidth, int wLength);

    Note que para passar de coordenadas (x,z) do mundo para (xt, zt) do h-map dever aplicar a funo:DI-UM Computao Grfica 06/07*

    DI-UM Computao Grfica 06/07

    ********