Versão 0.2 - Modelagem e Iluminação

Modelagem 3D Studio Max

     A geometria simples obtida como resultado da versão 0.1 incentivou o uso de programas como o 3D Studio Max (3DSmax) para realizar a modelagem da mesa e outros objetos que compõe a cena. O 3DSmax é um programa que permite modelar objetos 3D, bem como aplicar texturas e modelos de iluminação, entretanto este foi utilizado apenas para modelar a mesa e outros objetos.
     A modelagem foi feita a partir de primitivas como cubos, cilindros e cones que sofreram subtrações, uniões e interseções para formarem algum objeto como a mesa de sinuca mostrada na figura 2.


Figura 2. Mesa no software 3D Studio Max.

     O programa 3DSmax foi escolhido principalmente por sua facilidade de exportar os produtos gerados para arquivos OBJ. OBJ são arquivos de texto onde está definida a geometria do objeto como seus vértices, coordenadas de textura associadas aos vértices, normal em cada vértice e faces que formam os polígonos:

# Primeiro vértice com coordenada (x,y,z):
v 0.123 0.234 0.345
v ...
...
#Coordenadas de Textura:
vt ...
...
#Normal na forma (x,y,z):
vn ...
..
#Cada face é definida pelo índice de vértice/textura/normal que o precede
#coordinate array that precedes this.
#Assim, f 1/1/1 2/2/2 3/3/3 é um triângulo com coordenadas de textura e #normal nos três vértices.
O 1 representa o vértice 1 da lista “v”, #coordenada de textura 2 da lista “vt” e a normal 3 da lista “vn”

f v0/vt0/vn0 v1/vt1/vn1 ...
f ...
...

     Entretanto, o formato OBJ não é um formato aceito diretamente pelo OpenGL, assim a conversão deste formato é feita utilizando no código do programa a biblioteca “glm.h” (http://home.no/uematsuhome/downloads/vfc/vfcv2.zip). Para carregar o objeto, deve-se chamar a função drawmodel:

GLMmodel* drawmodel(char *string, char *type)
{
    GLMmodel* pmodel = NULL;
    if (!pmodel) {
        pmodel = glmReadOBJ(string);
        if (!pmodel) exit(0);
        glmFacetNormals(pmodel);
        glmVertexNormals(pmodel, 0);

    }    

return pmodel;
}

// Carregando lista de objetos... glNewList(lista_sala, GL_COMPILE); glPushMatrix(); //Carrega o objeto: pmodel1=drawmodel("modelos/mesa1.obj","texture"); glmDraw(pmodel1, GLM_TEXTURE | GLM_SMOOTH ); glPopMatrix(); glEndList();

      O resultado do carregamento do arquivo .obj no C++/opengl utilizando a função acima é mostrado na figura 3.


Figura 3. Arquivo .obj da mesa carregado no C++/opengl.

Iluminação

     O modelo de iluminação foi gerado através da função luzes(), onde são definidas as luzes ambiente, difusa e especular:

void luzes(void)
{
//Luz ambiente:
 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, vermelho);
//Define como o ângulo reflexão é calculado:
 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_FALSE);
//Define iluminação calculada para os 2 lados do polígono:
 glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE);

  // Definição das luzes

//Luz Ambiente: 
 glLightfv (GL_LIGHT0, GL_AMBIENT,branco);
// Componente difusa:
 glLightfv (GL_LIGHT0, GL_DIFFUSE, branco);
//Componente especular:
 glLightfv (GL_LIGHT0, GL_SPECULAR, branco);
//Define posição da luz 0:
 glLightfv (GL_LIGHT0, GL_POSITION, Posicao_Luz0);
//Habilita iluminação:
 glEnable(GL_LIGHTING);
//Habilita luz 0:
 glEnable(GL_LIGHT0);
}

     A posição e cor das luzes são definidas por:
GLfloat Posicao_Luz0[]  = { 10.0, 50.0, 0.0, 1.0};
GLfloat branco[]      = { 1.0, 1.0, 1.0 };
GLfloat amarelo[]     = { 1.0, 1.0, 0.0 };

     A idéia inicial de iluminação era utilizar a luz spot, projetando-a sobre o centro da mesa, criando assim um ambiente mais escuro com foco na mesa. Entretanto, a geometria da mesa que contém poucos vértices (e poucas normais associadas a estes) não favoreceu o efeito deste tipo de luz que faz uso da interpolação dos vetores normais, que estavam fora do alcance da luz, deixando o tampo da mesa escuro, com efeito indesejado. Sendo assim, este tipo de iluminação não foi utilizado. A figura 4 ilustra a mesa com a função luz() definida.

Figura 4. Iluminação aplicada a cena.