Versão 0.2

Esta corresponde à segunda versão de código do jogo, em que foi implementado o uso de um modelo de iluminação e modelo de tonalização de Gouraud nos objetos. Além disso, também está presente um HUD gráfico funcional que disponibiliza informações dos parâmetros do disparo para o jogador, tais como a força do disparo e o projétil selecionado, além do placar atual.

Nesta versão foram incluídos à cena modelos no formato Wavefront/OBJ, que permitem utilizar em um mesmo modelo 3D diferentes propriedades de material em algumas porções do modelo, fazendo com que se tornem mais reais. Um arquivo OBJ é bastante similar a um arquivo VTK, como pode ser visto no exemplo:

mtllib casa.mtl

g 3D_Object1
v -78.403130 -24.195341 -198.344818
v -121.019264 -24.195341 -198.344818
v -121.019264 -67.094040 -198.344818
v -78.403130 -67.094040 -198.344818
(...)
vn -0.915527 -0.004036 -0.791260
vn -0.915527 -22.995216 -0.541954
vn -0.058411 -0.004036 -0.801178
vn -0.915527 -0.014709 0.382172
(...)
usemtl Glass
f 279 273 278
f 273 279 274
f 280 274 279
f 274 280 275
(...)
usemtl Material A1
f 1702 1698 1697
f 1701 1702 1697
f 1703 1699 1698
(...)

Na primeira linha pode-se ver a referência que um arquivo OBJ faz a outro tipo de arquivo associado, um arquivo com extensão mtl, em que são feitas as definições das propriedades de todos os materiais utilizados no modelo 3D. Uma parte de um arquivo mtl é reproduzida a seguir:

newmtl Glass
Ka 0.117647 0.117647 0.117647
Kd 0.796078 0.733333 0.733333
Ks 0.752941 0.752941 0.752941
Ns 8
(...)

Existe uma entrada desse tipo para cada material do modelo. Pode-se ver que é definido o nome do material (que é referenciado no arquivo OBJ pelo uso da palavra 'usemtl', como se pode ver no arquivo OBJ acima) e suas constantes ambiente, difusa e especular para R, G e B, além do coeficiente 'n' especular que determina o brilho.

Voltando ao arquivo OBJ, após o material é definido o nome do modelo representado e, em seguida, seus dados, até o fim do arquivo. Se a linha começa com 'v', os dados subseqüentes dizem respeito a informações de um vértice; se começa com 'vn', são dados da normal de um vértice; se começa com 'usemtl', indica que as faces subseqüentes devem usar o material indicado; e, finalmente, se começa por 'f', a linha apresenta dados referentes a uma face do objeto, e os valores são índices dos vértices já definidos, de maneira similar ao arquivo VTK.

O loader desenvolvido determina se as informações referentes às normais dos vértices estão presentes no arquivo. Caso não estejam, as normais interpoladas nos vértices são calculadas, da mesma maneira que o loader VTK faz.

Os materiais de objetos como o tanque e o terreno ainda são provisórios, pois serão utilizadas texturas na próxima etapa do projeto. Os objetos carregados de arquivo OBJ, como os alvos e a casa, utilizam os materiais também carregados dos próprios arquivos, como se pôde ver no exemplo acima.

Outra nova funcionalidade desta versão é a engine de clima, que controla as condições globais de iluminação, chaveando entre o dia e a noite automaticamente. Uma esfera que representa o sol gira acima do cenário, descrevendo o deslocamento da fonte de luz principal que incide sobre todos os objetos. Cada um dos alvos possui sua própria luz, que simula a lanterna de um carro, e o tanque também tem um farol que pode ser ligado e desligado pelo usuário. As luzes dos alvos foram definidas com os seguintes parâmetros:

Cutt-off = 30
Constant Attenuation = 1
Quadratic Attenuation = 0.001
Ambient = BLACK
Difuse = WHITE
Specular = WHITE

Alguns outros destaques desta versão incluem:

Interação do tanque com o terreno

