Principal

Ver. 0.0

Ver. 0.1

Ver. 0.2

Ver. 0.2

Ver. Final

Versão 0.2: Iluminação

O código para a geração das fontes de Luz está na classe LuzView, que cria fontes do tipo spot. Foram criadas duas fontes dessas, uma em cada ponta da mesa.

As imagens abaixo mostram o efeito de cada uma dessas fontes:

A classe permite a especificação de várias opções, como ângulo do spot, coeficientes de atenuação, etc. Foi observado, entretanto, que o comportamento dessas fontes de luz não é muito bom quando colocadas perpendiculares a uma superfície grande como a face de um cubo. Se colocado em cima da mesa, com um ângulo pequeno, as esferas era iluminadas mas o plano não.

Finalmente, foi utilizada uma terceira fonte de luz, que é a luz ambiente. Com importância maior para o cenário, que está fora do ângulos desses spots.

Em termos de alterações as classes dos modelos, o mais importante foi criar funções para garantir que as normais das superfícies estão sempre voltadas para a direção certa. Isso é feito com um código mais ou menos como esse:

vetor1.x=coord2.x-coord1.x;
vetor1.y=coord2.y-coord1.y;
vetor1.z=coord2.z-coord1.z;
vetor2.x=coord3.x-coord2.x;
vetor2.y=coord3.y-coord2.y;
vetor2.z=coord3.z-coord2.z;
vetor3.cross(vetor1, vetor2);
vetor3.normalize();
vetor3.scale(normals[i]);
gl.glNormal3f(vetor3.x,vetor3.y,vetor3.z);

Basicamente, utiliza dois vetores criados pela diferenças entre as coordenadas passadas, faz o produto vetorial e normaliza. Nota que para isso funcionar é fundamental passar as coordendas de uma face sempre no sentido anti-horário.