Introdução
1. Modificações Preliminares
2. Iluminação
3. Tonalização de Gouraud
4. Chaveamento entre os Cenários
5. Luzes nos Navios
6. Download do Código Fonte
Conclusão
Com esse incremento, esta etapa deve conter um mecanismo lógico que permita o chaveamento entre os cenários diurno e noturno, o qual deverá ser feito por meio da correta manipulação das propriedades dos objetos de iluminação.
Além disso, quando o cenário estiver no período noturno, é desejado que os navios possuam um efeito luminoso, como se suas luzes estivessem acesas. Para tanto, é possível emular este efeito com diferentes técnicas, como definir fontes de luz dentro dos navios, ou indicar que uma parte do navio seja feito de um material emissor de luz.
Dessa forma, inicialmente será comentado sobre as mudanças feitas na versão anterior para permitir alcançar os objetivos desta etapa,
para em seguida mostrar os efeitos da iluminação, comentando sobre a implementação da tonalização de Gouraud. Na seqüência, o
mecanismo lógico que permite o chaveamento entre os cenários será apresentado e, por fim, será mostrado como foi produzido
o efeito das luzes dos navios.
Para isso, todas as funções que desenhavam cubos e esferas em formato aramado (glutWireCube() e glutWireSphere()), foram substituídas por funções que desenham cubos e esferas sólidas (glutSolidCube() e glutSolidSphere()), ou seja, o termo Wire foi substituído por Solid para que esses objetos possam ser pintados. Contudo, foi necessário também modificar um parâmetro da função glPolygonMode(), o qual anteriormente era GL_LINES e, nesta etapa, passou a ser GL_FILL, indicando que os polígonos possuem preenchimento.
Após isso, cada objeto que compõe um modelo de navio foi pintado de uma cor, tentando deixá-lo o mais próximo da realidade. Usou-se tons de cinza para as carcaças dos navios, um prata para as armas e azul para as cabines, tentando simular vidros.
Eis como ficaram os modelos após a pintura:
Além dessa pintura, e também já prevendo a terceira etapa do projeto (a qual consistirá na adição de texturas), os navios que são afundados foram rotacionados de um ângulo de 90º em relação ao eixo x, antes de serem desenhados na tela. Isto foi feito porque, com o uso de uma textura para o oceano, todas as embarcações desenhadas teriam uma metade escondida pelo mar e, desta nova forma, todo o navio ficará visível. Ou seja, enquanto na câmera original do jogo se tinha uma visão lateral dos navios, agora eles serão vistos de cima. A seguir esta diferença é ilustrada:
Tal iluminação pode ser feita em OpenGL pela adição de fontes de luz, definindo suas componentes (ambiente, difusa e especular), modelo e posicão. Em OpenGL, existe um limite de 7 fontes de luz que podem ser adicionadas a uma cena.
A implementação de um modelo de iluminação é feita basicamente com o uso das funções glLightfv() e glLightModelfv(), que atribuem os valores das componentes de uma fonte de luz, e também através da função glEnable(), que habilita vários recursos ligados a iluminção, como as próprias fontes de luz.
Nesta etapa foi utilizado apenas 1 fonte de luz, posicionada distante do tabuleiro, que tem o objetivo de dar novamente uma noção de profundidade, como também simular o efeito dos cenários diurno e noturno. A seguir são expostas as imagens dos 3 tipos de navio com iluminação.
Em OpenGL, é possível utilizar estes dois tipos de tonalização, modificando o parâmetro da função glShadeModel(), que recebe como parâmetro um indentificador que especifica a técnica a ser usada. A constante GL_FLAT deve ser usada para a tonalização constante e GL_SMOOTH para a tonalização de Gouraud.
A seguir, duas imagens do Destroyer serão expostas com as duas técnicas afim de ilustrar a visível diferença entre elas:
Nesta segunda imagem, as esferas dos canhões possuem um aspecto mais arrendondado.
A implementação deste chaveamento é bastante simples, sendo usado uma variável global de controle chamada dia. Se o conteúdo desta variável for 1, o cenário deve possuir um aspecto diurno e, caso seja 0, noturno. O valor da variável dia é modificado a cada vez que a tecla n for pressionada.
A seguir é ilustrado ambos os cenários:
Em todos os navios, o cubo mais acima no modelo foi feito com objeto de ser a cabine da embarcação, o qual foi pintado com a cor azul. Desta forma, com o cenário é noturno, este cubo recebe um alto fator emissivo, do tipo RGBA, que faz com que ele possua uma cor amarela fosforescente, simulando uma lâmpada acesa.
A seguir será mostrado os 3 modelos com as cabines acesas:
Eis algumas telas do jogo:
Além disso, é interessante observar que a biblioteca OpenGL possui vários recursos luminosos, pois além de permitir a definição de até 7 fontes de luz, ainda é possível adicionar propriedades emissoras de luz aos materiais que compõem os modelos geométricos, fazendo com que a limitação do número de fontes possa ser contornada.