De acordo com o desnivelamento do terreno o tanque sobre transformações reproduzindo uma impressão de que o movimento do tanque acompanha os níveis do terreno. Este efeito é realizado em 3 etapas:

  1. Encontrar o vértice sobre o qual modelo está posicionado.
  2. Deslocar o modelo para posicioná-lo sobre o terreno, de modo que ele não fique 'flutando' ou 'enterrado' no modelo do terreno.
  3. Rotaciona o objeto num eixo perpendicular a normal da superfície do terreno.

Para encontrar o vértice correto é aplicado um algoritmo para encontrar o vértice do terreno mais próximo à posição do tanque. Esse algoritmo é otimizado para caso uma vez encontrada a posição mais próxima, as próximas posições estarão ao redor deste vértice como mostra a figura:

Em azul está a posição do tanque, em amarelo o vértice mais próximo e em verde o caminho para encontrar o vértice. No passo 2, obtemos a normal e rotacionamos o objeto para que ele fique perpendicular com a normal, é feita uma projeção da normal em uma esfera e a partir da esfera é possivel obter ângulos Phi e Theta para a rotação do tanque no eixo encontrado.

Detecção de colisões entre os objetos

Para a implementação da detecção da ocorrência de colisões entre os objetos da cena foi utilizada a técnica de volumes envoltórios esféricos. Cada objeto representado na cena está associado a uma esfera com centro no centróide do objeto e com raio igual à distância entre o centróide do objeto e o ponto do objeto mais distante do centróide (com um fator de escala aplicado para reduzir um pouco esse raio para que o volume não seja muito maior que o objeto caso este apresente uma dimensão bem maior que as outras).

Desta forma o problema de detecção de colisão se torna bem simples, uma vez que para realizar o teste basta checar se a distância entre os centróides de dois objetos é maior que a soma dos raios de suas respectivas esferas envoltórias. Se a distância é menor, os dois objetos colidiram. Essa relação pode ser vista na figura a seguir:

Alguns bugs e funcionalidades não terminadas na primeira versão já estão disponíveis, tais como o HUD já citado, verificação de colisão do tanque com os outros objetos do cenário, o tanque não mais se movimenta além dos limites do terreno e melhorias na detecção de colisão dos projéteis com os objetos.

Alguns problemas já conhecidos ainda permanecem por resolver, tal como a rotação incorreta dos projéteis em algumas situações de lançamento. Estes detalhes, assim como melhorias na jogabilidade e na interação com o usuário serão finalmente terminados na próxima versão do projeto a ser entregue.

Uma novidade importante desta versão é a possibilidade de executar o jogo a partir do web browser, utilizando o Java Web Start. Não é necessário rodar nenhuma aplicação, basta clicar no link fornecido na página de downloads e escolher a opção "Abrir com..." (desde que o Java Web Start esteja instalado), que os arquivos necessários serão baixados e executados automaticamente. Nem mesmo o JOGL precisa estar presente na m&aaacute;quina; caso não esteja, será baixado junto com o restante dos arquivos.

Vídeo de demonstração

Também está disponível um vídeo de demonstração da versão 0.2 do projeto em execução. Para visualizá-lo, basta clicar no botão Play na janela abaixo:

No vídeo podem ser observadas as novas funcionalidades: as condições de iluminação que variam automaticamente, o HUD em que é mostrada a força do disparo e o projétil atualmente utilizado, os novos modelos em formato Wavefront/OBJ que representam mais realisticamente os objetos, etc.

Download

Para baixar o código fonte da versão mais recente do projeto, visite a págine de downloads. Na página de downloads também está disponível o link para executar o jogo através do Java Web Start.

Screenshots desta versão

Seguem mais algumas imagens capturadas do projeto em execução em seu estado atual:

Modelo de casa em formato Wavefront/OBJ iluminado e com modelo de tonalização de Gouraud

Exemplo de modelo de alvo utilizado

Na página de screenshots podem ser encontradas várias outras imagens desta fase do desenvolvimento do projeto.